build system / makefiles / ide: added support for ccache and distcc
[sdk] / compiler / libec / Makefile
1 .PHONY: all objdir clean realclean distclean
2 .SILENT:
3
4 # CONTENT
5
6 MODULE := ec
7 CONFIG := release
8 COMPILER := default
9 TARGET_TYPE = sharedlib
10
11 OBJ = obj/$(CONFIG).$(PLATFORM)/
12
13 RES = 
14
15 # CROSS-PLATFORM MAGIC
16
17 include ../../include.mk
18
19 ifdef LINUX
20 TARGET = obj/$(CONFIG).$(PLATFORM)/$(LP)ec$(SO).0.44
21 SONAME = -Wl,-soname,libec.so.0
22 else
23 TARGET = obj/$(CONFIG).$(PLATFORM)/$(LP)ec$(SO)
24 SONAME =
25 endif
26
27 # $(OBJ)bsl.o is added manually here
28 OBJECTS = $(OBJ)ast.o $(OBJ)copy.o $(OBJ)dbpass.o $(OBJ)ecdefs.o $(OBJ)expression.o \
29         $(OBJ)firstPass.o $(OBJ)freeAst.o $(OBJ)grammar.o $(OBJ)lexer.o $(OBJ)loadSymbols.o \
30         $(OBJ)output.o $(OBJ)pass0.o $(OBJ)pass1.o $(OBJ)pass15.o $(OBJ)pass16.o $(OBJ)pass2.o \
31         $(OBJ)pass3.o $(OBJ)shortcuts.o $(OBJ)type.o $(OBJ)bsl.o $(OBJ)$(MODULE).main$(O)
32
33 COBJECTS = $(OBJ)ast.c $(OBJ)copy.c $(OBJ)dbpass.c $(OBJ)ecdefs.c $(OBJ)expression.c \
34         $(OBJ)firstPass.c $(OBJ)freeAst.c $(OBJ)grammar.c $(OBJ)lexer.c $(OBJ)loadSymbols.c \
35         $(OBJ)output.c $(OBJ)pass0.c $(OBJ)pass1.c $(OBJ)pass15.c $(OBJ)pass16.c $(OBJ)pass2.c \
36         $(OBJ)pass3.c $(OBJ)shortcuts.c $(OBJ)type.c
37
38 SYMBOLS = $(OBJ)ast.sym $(OBJ)copy.sym $(OBJ)dbpass.sym $(OBJ)ecdefs.sym \
39         $(OBJ)expression.sym $(OBJ)firstPass.sym $(OBJ)freeAst.sym $(OBJ)grammar.sym $(OBJ)lexer.sym \
40         $(OBJ)loadSymbols.sym $(OBJ)output.sym $(OBJ)pass0.sym $(OBJ)pass1.sym $(OBJ)pass15.sym \
41         $(OBJ)pass16.sym $(OBJ)pass2.sym $(OBJ)pass3.sym $(OBJ)shortcuts.sym $(OBJ)type.sym
42
43 IMPORTS = $(OBJ)ast.imp $(OBJ)copy.imp $(OBJ)dbpass.imp $(OBJ)ecdefs.imp \
44         $(OBJ)expression.imp $(OBJ)firstPass.imp $(OBJ)freeAst.imp $(OBJ)grammar.imp $(OBJ)lexer.imp \
45         $(OBJ)loadSymbols.imp $(OBJ)output.imp $(OBJ)pass0.imp $(OBJ)pass1.imp $(OBJ)pass15.imp \
46         $(OBJ)pass16.imp $(OBJ)pass2.imp $(OBJ)pass3.imp $(OBJ)shortcuts.imp $(OBJ)type.imp
47
48 SOURCES = src/ast.ec src/copy.ec src/dbpass.ec src/ecdefs.ec src/expression.ec \
49         src/firstPass.ec src/freeAst.ec src/grammar.ec src/lexer.ec src/loadSymbols.ec src/output.ec \
50         src/pass0.ec src/pass1.ec src/pass15.ec src/pass16.ec src/pass2.ec src/pass3.ec \
51         src/shortcuts.ec src/type.ec
52
53 PRECOMPILED_SOURCES = precompiled/expression.c precompiled/grammar.c precompiled/type.c
54
55 RESOURCES =
56
57 # TOOLCHAIN
58
59 ifdef WINDOWS
60 else
61 export LD_LIBRARY_PATH = ../../obj/$(PLATFORM)/lib/
62 export DYLD_LIBRARY_PATH = ../../obj/$(PLATFORM)/lib/
63 endif
64
65 ECP := $(call psep,../bootstrap/obj/bin.$(PLATFORM)/ecp)
66 ECC := $(call psep,../bootstrap/obj/bin.$(PLATFORM)/ecc)
67 ECS := $(call psep,../bootstrap/obj/bin.$(PLATFORM)/ecs)
68
69 # FLAGS
70
71 CFLAGS = -fmessage-length=0 -O2 -ffast-math -m32 $(FPIC) -w -I../bootstrap/include \
72          -DYYTOKENTYPE
73
74 # BSL CFLAGS
75 BSL_CFLAGS = -fmessage-length=0 -O2 -ffast-math -m32 $(FPIC) -w
76
77 CECFLAGS =
78
79 ECFLAGS = -nolinenumbers
80
81 OFLAGS = -m32 \
82          -L../../obj/$(PLATFORM)/bin \
83          -L../../obj/$(PLATFORM)/lib
84
85 LIBS = -lecere $(SHAREDLIB) $(EXECUTABLE) $(LINKOPT)
86
87 UPXFLAGS = -9 -q
88
89 # HARD CODED PLATFORM-SPECIFIC OPTIONS
90 ifdef LINUX
91 OFLAGS += -Wl,--no-undefined
92 endif
93
94 # TARGETS
95
96 all: objdir $(TARGET)
97
98 objdir:
99 ifneq "$(wildcard $(OBJ))" "$(OBJ)"
100         $(call mkdirq,$(OBJ))
101         $(call cpq,$(PRECOMPILED_SOURCES),$(OBJ))
102 endif
103
104 $(OBJ)$(MODULE).main.ec: $(SYMBOLS) $(COBJECTS)
105         $(ECS) $(ECSLIBOPT) $(SYMBOLS) $(IMPORTS) -symbols obj/$(CONFIG).$(PLATFORM) -o $(OBJ)$(MODULE).main.ec
106
107 $(OBJ)$(MODULE).main.c: $(OBJ)$(MODULE).main.ec
108         $(ECP) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) -c $(OBJ)$(MODULE).main.ec -o $(OBJ)$(MODULE).main.sym -symbols $(OBJ)
109         $(ECC) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) $(FVISIBILITY) -c $(OBJ)$(MODULE).main.ec -o $(OBJ)$(MODULE).main.c -symbols $(OBJ)
110
111 $(TARGET): $(SOURCES) $(RESOURCES) | objdir $(SYMBOLS) $(OBJECTS)
112         $(CC) $(OFLAGS) $(OBJECTS) $(LIBS) -o $(TARGET) $(INSTALLNAME)
113         $(STRIP) $(STRIPOPT) $(TARGET)
114         $(call cpq,$(TARGET),../../$(SODESTDIR))
115 ifdef LINUX
116         ln -sf $(LP)$(MODULE)$(SO).0.44 ../../$(SODESTDIR)$(LP)$(MODULE)$(SO).0
117         ln -sf $(LP)$(MODULE)$(SO).0.44 ../../$(SODESTDIR)$(LP)$(MODULE)$(SO)
118 endif   
119 ifdef WINDOWS
120         $(call cpq,$(TARGET),../../compiler/bootstrap/obj/bin.$(PLATFORM)/)
121 endif
122
123 # SYMBOL RULES
124
125 $(OBJ)ast.sym: src/ast.ec
126         $(ECP) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) -c src/ast.ec -o $(OBJ)ast.sym
127
128 $(OBJ)copy.sym: src/copy.ec
129         $(ECP) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) -c src/copy.ec -o $(OBJ)copy.sym
130
131 $(OBJ)dbpass.sym: src/dbpass.ec
132         $(ECP) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) -c src/dbpass.ec -o $(OBJ)dbpass.sym
133
134 $(OBJ)ecdefs.sym: src/ecdefs.ec
135         $(ECP) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) -c src/ecdefs.ec -o $(OBJ)ecdefs.sym
136
137 $(OBJ)expression.sym: src/expression.ec
138         $(ECP) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) -c src/expression.ec -o $(OBJ)expression.sym
139
140 $(OBJ)firstPass.sym: src/firstPass.ec
141         $(ECP) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) -c src/firstPass.ec -o $(OBJ)firstPass.sym
142
143 $(OBJ)freeAst.sym: src/freeAst.ec
144         $(ECP) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) -c src/freeAst.ec -o $(OBJ)freeAst.sym
145
146 $(OBJ)grammar.sym: src/grammar.ec
147         $(ECP) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) -c src/grammar.ec -o $(OBJ)grammar.sym
148
149 $(OBJ)lexer.sym: src/lexer.ec
150         $(ECP) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) -c src/lexer.ec -o $(OBJ)lexer.sym
151
152 $(OBJ)loadSymbols.sym: src/loadSymbols.ec
153         $(ECP) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) -c src/loadSymbols.ec -o $(OBJ)loadSymbols.sym
154
155 $(OBJ)output.sym: src/output.ec
156         $(ECP) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) -c src/output.ec -o $(OBJ)output.sym
157
158 $(OBJ)pass0.sym: src/pass0.ec
159         $(ECP) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) -c src/pass0.ec -o $(OBJ)pass0.sym
160
161 $(OBJ)pass1.sym: src/pass1.ec
162         $(ECP) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) -c src/pass1.ec -o $(OBJ)pass1.sym
163
164 $(OBJ)pass15.sym: src/pass15.ec
165         $(ECP) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) -c src/pass15.ec -o $(OBJ)pass15.sym
166
167 $(OBJ)pass16.sym: src/pass16.ec
168         $(ECP) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) -c src/pass16.ec -o $(OBJ)pass16.sym
169
170 $(OBJ)pass2.sym: src/pass2.ec
171         $(ECP) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) -c src/pass2.ec -o $(OBJ)pass2.sym
172
173 $(OBJ)pass3.sym: src/pass3.ec
174         $(ECP) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) -c src/pass3.ec -o $(OBJ)pass3.sym
175
176 $(OBJ)shortcuts.sym: src/shortcuts.ec
177         $(ECP) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) -c src/shortcuts.ec -o $(OBJ)shortcuts.sym
178
179 $(OBJ)type.sym: src/type.ec
180         $(ECP) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) -c src/type.ec -o $(OBJ)type.sym
181
182 # C OBJECT RULES
183
184 $(OBJ)ast.c: src/ast.ec $(OBJ)ast.sym | $(SYMBOLS)
185         $(ECC) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) $(FVISIBILITY) -c src/ast.ec -o $(OBJ)ast.c -symbols $(OBJ)
186
187 $(OBJ)copy.c: src/copy.ec $(OBJ)copy.sym | $(SYMBOLS)
188         $(ECC) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) $(FVISIBILITY) -c src/copy.ec -o $(OBJ)copy.c -symbols $(OBJ)
189
190 $(OBJ)dbpass.c: src/dbpass.ec $(OBJ)dbpass.sym | $(SYMBOLS)
191         $(ECC) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) $(FVISIBILITY) -c src/dbpass.ec -o $(OBJ)dbpass.c -symbols $(OBJ)
192
193 $(OBJ)ecdefs.c: src/ecdefs.ec $(OBJ)ecdefs.sym | $(SYMBOLS)
194         $(ECC) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) $(FVISIBILITY) -c src/ecdefs.ec -o $(OBJ)ecdefs.c -symbols $(OBJ)
195
196 $(OBJ)expression.c: src/expression.ec | $(SYMBOLS)
197         $(ECC) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) $(FVISIBILITY) -c src/expression.ec -o $(OBJ)expression.c -symbols $(OBJ)
198
199 $(OBJ)firstPass.c: src/firstPass.ec $(OBJ)firstPass.sym | $(SYMBOLS)
200         $(ECC) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) $(FVISIBILITY) -c src/firstPass.ec -o $(OBJ)firstPass.c -symbols $(OBJ)
201
202 $(OBJ)freeAst.c: src/freeAst.ec $(OBJ)freeAst.sym | $(SYMBOLS)
203         $(ECC) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) $(FVISIBILITY) -c src/freeAst.ec -o $(OBJ)freeAst.c -symbols $(OBJ)
204
205 $(OBJ)grammar.c: src/grammar.ec | $(SYMBOLS)
206         $(ECC) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) $(FVISIBILITY) -c src/grammar.ec -o $(OBJ)grammar.c -symbols $(OBJ)
207
208 $(OBJ)lexer.c: src/lexer.ec $(OBJ)lexer.sym | $(SYMBOLS)
209         $(ECC) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) $(FVISIBILITY) -c src/lexer.ec -o $(OBJ)lexer.c -symbols $(OBJ)
210
211 $(OBJ)loadSymbols.c: src/loadSymbols.ec $(OBJ)loadSymbols.sym | $(SYMBOLS)
212         $(ECC) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) $(FVISIBILITY) -c src/loadSymbols.ec -o $(OBJ)loadSymbols.c -symbols $(OBJ)
213
214 $(OBJ)output.c: src/output.ec $(OBJ)output.sym | $(SYMBOLS)
215         $(ECC) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) $(FVISIBILITY) -c src/output.ec -o $(OBJ)output.c -symbols $(OBJ)
216
217 $(OBJ)pass0.c: src/pass0.ec $(OBJ)pass0.sym | $(SYMBOLS)
218         $(ECC) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) $(FVISIBILITY) -c src/pass0.ec -o $(OBJ)pass0.c -symbols $(OBJ)
219
220 $(OBJ)pass1.c: src/pass1.ec $(OBJ)pass1.sym | $(SYMBOLS)
221         $(ECC) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) $(FVISIBILITY) -c src/pass1.ec -o $(OBJ)pass1.c -symbols $(OBJ)
222
223 $(OBJ)pass15.c: src/pass15.ec $(OBJ)pass15.sym | $(SYMBOLS)
224         $(ECC) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) $(FVISIBILITY) -c src/pass15.ec -o $(OBJ)pass15.c -symbols $(OBJ)
225
226 $(OBJ)pass16.c: src/pass16.ec $(OBJ)pass16.sym | $(SYMBOLS)
227         $(ECC) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) $(FVISIBILITY) -c src/pass16.ec -o $(OBJ)pass16.c -symbols $(OBJ)
228
229 $(OBJ)pass2.c: src/pass2.ec $(OBJ)pass2.sym | $(SYMBOLS)
230         $(ECC) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) $(FVISIBILITY) -c src/pass2.ec -o $(OBJ)pass2.c -symbols $(OBJ)
231
232 $(OBJ)pass3.c: src/pass3.ec $(OBJ)pass3.sym | $(SYMBOLS)
233         $(ECC) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) $(FVISIBILITY) -c src/pass3.ec -o $(OBJ)pass3.c -symbols $(OBJ)
234
235 $(OBJ)shortcuts.c: src/shortcuts.ec $(OBJ)shortcuts.sym | $(SYMBOLS)
236         $(ECC) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) $(FVISIBILITY) -c src/shortcuts.ec -o $(OBJ)shortcuts.c -symbols $(OBJ)
237
238 $(OBJ)type.c: src/type.ec | $(SYMBOLS)
239         $(ECC) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) $(FVISIBILITY) -c src/type.ec -o $(OBJ)type.c -symbols $(OBJ)
240
241 # IMPLICIT OBJECT RULE
242
243 $(OBJ)%$(O) : $(OBJ)%.c
244         $(CC) $(CFLAGS) $(FVISIBILITY) -c $< -o $@
245
246 # OBJECT RULES
247
248 $(OBJ)$(MODULE).main$(O): $(OBJ)$(MODULE).main.c
249         $(CC) $(CFLAGS) $(FVISIBILITY) -c $(OBJ)$(MODULE).main.c -o $(OBJ)$(MODULE).main$(O)
250
251 $(OBJ)bsl.o: ../bootstrap/bsl.c
252         $(CC) $(BSL_CFLAGS) $(FVISIBILITY) -c ../bootstrap/bsl.c -o $(OBJ)bsl.o
253
254 clean: objdir
255         $(call rmq,$(OBJ)$(MODULE).main.c $(OBJ)$(MODULE).main.ec $(OBJ)$(MODULE).main$(I) $(OBJ)$(MODULE).main$(S) $(TARGET))
256         $(call rmq,$(OBJECTS))
257         $(call rmq,$(COBJECTS))
258         $(call rmq,$(IMPORTS))
259         $(call rmq,$(SYMBOLS))
260
261 realclean:
262         $(call rmrq,$(OBJ))
263
264 distclean:
265         $(call rmrq,obj/)