compiler/libec: Fixed building on Linux that was broken by dllexport in precompiled...
[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 endif
102 ifeq "$(wildcard precompiled)" "precompiled"
103         $(call cpq,$(PRECOMPILED_SOURCES),$(OBJ))
104 endif
105
106 $(OBJ)$(MODULE).main.ec: $(SYMBOLS) $(COBJECTS)
107         $(ECS) $(ECSLIBOPT) $(SYMBOLS) $(IMPORTS) -symbols obj/$(CONFIG).$(PLATFORM) -o $(OBJ)$(MODULE).main.ec
108
109 $(OBJ)$(MODULE).main.c: $(OBJ)$(MODULE).main.ec
110         $(ECP) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) -c $(OBJ)$(MODULE).main.ec -o $(OBJ)$(MODULE).main.sym -symbols $(OBJ)
111         $(ECC) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) $(FVISIBILITY) -c $(OBJ)$(MODULE).main.ec -o $(OBJ)$(MODULE).main.c -symbols $(OBJ)
112
113 $(SYMBOLS): | objdir
114 $(OBJECTS): | objdir
115 $(TARGET): $(SOURCES) $(RESOURCES) $(SYMBOLS) $(OBJECTS) | objdir
116         $(CC) $(OFLAGS) $(OBJECTS) $(LIBS) -o $(TARGET) $(INSTALLNAME)
117         $(STRIP) $(STRIPOPT) $(TARGET)
118         $(call cpq,$(TARGET),../../$(SODESTDIR))
119 ifdef LINUX
120         ln -sf $(LP)$(MODULE)$(SO).0.44 ../../$(SODESTDIR)$(LP)$(MODULE)$(SO).0
121         ln -sf $(LP)$(MODULE)$(SO).0.44 ../../$(SODESTDIR)$(LP)$(MODULE)$(SO)
122 endif   
123 ifdef WINDOWS
124         $(call cpq,$(TARGET),../../compiler/bootstrap/obj/bin.$(PLATFORM)/)
125 endif
126
127 # SYMBOL RULES
128
129 $(OBJ)ast.sym: src/ast.ec
130         $(ECP) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) -c src/ast.ec -o $(OBJ)ast.sym
131
132 $(OBJ)copy.sym: src/copy.ec
133         $(ECP) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) -c src/copy.ec -o $(OBJ)copy.sym
134
135 $(OBJ)dbpass.sym: src/dbpass.ec
136         $(ECP) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) -c src/dbpass.ec -o $(OBJ)dbpass.sym
137
138 $(OBJ)ecdefs.sym: src/ecdefs.ec
139         $(ECP) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) -c src/ecdefs.ec -o $(OBJ)ecdefs.sym
140
141 $(OBJ)expression.sym: src/expression.ec
142         $(ECP) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) -c src/expression.ec -o $(OBJ)expression.sym
143
144 $(OBJ)firstPass.sym: src/firstPass.ec
145         $(ECP) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) -c src/firstPass.ec -o $(OBJ)firstPass.sym
146
147 $(OBJ)freeAst.sym: src/freeAst.ec
148         $(ECP) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) -c src/freeAst.ec -o $(OBJ)freeAst.sym
149
150 $(OBJ)grammar.sym: src/grammar.ec
151         $(ECP) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) -c src/grammar.ec -o $(OBJ)grammar.sym
152
153 $(OBJ)lexer.sym: src/lexer.ec
154         $(ECP) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) -c src/lexer.ec -o $(OBJ)lexer.sym
155
156 $(OBJ)loadSymbols.sym: src/loadSymbols.ec
157         $(ECP) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) -c src/loadSymbols.ec -o $(OBJ)loadSymbols.sym
158
159 $(OBJ)output.sym: src/output.ec
160         $(ECP) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) -c src/output.ec -o $(OBJ)output.sym
161
162 $(OBJ)pass0.sym: src/pass0.ec
163         $(ECP) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) -c src/pass0.ec -o $(OBJ)pass0.sym
164
165 $(OBJ)pass1.sym: src/pass1.ec
166         $(ECP) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) -c src/pass1.ec -o $(OBJ)pass1.sym
167
168 $(OBJ)pass15.sym: src/pass15.ec
169         $(ECP) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) -c src/pass15.ec -o $(OBJ)pass15.sym
170
171 $(OBJ)pass16.sym: src/pass16.ec
172         $(ECP) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) -c src/pass16.ec -o $(OBJ)pass16.sym
173
174 $(OBJ)pass2.sym: src/pass2.ec
175         $(ECP) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) -c src/pass2.ec -o $(OBJ)pass2.sym
176
177 $(OBJ)pass3.sym: src/pass3.ec
178         $(ECP) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) -c src/pass3.ec -o $(OBJ)pass3.sym
179
180 $(OBJ)shortcuts.sym: src/shortcuts.ec
181         $(ECP) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) -c src/shortcuts.ec -o $(OBJ)shortcuts.sym
182
183 $(OBJ)type.sym: src/type.ec
184         $(ECP) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) -c src/type.ec -o $(OBJ)type.sym
185
186 # C OBJECT RULES
187
188 $(OBJ)ast.c: src/ast.ec $(OBJ)ast.sym | $(SYMBOLS)
189         $(ECC) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) $(FVISIBILITY) -c src/ast.ec -o $(OBJ)ast.c -symbols $(OBJ)
190
191 $(OBJ)copy.c: src/copy.ec $(OBJ)copy.sym | $(SYMBOLS)
192         $(ECC) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) $(FVISIBILITY) -c src/copy.ec -o $(OBJ)copy.c -symbols $(OBJ)
193
194 $(OBJ)dbpass.c: src/dbpass.ec $(OBJ)dbpass.sym | $(SYMBOLS)
195         $(ECC) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) $(FVISIBILITY) -c src/dbpass.ec -o $(OBJ)dbpass.c -symbols $(OBJ)
196
197 $(OBJ)ecdefs.c: src/ecdefs.ec $(OBJ)ecdefs.sym | $(SYMBOLS)
198         $(ECC) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) $(FVISIBILITY) -c src/ecdefs.ec -o $(OBJ)ecdefs.c -symbols $(OBJ)
199
200 $(OBJ)expression.c: src/expression.ec | $(SYMBOLS)
201         $(ECC) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) $(FVISIBILITY) -c src/expression.ec -o $(OBJ)expression.c -symbols $(OBJ)
202
203 $(OBJ)firstPass.c: src/firstPass.ec $(OBJ)firstPass.sym | $(SYMBOLS)
204         $(ECC) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) $(FVISIBILITY) -c src/firstPass.ec -o $(OBJ)firstPass.c -symbols $(OBJ)
205
206 $(OBJ)freeAst.c: src/freeAst.ec $(OBJ)freeAst.sym | $(SYMBOLS)
207         $(ECC) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) $(FVISIBILITY) -c src/freeAst.ec -o $(OBJ)freeAst.c -symbols $(OBJ)
208
209 $(OBJ)grammar.c: src/grammar.ec | $(SYMBOLS)
210         $(ECC) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) $(FVISIBILITY) -c src/grammar.ec -o $(OBJ)grammar.c -symbols $(OBJ)
211
212 $(OBJ)lexer.c: src/lexer.ec $(OBJ)lexer.sym | $(SYMBOLS)
213         $(ECC) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) $(FVISIBILITY) -c src/lexer.ec -o $(OBJ)lexer.c -symbols $(OBJ)
214
215 $(OBJ)loadSymbols.c: src/loadSymbols.ec $(OBJ)loadSymbols.sym | $(SYMBOLS)
216         $(ECC) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) $(FVISIBILITY) -c src/loadSymbols.ec -o $(OBJ)loadSymbols.c -symbols $(OBJ)
217
218 $(OBJ)output.c: src/output.ec $(OBJ)output.sym | $(SYMBOLS)
219         $(ECC) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) $(FVISIBILITY) -c src/output.ec -o $(OBJ)output.c -symbols $(OBJ)
220
221 $(OBJ)pass0.c: src/pass0.ec $(OBJ)pass0.sym | $(SYMBOLS)
222         $(ECC) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) $(FVISIBILITY) -c src/pass0.ec -o $(OBJ)pass0.c -symbols $(OBJ)
223
224 $(OBJ)pass1.c: src/pass1.ec $(OBJ)pass1.sym | $(SYMBOLS)
225         $(ECC) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) $(FVISIBILITY) -c src/pass1.ec -o $(OBJ)pass1.c -symbols $(OBJ)
226
227 $(OBJ)pass15.c: src/pass15.ec $(OBJ)pass15.sym | $(SYMBOLS)
228         $(ECC) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) $(FVISIBILITY) -c src/pass15.ec -o $(OBJ)pass15.c -symbols $(OBJ)
229
230 $(OBJ)pass16.c: src/pass16.ec $(OBJ)pass16.sym | $(SYMBOLS)
231         $(ECC) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) $(FVISIBILITY) -c src/pass16.ec -o $(OBJ)pass16.c -symbols $(OBJ)
232
233 $(OBJ)pass2.c: src/pass2.ec $(OBJ)pass2.sym | $(SYMBOLS)
234         $(ECC) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) $(FVISIBILITY) -c src/pass2.ec -o $(OBJ)pass2.c -symbols $(OBJ)
235
236 $(OBJ)pass3.c: src/pass3.ec $(OBJ)pass3.sym | $(SYMBOLS)
237         $(ECC) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) $(FVISIBILITY) -c src/pass3.ec -o $(OBJ)pass3.c -symbols $(OBJ)
238
239 $(OBJ)shortcuts.c: src/shortcuts.ec $(OBJ)shortcuts.sym | $(SYMBOLS)
240         $(ECC) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) $(FVISIBILITY) -c src/shortcuts.ec -o $(OBJ)shortcuts.c -symbols $(OBJ)
241
242 $(OBJ)type.c: src/type.ec | $(SYMBOLS)
243         $(ECC) $(CECFLAGS) $(ECFLAGS) $(CFLAGS) $(FVISIBILITY) -c src/type.ec -o $(OBJ)type.c -symbols $(OBJ)
244
245 # IMPLICIT OBJECT RULE
246
247 $(OBJ)%$(O) : $(OBJ)%.c
248         $(CC) $(CFLAGS) $(FVISIBILITY) -c $< -o $@
249
250 # OBJECT RULES
251
252 $(OBJ)$(MODULE).main$(O): $(OBJ)$(MODULE).main.c
253         $(CC) $(CFLAGS) $(FVISIBILITY) -c $(OBJ)$(MODULE).main.c -o $(OBJ)$(MODULE).main$(O)
254
255 $(OBJ)bsl.o: ../bootstrap/bsl.c
256         $(CC) $(BSL_CFLAGS) $(FVISIBILITY) -c ../bootstrap/bsl.c -o $(OBJ)bsl.o
257
258 clean: objdir
259         $(call rmq,$(OBJ)$(MODULE).main.c $(OBJ)$(MODULE).main.ec $(OBJ)$(MODULE).main$(I) $(OBJ)$(MODULE).main$(S) $(TARGET))
260         $(call rmq,$(OBJECTS))
261         $(call rmq,$(COBJECTS))
262         $(call rmq,$(IMPORTS))
263         $(call rmq,$(SYMBOLS))
264
265 realclean:
266         $(call rmrq,$(OBJ))
267
268 distclean:
269         $(call rmrq,obj/)