-
-
Notifications
You must be signed in to change notification settings - Fork 44
/
Copy pathMakefile
177 lines (138 loc) · 4.21 KB
/
Makefile
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
GWION_PACKAGE=gwion
ifeq (,$(wildcard util/Makefile))
$(warning "missing git submodules, please run:")
$(error "git submodule update --init --recursive")
endif
ifeq (,$(wildcard util/config.mk))
$(shell cp util/config.mk.orig util/config.mk)
endif
ifeq (,$(wildcard config.mk))
$(shell cp config.mk.orig config.mk)
endif
include util/config.mk
include config.mk
SEVERITY ?= 10
GWION_TEST_DIR ?= /tmp
test_dir_all := $(wildcard tests/*)
test_ignore = tests/plug test/driver tests/module
test_dir := $(filter-out $(test_ignore), $(test_dir_all))
test_dir += examples
src := $(wildcard src/*.c)
src += $(wildcard src/*/*.c)
CFLAGS += -Iutil/include -Iast/include -D_GNU_SOURCE
CFLAGS += -Ifmt/include
# add commit hash to version for now
CFLAGS += -DGWION_VERSION="\"$(shell git log -n1 --format="%h%m%cs")\""
ifeq (${DEBUG_STACK}, 1)
CFLAGS += -DDEBUG_STACK
endif
ifneq (${BUILD_ON_WINDOWS}, 1)
LDFLAGS += -lpthread
ifeq ($(shell uname -s), NetBSD)
else ifeq ($(shell uname -s), OpenBSD)
else
LDFLAGS += -ldl
endif
endif
ifeq (${USE_HELGRIND}, 1)
CFLAGS += -DUSE_HELGRIND
endif
OBJ := $(src:src/%.c=build/%.o)
gcda := $(src:.c=.gcda)
gcno := $(src:.c=.gcno)
lib_obj := $(filter-out src/main.o, ${OBJ})
almost_obj := $(filter-out src/vm/vm.o, ${OBJ})
CFLAGS += -Iinclude
ifeq ($(shell uname), Linux)
LDFLAGS += -lrt
endif
ifeq (${USE_CONFIG}, 1)
config_obj := embed/embed.o
include embed/embed.mk
endif
ALMOST_LIBS := fmt/libgwion_fmt.a
ALMOST_LIBS += ast/libgwion_ast.a
ALMOST_LIBS += util/libgwion_util.a
GWLIBS := lib${PRG}.a ${ALMOST_LIBS}
LDFLAGS := ${GWLIBS} ${LDFLAGS}
# we are not pedantic
CFLAGS += -Wno-pedantic
CFLAGS += -DGWION_BUILTIN
# with_config may require a c++ linker
LINKER ?= ${CC}
all: options-show prg
prg: ${GWLIBS} ${config_obj} build/main.o
@$(info link ${PRG})
${LINKER} build/main.o -o ${PRG} ${config_obj} ${PLUGLIBS} ${LDFLAGS} ${LIBS}
options-show:
@$(call _options)
@$(info libs: ${GWLIBS})
with_config:
@bash scripts/embed.bash gwion.config.json
@touch build/main.c
@${MAKE} USE_CONFIG=1
@touch build/main.c
almost_gwion: ${almost_obj} ${ALMOST_LIBS}
lto:
@${MAKE} USE_LTO=1 almost_gwion
@${MAKE} USE_LTO=0
lib${PRG}.a: ${lib_obj}
@${AR} ${AR_OPT}
util/libgwion_util.a:
@+${MAKE} -s -C util
util: util/libgwion_util.a
@(info build util)
ast/libgwion_ast.a: util/libgwion_util.a
@+ ${MAKE} -s -C ast
fmt/libgwion_fmt.a: ast/libgwion_ast.a
@+${MAKE} -s -C fmt libgwion_fmt.a
ast: ast/libgwion_ast.a
@(info build ast)
afl: gwion-fuzz
gwion-fuzz:
@touch src/parse/scan*.c src/parse/check.c src/emit/emit.c src/main.c src/vm/vm.c
@+PRG=gwion-fuzz CC=afl-clang-fast CFLAGS=-D__FUZZING__ ${MAKE}
@touch src/parse/scan*.c src/parse/check.c src/emit/emit.c src/main.c src/vm/vm.c
clean_core:
@rm -f core.* *vgcore.*
clean-all: clean
${MAKE} -s -C fmt clean
${MAKE} -s -C ast clean
${MAKE} -s -C util clean
update: clean-all
bash scripts/update.sh
clean: clean_core
$(info cleaning ...)
@rm -f build/*.o build/*/*.o gwion lib${PRG}.a ${gcno} ${gcda} embed/*.o
install: all translation-install
$(info installing ${GWION_PACKAGE} in ${PREFIX})
@mkdir -p ${DESTDIR}/${PREFIX}/bin
@mkdir -p ${DESTDIR}/${PREFIX}/lib
@mkdir -p ${DESTDIR}/${PREFIX}/include
@mkdir -p ${DESTDIR}/${PREFIX}/share
@install ${PRG} ${DESTDIR}/${PREFIX}/bin
@install lib${PRG}.a ${DESTDIR}/${PREFIX}/lib
@PREFIX=${PREFIX} sed 's#PREFIX#${PREFIX}#g' scripts/gwion-config > gwion-config
@install gwion-config ${DESTDIR}/${PREFIX}/bin/gwion-config
@install scripts/gwion-pkg ${DESTDIR}/${PREFIX}/bin/gwion-pkg
@rm gwion-config
@mkdir -p ${DESTDIR}/${PREFIX}/include/gwion
@cp -r include/* ${DESTDIR}/${PREFIX}/include/gwion
@${MAKE} -s -C util install
@${MAKE} -s -C ast install
uninstall: translation-uninstall
$(info uninstalling ${GWION_PACKAGE} from ${PREFIX})
@rm ${DESTDIR}/${PREFIX}/bin/${PRG}
@rm ${DESTDIR}/${PREFIX}/bin/gwion-config
@rm ${DESTDIR}/${PREFIX}/bin/gwion-pkg
@rm ${DESTDIR}/${PREFIX}/lib/lib${PRG}.a
@rm ${DESTDIR}/${PREFIX}/include/gwion/*.h
@rmdir --ignore-fail-on-non-empty ${DESTDIR}/${PREFIX}/include/gwion
test: prg
@bash scripts/test.sh ${test_dir}
scan:
@rm -rf scan_output
@scan-build -o ./scan_output make USE_DEBUG=1
@scan-view ./scan_output/*
include $(wildcard .d/*.d)
include util/locale.mk