-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMakefile
More file actions
105 lines (78 loc) · 3.19 KB
/
Makefile
File metadata and controls
105 lines (78 loc) · 3.19 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
SHELL = /usr/bin/bash
.SUFFIXES:
.DELETE_ON_ERROR:
# Directory structure
DEPS_DIR = deps
SRC_DIR = src
INCLUDE_DIR = include
TEST_DIR = test
SCRIPT_DIR = scripts
SAMPLE_DIR = data/sample
# Compiler
CC = gcc
# Flags
DEFS = _GNU_SOURCE AST_ENABLE_IO_XML AST_ENABLE_IO_JSON
CFLAGS = -g -Wall -Wextra -std=c11 -fpermissive -fsanitize=address -fsanitize=undefined -fPIC $(DEFS:%=-D%)
LDFLAGS = -fsanitize=address -fsanitize=undefined -Wl,-rpath=.:$(CJSON_DIR)
FLEX_FLAGS = --perf-report
BISON_FLAGS = -Wdangling-alias
# Core files
PARSER_Y = parser.y
SCANNER_L = scanner.l
# Dependencies
CJSON_DIR = $(DEPS_DIR)/cJSON
LIBPARSE = libparse
LIBAST = libast
LIBCJSON = libcjson
# Targets
TARGET_STATIC_COMPILER = compiler-static
TARGET_STATIC_LIBPARSE = $(LIBPARSE).a
TARGET_STATIC_LIBAST = $(LIBAST).a
TARGET_STATIC_LIBCJSON = $(LIBCJSON).a
TARGET_SHARED_COMPILER = compiler
TARGET_SHARED_LIBPARSE = $(LIBPARSE).so
TARGET_SHARED_LIBAST = $(LIBAST).so
TARGET_SHARED_LIBCJSON = $(LIBCJSON).so
LIBAST_OBJECTS = ast.o ast_io.o ast_ser.o ast_deser.o hashtab.o dynstr.o
LIBPARSE_OBJECTS = scanner.o parser.o parse.o dynstr.o
COMPILER_OBJECTS = options.o dynstr.o main.o misc.o
PARSER_C = $(SRC_DIR)/$(PARSER_Y:%.y=%.c)
PARSER_H = $(INCLUDE_DIR)/$(PARSER_Y:%.y=%.h)
SCANNER_C = $(SRC_DIR)/$(SCANNER_L:%.l=%.c)
SCANNER_H = $(INCLUDE_DIR)/$(SCANNER_L:%.l=%.h)
OBJECTS = $(SOURCES:$(SRC_DIR)/%.c=%.o)
SOURCES = $(wildcard $(SRC_DIR)/*.c)
TARGETS = $(wildcard *.a) $(wildcard *.so) $(TARGET_SHARED_COMPILER) $(TARGET_STATIC_COMPILER)
CFLAGS += -I$(INCLUDE_DIR) -I$(CJSON_DIR) -I/usr/include/libxml2
LDFLAGS += -L. -L$(CJSON_DIR)
# TODO only add if they don't exist
OBJECTS += $(PARSER_C:$(SRC_DIR)/%.c=%.o)
OBJECTS += $(SCANNER_C:$(SRC_DIR)/%.c=%.o)
all: $(TARGET_SHARED_COMPILER)
remake: clean all
clean:
rm -rf $(PARSER_C) $(PARSER_H) $(SCANNER_C) $(SCANNER_H) $(OBJECTS) $(TARGETS)
$(TARGET_STATIC_LIBCJSON):
$(MAKE) -C $(CJSON_DIR)
$(TARGET_STATIC_LIBAST): $(LIBAST_OBJECTS)
ar rcs $@ $^
$(TARGET_STATIC_LIBPARSE): $(LIBPARSE_OBJECTS)
ar rcs $@ $^
$(TARGET_STATIC_COMPILER): $(COMPILER_OBJECTS) $(TARGET_STATIC_LIBPARSE) $(TARGET_STATIC_LIBAST) $(TARGET_STATIC_LIBCJSON)
$(CC) $(CFLAGS) $(COMPILER_OBJECTS) $(LDFLAGS) -o $@ -lxml2 -l:$(TARGET_STATIC_LIBPARSE) -l:$(TARGET_STATIC_LIBAST) -l:$(TARGET_STATIC_LIBCJSON)
$(TARGET_SHARED_LIBCJSON):
$(MAKE) -C $(CJSON_DIR)
$(TARGET_SHARED_LIBAST): $(LIBAST_OBJECTS) $(TARGET_SHARED_LIBCJSON)
$(CC) $(CFLAGS) $(LIBAST_OBJECTS) $(LDFLAGS) -o $@ -l:$(TARGET_SHARED_LIBCJSON) -shared
$(TARGET_SHARED_LIBPARSE): $(LIBPARSE_OBJECTS) $(TARGET_SHARED_LIBAST)
$(CC) $(CFLAGS) $(LIBPARSE_OBJECTS) $(LDFLAGS) -o $@ -l:$(TARGET_SHARED_LIBAST) -shared
$(TARGET_SHARED_COMPILER): $(COMPILER_OBJECTS) $(TARGET_SHARED_LIBPARSE) $(TARGET_SHARED_LIBAST)
$(CC) $(CFLAGS) $(COMPILER_OBJECTS) $(LDFLAGS) -o $@ -l:$(TARGET_SHARED_LIBPARSE) -l:$(TARGET_SHARED_LIBAST)
$(PARSER_C) $(PARSER_H): $(PARSER_Y)
bison -o $(PARSER_C) --header=$(PARSER_H) $(BISON_FLAGS) $(PARSER_Y)
$(SCANNER_C) $(SCANNER_H): $(SCANNER_L) $(PARSER_H)
flex -o $(SCANNER_C) --header-file=$(SCANNER_H) $(FLEX_FLAGS) $(SCANNER_L)
$(OBJECTS): %.o: $(SRC_DIR)/%.c
$(CC) $(CFLAGS) -c $< -o $@
# Phony targets (no output)
.PHONY: all remake clean test