Merge 45535 (the big RosBE 1.5 compatibility patch)
[reactos.git] / reactos / tools / rbuild / backend / mingw / rules.mak
1 RBUILD_fullpath=${subst <<<,,${subst $(SEP)<<<,,${subst /,$(SEP),${subst \\,$(SEP),$(1)}}<<<}}
2
3 RBUILD_compress_prefix=${subst >>>,,${subst >>>$($(2)),$$($(2)),>>>$(1)}}
4 RBUILD_compress_prefixes=${call RBUILD_compress_prefix,${call RBUILD_compress_prefix,${call RBUILD_compress_prefix,${call RBUILD_compress_prefix,${call RBUILD_compress_prefix,$(1),INTERMEDIATE},OUTPUT},CDOUTPUT},TEMPORARY},INSTALL}
5
6 RBUILD_strip_prefix=${subst >>>,,${subst >>>$($(2)),,>>>$(1)}}
7 RBUILD_strip_prefixes=${subst >>>,,${subst >>>$(SEP),,>>>${call RBUILD_strip_prefix,${call RBUILD_strip_prefix,${call RBUILD_strip_prefix,${call RBUILD_strip_prefix,${call RBUILD_strip_prefix,$(1),INTERMEDIATE},OUTPUT},CDOUTPUT},TEMPORARY},INSTALL}}}
8
9 #(source)
10 RBUILD_intermediate_path_noext=${call RBUILD_intermediate_dir,$(1)}$(SEP)$(basename $(notdir $(1)))
11 RBUILD_output_path_noext=${call RBUILD_output_dir,$(1)}$(SEP)$(basename $(notdir $(1)))
12
13 #(module, source)
14 RBUILD_intermediate_path_unique=${call RBUILD_intermediate_path_noext,$(2)}_$(1)
15 RBUILD_output_dir=${call RBUILD_output_path_noext,$(2)}_$(1)
16
17 #(source)
18 RBUILD_intermediate_dir=${call RBUILD_fullpath,$(value INTERMEDIATE)$(SEP)$(dir ${call RBUILD_strip_prefixes,$(1)})}
19 RBUILD_output_dir=${call RBUILD_fullpath,$(value OUTPUT)$(SEP)$(dir ${call RBUILD_strip_prefixes,$(1)})}
20
21 #(source)
22 RBUILD_name=$(basename $(notdir $(1)))
23
24 #(source)
25 RBUILD_dir=${call RBUILD_fullpath,$(dir ${call RBUILD_compress_prefixes,$(1)})}
26
27 #(module, flags, includes, compiler, prefix)
28 RBUILD_compiler_flags=\
29 $$(BUILTIN_$(5)$(4)FLAGS) \
30 $$(PROJECT_$(5)$(4)FLAGS) \
31 $$(MODULETYPE$($(1)_TYPE)_$(4)FLAGS) \
32 $$($(1)_$(4)FLAGS) \
33 $(2) \
34 $$($(5)$(4)FLAGS)
35
36 #(module, flags, includes, compiler, prefix)
37 RBUILD_compiler_flags_with_cpp=\
38 $$($(5)$(4)INCLUDES) $$(CPPINCLUDES) \
39 $(3) \
40 $$($(1)_$(4)INCLUDES) $$($(1)_CPPINCLUDES) \
41 $$(MODULETYPE$($(1)_TYPE)_$(4)INCLUDES) $$(MODULETYPE$($(1)_TYPE)_CPPINCLUDES) \
42 $$(PROJECT_$(5)$(4)INCLUDES) $$(PROJECT_$(5)CPPINCLUDES) \
43 $$(BUILTIN_$(5)$(4)INCLUDES) $$(BUILTIN_$(5)CPPINCLUDES) \
44 $$(BUILTIN_$(5)CPPDEFINES) $$(BUILTIN_$(5)CPPFLAGS) $$(BUILTIN_$(5)$(4)DEFINES) $$(BUILTIN_$(5)$(4)FLAGS) \
45 $$(PROJECT_$(5)CPPDEFINES) $$(PROJECT_$(5)CPPFLAGS) $$(PROJECT_$(5)$(4)DEFINES) $$(PROJECT_$(5)$(4)FLAGS) \
46 $$(MODULETYPE$($(1)_TYPE)_CPPDEFINES) $$(MODULETYPE$($(1)_TYPE)_CPPFLAGS) $$(MODULETYPE$($(1)_TYPE)_$(4)DEFINES) $$(MODULETYPE$($(1)_TYPE)_$(4)FLAGS) \
47 $$($(1)_CPPDEFINES) $$($(1)_CPPFLAGS) $$($(1)_$(4)DEFINES) $$($(1)_$(4)FLAGS) \
48 $(2) \
49 $$(CPPDEFINES) $$(CPPFLAGS) $$($(5)$(4)DEFINES) $$($(5)$(4)FLAGS)
50
51 #(module, flags, includes, compiler, prefix)
52 RBUILD_compiler_flags_builtin_cpp=\
53 $$($(5)$(4)INCLUDES) $$(CPPINCLUDES) \
54 $(3) \
55 $$($(1)_$(4)INCLUDES) $$($(1)_CPPINCLUDES) \
56 $$(MODULETYPE$($(1)_TYPE)_$(4)INCLUDES) $$(MODULETYPE$($(1)_TYPE)_CPPINCLUDES) \
57 $$(PROJECT_$(5)$(4)INCLUDES) $$(PROJECT_$(5)CPPINCLUDES) \
58 $$(BUILTIN_$(5)$(4)INCLUDES) $$(BUILTIN_$(5)CPPINCLUDES) \
59 $$(BUILTIN_$(5)CPPDEFINES) $$(BUILTIN_$(5)$(4)DEFINES) $$(BUILTIN_$(5)$(4)FLAGS) \
60 $$(PROJECT_$(5)CPPDEFINES) $$(PROJECT_$(5)$(4)DEFINES) $$(PROJECT_$(5)$(4)FLAGS) \
61 $$(MODULETYPE$($(1)_TYPE)_CPPDEFINES) $$(MODULETYPE$($(1)_TYPE)_$(4)DEFINES) $$(MODULETYPE$($(1)_TYPE)_$(4)FLAGS) \
62 $$($(1)_CPPDEFINES) $$($(1)_$(4)DEFINES) $$($(1)_$(4)FLAGS) \
63 $(2) \
64 $$(CPPDEFINES) $$($(5)$(4)DEFINES) $$($(5)$(4)FLAGS)
65
66 #(module, flags, includes, compiler, prefix)
67 RBUILD_compiler_flags_with_includes=\
68 $$($(5)$(4)INCLUDES) \
69 $(3) \
70 $$($(1)_$(4)INCLUDES) $$($(1)_CPPINCLUDES) \
71 $$(MODULETYPE$($(1)_TYPE)_$(4)INCLUDES) \
72 $$(PROJECT_$(5)$(4)INCLUDES) \
73 $$(BUILTIN_$(5)$(4)INCLUDES) \
74 $$(BUILTIN_$(5)$(4)FLAGS) \
75 $$(PROJECT_$(5)$(4)FLAGS) \
76 $$(MODULETYPE$($(1)_TYPE)_$(4)FLAGS) \
77 $$($(1)_$(4)FLAGS) \
78 $(2) \
79 $$($(5)$(4)FLAGS)
80
81 #(module, flags, includes, compiler, prefix)
82 RBUILD_compiler_flags_cpp=\
83 $$($(5)$(4)INCLUDES) $$(CPPINCLUDES) \
84 $(3) \
85 $$($(1)_$(4)INCLUDES) $$($(1)_CPPINCLUDES) \
86 $$(MODULETYPE$($(1)_TYPE)_$(4)INCLUDES) $$(MODULETYPE$($(1)_TYPE)_CPPINCLUDES) \
87 $$(PROJECT_$(5)$(4)INCLUDES) $$(PROJECT_$(5)CPPINCLUDES) \
88 $$(BUILTIN_$(5)$(4)INCLUDES) $$(BUILTIN_$(5)CPPINCLUDES) \
89 $$(BUILTIN_$(5)CPPFLAGS) $$(BUILTIN_$(5)CPPDEFINES) $$(BUILTIN_$(5)$(4)DEFINES) \
90 $$(PROJECT_$(5)CPPFLAGS) $$(PROJECT_$(5)CPPDEFINES) $$(PROJECT_$(5)$(4)DEFINES) \
91 $$(MODULETYPE$($(1)_TYPE)_CPPFLAGS) $$(MODULETYPE$($(1)_TYPE)_CPPDEFINES) $$(MODULETYPE$($(1)_TYPE)_$(4)DEFINES) \
92 $$($(1)_CPPFLAGS) $$($(1)_CPPDEFINES) $$($(1)_$(4)DEFINES) \
93 $(2) \
94 $$(CPPFLAGS) $$(CPPDEFINES) $$($(5)$(4)DEFINES)
95
96 #(module, flags, includes)
97 RBUILD_cflags=${call RBUILD_compiler_flags_with_cpp,$(1),$(2),$(3),C}
98 RBUILD_cxxflags=${call RBUILD_compiler_flags_with_cpp,$(1),$(2),$(3),CXX}
99 #~ RBUILD_asflags=${call RBUILD_compiler_flags_with_cpp,$(1),$(2),$(3),AS}
100 RBUILD_asflags=${call RBUILD_compiler_flags_builtin_cpp,$(1),$(2),$(3),AS}
101 RBUILD_nasmflags=${call RBUILD_compiler_flags_builtin_cpp,$(1),$(2),$(3),NASM}
102 RBUILD_rc_pp_flags=${call RBUILD_compiler_flags_cpp,$(1),-DRC_INVOKED=1 -D__WIN32__=1 -D__FLAT__=1,$(3) -I.,RC}
103 RBUILD_rc_flags=${call RBUILD_compiler_flags_with_includes,$(1),$(2),$(3),RC}
104 RBUILD_spec_pp_flags=${call RBUILD_compiler_flags_cpp,$(1),,$(3),SPEC}
105 RBUILD_spec_flags=${call RBUILD_compiler_flags,$(1),$(2),,SPEC}
106 RBUILD_midlflags=${call RBUILD_compiler_flags_builtin_cpp,$(1),$(2),$(3),MIDL}
107 RBUILD_host_cflags=${call RBUILD_compiler_flags_with_cpp,$(1),$(2),$(3),C,HOST_}
108 RBUILD_host_cxxflags=${call RBUILD_compiler_flags_with_cpp,$(1),$(2),$(3),CXX,HOST_}
109 RBUILD_ldflags=${call RBUILD_compiler_flags,$(1),$(2),,LD}
110
111 RCFLAG_UNICODE:=-DUNICODE -D_UNICODE
112
113 BUILTIN_ASDEFINES+= -D__ASM__
114 BUILTIN_RCFLAGS+= --nostdinc
115 BUILTIN_RCDEFINES+= -DRC_INVOKED
116 BUILTIN_NASMFLAGS+= -f win32
117
118 #(module, source, dependencies, cflags, output)
119 define RBUILD_GAS
120
121 $(2): $${$(1)_precondition}
122
123 ifeq ($(ROS_BUILDDEPS),full)
124
125 $(5).d: $(2) | ${call RBUILD_dir,$(5)}
126 $$(ECHO_DEPENDS)
127 $${gas} -MF $$@ ${call RBUILD_asflags,$(1),$(4)} -M -MP -MT $$@ $$<
128
129 -include $(5).d
130
131 $(5): $(2) $(5).d $(3) | ${call RBUILD_dir,$(5)}
132 $$(ECHO_AS)
133 $${gas} -o $$@ ${call RBUILD_asflags,$(1),$(4)} -c $$<
134
135 else
136
137 $(5): $(2) $(3) | ${call RBUILD_dir,$(5)}
138 $$(ECHO_AS)
139 $${gas} -o $$@ ${call RBUILD_asflags,$(1),$(4)} -c $$<
140
141 endif
142
143 endef
144
145 #(module, source, dependencies, cflags)
146 RBUILD_GAS_RULE=${call RBUILD_GAS,$(1),$(2),$(3),$(4),${call RBUILD_intermediate_path_unique,$(1),$(2)}.o}
147
148 #(module, source, dependencies, cflags, output)
149 define RBUILD_NASM
150
151 $(2): $${$(1)_precondition}
152
153 $(5): $(2) $(3) | ${call RBUILD_dir,$(5)}
154 $$(ECHO_NASM)
155 $${nasm} -o $$@ ${call RBUILD_nasmflags,$(1),$(4)} $$<
156
157 endef
158
159 # TODO: module_dllname -> ${call RBUILD_module_dllname,$(1)}
160
161 #(module, source, dependencies, cflags, module_dllname, output)
162 define RBUILD_WINEBUILD_DEF
163
164 $(6): $(2) $$(winebuild_TARGET) | ${call RBUILD_intermediate_dir,$(6)}
165 $$(ECHO_WINEBLD)
166 $$(Q)$$(winebuild_TARGET) $$(WINEBUILD_FLAGS) -o $$@ --def -E $$< --filename $(5) ${call RBUILD_spec_flags,$(1),$(4)}
167
168 endef
169
170 #(module, source, dependencies, cflags, module_dllname, output)
171 define RBUILD_WINEBUILD_STUBS
172
173 $(6): $(2) $$(winebuild_TARGET) | ${call RBUILD_intermediate_dir,$(6)}
174 $$(ECHO_WINEBLD)
175 $$(Q)$$(winebuild_TARGET) $$(WINEBUILD_FLAGS) -o $$@ --pedll $$< --filename $(5) ${call RBUILD_spec_flags,$(1),$(4)}
176
177 endef
178
179 #(module, source, dependencies, cflags, module_dllname)
180 define RBUILD_WINEBUILD_WITH_CPP_RULE
181
182 ifeq ($$(ROS_BUILDDEPS),full)
183
184 ${call RBUILD_DEPENDS,$(1),$(2),,${call RBUILD_spec_pp_flags,$(1),$(4)},${call RBUILD_intermediate_path_unique,$(1),$(2)}.spec.d}
185 -include ${call RBUILD_intermediate_path_unique,$(1),$(2)}.spec.d
186
187 ${call RBUILD_CPP,$(1),$(2),${call RBUILD_intermediate_path_unique,$(1),$(2)}.spec.d $(3),${call RBUILD_spec_pp_flags,$(1),$(4)},${call RBUILD_intermediate_path_unique,$(1),$(2)}.spec}
188
189 else
190
191 ${call RBUILD_CPP,$(1),$(2),$(3),${call RBUILD_spec_pp_flags,$(1),$(4)},${call RBUILD_intermediate_path_unique,$(1),$(2)}.spec}
192
193 endif
194
195 ${call RBUILD_WINEBUILD_DEF,$(1),${call RBUILD_intermediate_path_unique,$(1),$(2)}.spec,,$(4),$(5),${call RBUILD_intermediate_path_unique,$(1),$(2)}.auto.def}
196 ${call RBUILD_WINEBUILD_STUBS,$(1),${call RBUILD_intermediate_path_unique,$(1),$(2)}.spec,,$(4),$(5),${call RBUILD_intermediate_path_unique,$(1),$(2)}.stubs.c}
197 ${call RBUILD_CC,$(1),${call RBUILD_intermediate_path_unique,$(1),$(2)}.stubs.c,,,${call RBUILD_intermediate_path_unique,$(1),$(2)}.stubs.o}
198
199 endef
200
201 #(module, source, dependencies, cflags, module_dllname)
202 define RBUILD_WINEBUILD_RULE
203
204 ${call RBUILD_WINEBUILD_DEF,$(1),$(2),$(3),$(4),$(5),${call RBUILD_intermediate_path_unique,$(1),$(2)}.auto.def}
205 ${call RBUILD_WINEBUILD_STUBS,$(1),$(2),$(3),$(4),$(5),${call RBUILD_intermediate_path_unique,$(1),$(2)}.stubs.c}
206 ${call RBUILD_CC,$(1),${call RBUILD_intermediate_path_unique,$(1),$(2)}.stubs.c,,,${call RBUILD_intermediate_path_unique,$(1),$(2)}.stubs.o}
207
208 endef
209
210 # FIXME: wrc butchers localized strings and doesn't implement -M, so we have to use an external preprocessor
211 #(module, source, dependencies, cflags)
212 define RBUILD_WRC_RULE
213
214 $(2): $${$(1)_precondition}
215
216 ifeq ($$(ROS_BUILDDEPS),full)
217
218 ${call RBUILD_DEPENDS,$(1),$(2),,${call RBUILD_rc_pp_flags,$(1),$(4)},${call RBUILD_intermediate_path_unique,$(1),$(2)}.res.d}
219 -include ${call RBUILD_intermediate_path_unique,$(1),$(2)}.coff.d
220
221 ${call RBUILD_intermediate_path_unique,$(1),$(2)}.res: $(2) ${call RBUILD_intermediate_path_unique,$(1),$(2)}.res.d $(3) $$(wrc_TARGET) | ${call RBUILD_intermediate_dir,$(2)}
222 $$(ECHO_RC)
223 ${call RBUILD_PIPE_CPP,$$<,${call RBUILD_rc_pp_flags,$(1),$(4)}} | $$(wrc_TARGET) -o $$@ ${call RBUILD_rc_flags,$(1),$(4),-I${call RBUILD_dir,$(2)}}
224
225 else
226
227 ${call RBUILD_intermediate_path_unique,$(1),$(2)}.res: $(2) $(3) $$(wrc_TARGET) | ${call RBUILD_intermediate_dir,$(2)}
228 $$(ECHO_RC)
229 ${call RBUILD_PIPE_CPP,$$<,${call RBUILD_rc_pp_flags,$(1),$(4)}} | $$(wrc_TARGET) -o $$@ ${call RBUILD_rc_flags,$(1),$(4),-I${call RBUILD_dir,$(2)}}
230
231 endif
232
233 ${call RBUILD_intermediate_path_unique,$(1),$(2)}.coff: ${call RBUILD_intermediate_path_unique,$(1),$(2)}.res | ${call RBUILD_intermediate_dir,$(2)}
234 $$(ECHO_CVTRES)
235 $${windres} -i $$< -o $$@ -J res -O coff
236
237 endef
238
239 define RBUILD_WIDL
240
241 endef
242
243 define RBUILD_WIDL_HEADER_RULE
244
245 $(2): $${$(1)_precondition}
246
247 ${call RBUILD_intermediate_path_noext,$(2)}.h: $(2) $(3) $$(widl_TARGET) | ${call RBUILD_intermediate_dir,$(2)}
248 $$(ECHO_WIDL)
249 $$(Q)$$(widl_TARGET) ${call RBUILD_midlflags,$(1),$(4),-I${call RBUILD_dir,$(2)}} -h -H $$@ $$<
250
251 endef
252
253 #(module, source, dependencies, cflags)
254 define RBUILD_WIDL_CLIENT_RULE
255
256 $(2): $${$(1)_precondition}
257
258 ${call RBUILD_intermediate_path_noext,$(2)}_c.c ${call RBUILD_intermediate_path_noext,$(2)}_c.h: $(2) $(3) $$(widl_TARGET) | ${call RBUILD_intermediate_dir,$(2)}
259 $$(ECHO_WIDL)
260 $$(Q)$$(widl_TARGET) ${call RBUILD_midlflags,$(1),$(4),-I${call RBUILD_dir,$(2)}} -h -H ${call RBUILD_intermediate_path_noext,$(2)}_c.h -c -C ${call RBUILD_intermediate_path_noext,$(2)}_c.c $(2)
261
262 ${call RBUILD_CC,$(1),${call RBUILD_intermediate_path_noext,$(2)}_c.c,,,${call RBUILD_intermediate_path_noext,$(2)}_c.o}
263
264 endef
265
266 #(module, source, dependencies, cflags)
267 define RBUILD_WIDL_SERVER_RULE
268
269 $(2): $${$(1)_precondition}
270
271 ${call RBUILD_intermediate_path_noext,$(2)}_s.c ${call RBUILD_intermediate_path_noext,$(2)}_s.h: $(2) $(3) $$(widl_TARGET) | ${call RBUILD_intermediate_dir,$(2)}
272 $$(ECHO_WIDL)
273 $$(Q)$$(widl_TARGET) ${call RBUILD_midlflags,$(1),$(4),-I${call RBUILD_dir,$(2)}} -h -H ${call RBUILD_intermediate_path_noext,$(2)}_s.h -s -S ${call RBUILD_intermediate_path_noext,$(2)}_s.c $(2)
274
275 ${call RBUILD_CC,$(1),${call RBUILD_intermediate_path_noext,$(2)}_s.c,,,${call RBUILD_intermediate_path_noext,$(2)}_s.o}
276
277 endef
278
279 #(module, source, dependencies, cflags)
280 define RBUILD_WIDL_PROXY_RULE
281
282 $(2): $${$(1)_precondition}
283
284 ${call RBUILD_intermediate_path_noext,$(2)}_p.c ${call RBUILD_intermediate_path_noext,$(2)}_p.h: $(2) $(3) $$(widl_TARGET) | ${call RBUILD_intermediate_dir,$(2)}
285 $$(ECHO_WIDL)
286 $$(Q)$$(widl_TARGET) ${call RBUILD_midlflags,$(1),$(4),-I${call RBUILD_dir,$(2)}} -h -H ${call RBUILD_intermediate_path_noext,$(2)}_p.h -p -P ${call RBUILD_intermediate_path_noext,$(2)}_p.c $(2)
287
288 ${call RBUILD_CC,$(1),${call RBUILD_intermediate_path_noext,$(2)}_p.c,,,${call RBUILD_intermediate_path_noext,$(2)}_p.o}
289
290 endef
291
292 #(module, source, dependencies, cflags)
293 define RBUILD_WIDL_INTERFACE_RULE
294
295 $(2): $${$(1)_precondition}
296
297 ${call RBUILD_intermediate_path_noext,$(2)}_i.c: $(2) $(3) $$(widl_TARGET) | ${call RBUILD_intermediate_dir,$(2)}
298 $$(ECHO_WIDL)
299 $$(Q)$$(widl_TARGET) ${call RBUILD_midlflags,$(1),$(4),-I${call RBUILD_dir,$(2)}} -u -U $$@ $$<
300
301 ${call RBUILD_CC,$(1),${call RBUILD_intermediate_path_noext,$(2)}_i.c,,,${call RBUILD_intermediate_path_noext,$(2)}_i.o}
302
303 endef
304
305 # FIXME: this rule sucks
306 #(module, source, dependencies, cflags, bare_dependencies)
307 define RBUILD_WIDL_DLLDATA_RULE
308
309 $(2): $(3) ${$(1)_precondition} $$(widl_TARGET) | ${call RBUILD_intermediate_dir,$(2)}
310 $$(ECHO_WIDL)
311 $$(Q)$$(widl_TARGET) ${call RBUILD_midlflags,$(1),$(4)} --dlldata-only --dlldata=$(2) $(5)
312
313 ${call RBUILD_CC,$(1),$(2),,,${call RBUILD_intermediate_path_noext,$(2)}.o}
314
315 endef
316
317 #(module, source, dependencies, cflags)
318 define RBUILD_WIDL_TLB_RULE
319
320 $(2): $${$(1)_precondition}
321
322 ${call RBUILD_intermediate_dir,$(2)}$$(SEP)$(1).tlb: $(2) $(3) $$(widl_TARGET) | ${call RBUILD_intermediate_dir,$(2)}
323 $$(ECHO_WIDL)
324 $$(Q)$$(widl_TARGET) ${call RBUILD_midlflags,$(1),$(4),-I${call RBUILD_dir,$(2)}} -t -T $$@ $$<
325
326 endef
327
328 #(module, source, dependencies, cflags)
329 define RBUILD_HOST_GCC_RULE
330
331 $(2): $${$(1)_precondition}
332
333 ${call RBUILD_intermediate_path_unique,$(1),$(2)}.o: $(2) $(3) | ${call RBUILD_intermediate_dir,$(2)}
334 $$(ECHO_HOSTCC)
335 $${host_gcc} -o $$@ ${call RBUILD_host_cflags,$(1),$(4)} -c $$<
336
337 endef
338
339 #(module, source, dependencies, cflags)
340 define RBUILD_HOST_GPP_RULE
341
342 $(2): $${$(1)_precondition}
343
344 ${call RBUILD_intermediate_path_unique,$(1),$(2)}.o: $(2) $(3) | ${call RBUILD_intermediate_dir,$(2)}
345 $$(ECHO_HOSTCC)
346 $${host_gpp} -o $$@ ${call RBUILD_host_cxxflags,$(1),$(4)} -c $$<
347
348 endef
349
350 # EOF