source: trunk/kBuild/footer.kmk@ 108

Last change on this file since 108 was 107, checked in by bird, 21 years ago

fixed regression.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 33.9 KB
Line 
1# $Id: footer.kmk 107 2004-06-24 20:45:28Z bird $
2## @file
3#
4# kBuild - File included at top of makefile.
5#
6# Copyright (c) source004 knut st. osmundsen <bird-srcspam@anduin.net>
7#
8#
9# This file is part of kBuild.
10#
11# kBuild is free software; you can redistribute it and/or modify
12# it under the terms of the GNU General Public License as published by
13# the Free Software Foundation; either version source of the License, or
14# (at your option) any later version.
15#
16# kBuild is distributed in the hope that it will be useful,
17# but WITHOUT ANY WARRANTY; without even the implied warranty of
18# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19# GNU General Public License for more details.
20#
21# You should have received a copy of the GNU General Public License
22# along with kBuild; if not, write to the Free Software
23# Foundation, Inc., 59 Temple Place, Suite typetype0, Boston, MA 0sourcetargettargettarget-targettype07 USA
24#
25#
26
27ifndef __footer_kmk__
28# start-of-file-content
29
30#
31# Variables.
32# (Some of these need initialization before including definitions using them.)
33#
34
35# all targets.
36ALL_TARGETS := $(LIBRARIES) $(PROGRAMS) $(DLLS) $(SYSMODS) $(OTHERS)
37
38# dependency files.
39_DEPFILES :=
40
41# All kind of output files except for _OBJS and _DEPFILES.
42# Compiling or linking definition outputting other things that $@ and any
43# required dependency file must add those output files to this variable.
44_OUT_FILES :=
45
46# all of a type
47_OBJS :=
48_LIBS :=
49_DLLS :=
50_EXES :=
51_SYSMODS:=
52_DIRS :=
53
54# all objs of a specific target
55define def_objs_var
56_OBJS_$target :=
57endef
58$(foreach target, $(ALL_TARGETS), $(eval _OBJS_$(target) := ))
59
60
61#
62# Basic macros
63#
64
65## Figure out the tool for a source
66# @param $target source file
67# @param $source normalized main target
68# @param $type tooltype
69_SOURCE_TOOL = $(strip $(firstword \
70 $($(target)_$(source)_$(type)TOOL.$(BUILD_TARGET)) \
71 $($(target)_$(source)_$(type)TOOL) \
72 $($(target)_$(source)_TOOL.$(BUILD_TARGET)) \
73 $($(target)_$(source)_TOOL) \
74 $($(target)_$(type)TOOL.$(BUILD_TARGET)) \
75 $($(target)_$(type)TOOL) \
76 $($(target)_TOOL.$(BUILD_TARGET)) \
77 $($(target)_TOOL) \
78 $($(source)_$(type)TOOL.$(BUILD_TARGET)) \
79 $($(source)_$(type)TOOL) \
80 $($(source)_TOOL.$(BUILD_TARGET)) \
81 $($(source)_TOOL) \
82 $($(type)TOOL.$(BUILD_TARGET)) \
83 $($(type)TOOL) \
84 $(TOOL.$(BUILD_TARGET)) \
85 $(TOOL) ))
86
87_SOURCE_TOOL_OLD = $(strip $(firstword \
88 $($(target)_$(source)_$(type)TOOL.$(BUILD_TARGET)) $($(target)_$(source)_TOOL.$(BUILD_TARGET)) \
89 $($(target)_$(source)_$(type)TOOL) $($target_$source_TOOL) \
90 $($(target)_$(type)TOOL.$(BUILD_TARGET)) $($(target)_TOOL.$(BUILD_TARGET)) \
91 $($(target)_$(type)TOOL) $($target_TOOL) \
92 $($(source)_$(type)TOOL.$(BUILD_TARGET)) $($(source)_TOOL.$(BUILD_TARGET)) \
93 $($(source)_$(type)TOOL) $($(source)_TOOL) \
94 $($(type)TOOL.$(BUILD_TARGET)) $(TOOL.$(BUILD_TARGET)) \
95 $($(type)TOOL) $(TOOL) ))
96
97## Figure out the tool for a target.
98# @param $target normalized target.
99# @param $source tooltype.
100_TARGET_TOOL = $(strip $(firstword \
101 $($(target)_$(source)TOOL.$(BUILD_TARGET)) \
102 $($(target)_$(source)TOOL) \
103 $($(target)_TOOL.$(BUILD_TARGET)) \
104 $($(target)_TOOL) \
105 $($(source)TOOL) \
106 $($(source)TOOL.$(BUILD_TARGET)) \
107 $(TOOL.$(BUILD_TARGET)) \
108 $(TOOL) \
109 ))
110
111## Figure out where to put object files.
112# @param $target source file
113# @param $source normalized main target
114_OBJECT_BASE = $(PATH_TARGET)/$(source)/$(basename $(target))
115
116## Figure out where to put object files.
117# @param $target real target name.
118# @param $source normalized main target
119_TARGET_BASE = $(PATH_TARGET)/$(source)/$(basename $(target))
120
121
122#
123# Include templates
124#
125_TEMPLATES := $(TEMPLATE)
126define def_templates
127ifdef $(target)_TEMPLATE
128_TEMPLATES += $($(target)_TEMPLATE)
129endif
130endef
131$(foreach target, $(ALL_TARGETS), $(eval $(def_templates)))
132_TEMPLATES := $(sort $(_TEMPLATES))
133# $ (warning dbg: _TEMPLATES=$(_TEMPLATES))
134
135define def_templates_include
136ifndef TEMPLATE_$(template)
137include $(firstword $(wildcard $(PATH_KBUILD)/templates/$(template).kmk))
138endif
139endef
140$(foreach template, $(_TEMPLATES), $(eval $(def_templates)))
141
142
143#
144# Common Inheritance
145#
146
147## Inherit defaults property
148# @param $(prop) Property name
149# @param $(target) Target name.
150define def_inherit_defaults_one
151ifndef $(target)_$(prop)
152ifdef $(prop)
153$$(eval $(target)_$(prop) := $($(prop)))
154endif
155endif
156endef
157
158## Inherit default properties for one target.
159# A bit tricky this one, but it depends a bit on whether or not TEMPLATE
160# is inherited from the default properties.
161# @param $(target) Target name
162#
163define def_inherit_defaults
164ifdef $(target)_TEMPLATE
165ifeq ($(strip $(TEMPLATE_$($(target)_TEMPLATE)_TOOL) $(TEMPLATE_$($(target)_TEMPLATE)_TOOL.$(BUILD_TARGET))),)
166$$(foreach prop,TOOL TOOL.$(BUILD_TARGET), $$(eval $$(def_inherit_defaults_one)))
167endif
168ifeq ($(strip $(TEMPLATE_$($(target)_TEMPLATE)_SDKS) $(TEMPLATE_$($(target)_TEMPLATE)_SDKS.$(BUILD_TARGET))),)
169$$(foreach prop,SDKS SDKS.$(BUILD_TARGET), $$(eval $$(def_inherit_defaults_one)))
170endif
171else
172$$(foreach prop,TEMPLATE TOOL TOOL.$(BUILD_TARGET) SDKS SDKS.$(BUILD_TARGET) \
173 ,$$(eval $$(def_inherit_defaults_one)))
174endif
175endef
176# Inherit default properties.
177$(foreach target, $(ALL_TARGETS),$(eval $(def_inherit_defaults)))
178
179
180## Inherit one template property in a accumulative manner.
181# @param $(prop) Property name
182# @param $(target) Target name
183# @todo fix the precedence order for some properties.
184define def_inherit_template_one
185ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop)
186ifndef $(target)_$(prop)
187#$$ (warning dbgtarget: $(target)_$(prop):='$(TEMPLATE_$($(target)_TEMPLATE)_$(prop))' TEMPLATE_$($(target)_TEMPLATE)_$(prop))
188$$(target)_$$(prop) := $$(TEMPLATE_$$($$(target)_TEMPLATE)_$$(prop))
189endif
190endif
191ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(BUILD_TARGET)
192ifndef $(target)_$(prop).$(BUILD_TARGET)
193#$$ (warning dbgsource: $(target)_$(prop).$(BUILD_TARGET)="TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(BUILD_TARGET)" TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(BUILD_TARGET))
194$$(target)_$$(prop).$$(BUILD_TARGET) := $$(TEMPLATE_$$($$(target)_TEMPLATE)_$$(prop).$$(BUILD_TARGET))
195endif
196endif
197endef
198
199## Inherit one template property.
200# @param $(prop) Property name
201# @param $(target) Target name
202define def_inherit_template_one_accumulate
203ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop)
204#$$ (warning dbgtype: TEMPLATE_$($(target)_TEMPLATE)_$(prop) $(target)_$(prop)=$($(target)_$(prop)) $(TEMPLATE_$($(target)_TEMPLATE)_$(prop)))
205$$(eval $(target)_$(prop) := $($(target)_$(prop)) $(TEMPLATE_$($(target)_TEMPLATE)_$(prop)))
206#$$ (warning dbgtype: $(target)_$(prop)=$($(target)_$(prop)))
207endif
208ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(BUILD_TARGET)
209#$$ (warning dbg4: TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(BUILD_TARGET))
210$$(eval $(target)_$(prop).$(BUILD_TARGET) := $($(target)_$(prop).$(BUILD_TARGET)) $(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(BUILD_TARGET)))
211endif
212ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(BUILD_TARGET_CPU)
213#$$ (warning dbg5: TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(BUILD_TARGET_CPU))
214$$(eval $(target)_$(prop).$(BUILD_TARGET_CPU) := $($(target)_$(prop).$(BUILD_TARGET)) $(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(BUILD_TARGET_CPU)))
215endif
216ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(BUILD_TARGET_ARCH)
217#$$ (warning dbg6: TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(BUILD_TARGET_ARCH))
218$$(eval $(target)_$(prop).$(BUILD_TARGET_ARCH) := $($(target)_$(prop).$(BUILD_TARGET)) $(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(BUILD_TARGET_ARCH)))
219endif
220endef
221
222
223## Inherit template properties for on target.
224# @param $(target) Target name.
225define def_inherit_template
226$$(foreach prop, TOOL ARTOOL CTOOL CXXTOOL ASTOOL LDTOOL\
227 ,$$(eval $$(def_inherit_template_one)))
228$$(foreach prop,SDKS DEFS INCS COPTS CFLAGS CDEFS CINCS CXXOPTS CXXFLAGS CXXDEFS CXXINCS ASOPTS ASFLAGS ASDEFS ASINCS LDFLAGS LIBS LIBPATH \
229 ,$$(eval $$(def_inherit_template_one_accumulate)))
230endef
231# Inherit template properties
232$(foreach target, $(ALL_TARGETS),$(eval $(def_inherit_template)))
233
234
235#
236# Include tools
237#
238_TOOLS := $(TOOL)
239define def_tools_target_source
240$(foreach tool,\
241 $($(source)_TOOL.$(BUILD_TARGET)) $($(target)_$(source)_TOOL.$(BUILD_TARGET))\
242 $($(source)_TOOL) $($(target)_$(source)_TOOL)\
243 $($(source)_CTOOL.$(BUILD_TARGET)) $($(target)_$(source)_CTOOL.$(BUILD_TARGET))\
244 $($(source)_CTOOL) $($(target)_$(source)_CTOOL)\
245 $($(source)_CXXTOOL.$(BUILD_TARGET)) $($(target)_$(source)_CXXTOOL.$(BUILD_TARGET))\
246 $($(source)_CXXTOOL) $($(target)_$(source)_CXXTOOL)\
247 $($(source)_ASTOOL.$(BUILD_TARGET)) $($(target)_$(source)_ASTOOL.$(BUILD_TARGET))\
248 $($(source)_ASTOOL) $($(target)_$(source)_ASTOOL)\
249 $($(source)_ARTOOL.$(BUILD_TARGET)) $($(target)_$(source)_ARTOOL.$(BUILD_TARGET))\
250 $($(source)_ARTOOL) $($(target)_$(source)_ARTOOL)\
251 $($(source)_LDTOOL.$(BUILD_TARGET)) $($(target)_$(source)_LDTOOL.$(BUILD_TARGET))\
252 $($(source)_LDTOOL) $($(target)_$(source)_LDTOOL)\
253 ,$(eval _TOOLS += $(tool)))
254endef
255define def_tools_target
256$(foreach tool,\
257 $($(target)_TOOL.$(BUILD_TARGET))\
258 $($(target)_TOOL)\
259 $($(target)_CTOOL.$(BUILD_TARGET))\
260 $($(target)_CTOOL)\
261 $($(target)_CXXTOOL.$(BUILD_TARGET))\
262 $($(target)_CXXTOOL)\
263 $($(target)_ASTOOL.$(BUILD_TARGET))\
264 $($(target)_ASTOOL)\
265 $($(target)_ARTOOL.$(BUILD_TARGET))\
266 $($(target)_ARTOOL)\
267 $($(target)_LDTOOL.$(BUILD_TARGET))\
268 $($(target)_LDTOOL)\
269 ,$(eval _TOOLS += $(tool)))
270$(foreach source, $($(target)_SOURCES), $(eval $(def_tools_target_source)))
271endef
272$(foreach target, $(ALL_TARGETS), $(eval $(def_tools_target)))
273_TOOLS := $(sort $(_TOOLS))
274
275define def_tools_include
276ifndef TOOL_$(tool)
277include $(firstword $(wildcard $(PATH_KBUILD)/tools/$(tool).kmk))
278endif
279endef
280$(foreach tool, $(_TOOLS), $(eval $(def_tools_include)))
281
282
283#
284# Include SDKs
285#
286_SDKS := $(SDKS)
287define def_sdks_target_source
288$(foreach sdk, $($(source)_SDKS) $($(target)_$(source)_SDKS), \
289 $(eval _SDKS += $(sdk)))
290endef
291define def_sdks_target
292$(foreach sdk, $($(target)_SDKS), $(eval _SDKS += $(sdk)))
293$(foreach source, $($(target)_SOURCES), $(eval $(def_sdks_target_source)))
294endef
295$(foreach target, $(ALL_TARGETS), $(eval $(def_sdks_target)))
296_SDKS := $(sort $(_SDKS))
297
298define def_sdks_include
299ifndef SDK_$(sdk)
300include $(firstword $(wildcard $(PATH_KBUILD)/sdks/$(sdk).kmk))
301endif
302endef
303$(foreach sdk, $(_SDKS), $(eval $(def_sdk)))
304
305#
306# Object processing.
307#
308
309## Generic macro for processing C, C++ and Assembly sources.
310# @param $(target) Normalized target name.
311# @param $(source) Source file name.
312# @param $(type) Source type. {C,CXX,AS}
313#
314# @remark I've no clue why I've to $(eval ..) everything in this define. MAKE bug?
315# @remark I now have a clue. Have to use $$ if not.
316define def_target_source_c_cpp_asm
317#$ (warning dbg: def_target_source_c_cpp_asm: source='$(source)' target='$(target)' type='$(type)')
318
319$(eval tool:=$(call _SOURCE_TOOL,$(source),$(target),$(type)))
320$(eval defs :=\
321 $(TOOL_$(tool)_DEFS)\
322 $(TOOL_$(tool)_DEFS.$(BUILD_TYPE))\
323 $(TOOL_$(tool)_DEFS.$(BUILD_TARGET))\
324 $(TOOL_$(tool)_DEFS.$(BUILD_TARGET_ARCH))\
325 $(TOOL_$(tool)_DEFS.$(BUILD_TARGET_CPU))\
326 $(TOOL_$(tool)_$(type)DEFS)\
327 $(TOOL_$(tool)_$(type)DEFS.$(BUILD_TYPE))\
328 $(foreach sdk, $(SDKS.$(BUILD_TARGET)) \
329 $(SDKS.$(BUILD_TYPE)) \
330 $(SDKS),\
331 $(SDK_$(sdk)_DEFS)\
332 $(SDK_$(sdk)_DEFS.$(BUILD_TYPE))\
333 $(SDK_$(sdk)_DEFS.$(BUILD_TARGET))\
334 $(SDK_$(sdk)_DEFS.$(BUILD_TARGET_ARCH))\
335 $(SDK_$(sdk)_DEFS.$(BUILD_TARGET_CPU))
336 $(SDK_$(sdk)_$(type)DEFS)\
337 $(SDK_$(sdk)_$(type)DEFS.$(BUILD_TYPE))\
338 $(SDK_$(sdk)_$(type)DEFS.$(BUILD_TARGET))\
339 $(SDK_$(sdk)_$(type)DEFS.$(BUILD_TARGET_ARCH))\
340 $(SDK_$(sdk)_$(type)DEFS.$(BUILD_TARGET_CPU)))\
341 $(DEFS)\
342 $(DEFS.$(BUILD_TYPE))\
343 $(DEFS.$(BUILD_TARGET))\
344 $(DEFS.$(BUILD_TARGET_ARCH))\
345 $(DEFS.$(BUILD_TARGET_CPU))\
346 $($(type)DEFS)\
347 $($(type)DEFS.$(BUILD_TYPE))\
348 $($(type)DEFS.$(BUILD_TARGET))\
349 $($(type)DEFS.$(BUILD_TARGET_ARCH))\
350 $($(type)DEFS.$(BUILD_TARGET_CPU))\
351 $(foreach sdk, $($(target)_SDKS.$(BUILD_TARGET)) \
352 $($(target)_SDKS.$(BUILD_TYPE)) \
353 $($(target)_SDKS),\
354 $(SDK_$(sdk)_DEFS)\
355 $(SDK_$(sdk)_DEFS.$(BUILD_TYPE))\
356 $(SDK_$(sdk)_DEFS.$(BUILD_TARGET))\
357 $(SDK_$(sdk)_DEFS.$(BUILD_TARGET_ARCH))\
358 $(SDK_$(sdk)_DEFS.$(BUILD_TARGET_CPU))
359 $(SDK_$(sdk)_$(type)DEFS)\
360 $(SDK_$(sdk)_$(type)DEFS.$(BUILD_TYPE))\
361 $(SDK_$(sdk)_$(type)DEFS.$(BUILD_TARGET))\
362 $(SDK_$(sdk)_$(type)DEFS.$(BUILD_TARGET_ARCH))\
363 $(SDK_$(sdk)_$(type)DEFS.$(BUILD_TARGET_CPU)))\
364 $($(target)_DEFS)\
365 $($(target)_DEFS.$(BUILD_TYPE))\
366 $($(target)_DEFS.$(BUILD_TARGET))\
367 $($(target)_DEFS.$(BUILD_TARGET_ARCH))\
368 $($(target)_DEFS.$(BUILD_TARGET_CPU))\
369 $($(target)_$(type)DEFS)\
370 $($(target)_$(type)DEFS.$(BUILD_TYPE))\
371 $($(target)_$(type)DEFS.$(BUILD_TARGET))\
372 $($(target)_$(type)DEFS.$(BUILD_TARGET_ARCH))\
373 $($(target)_$(type)DEFS.$(BUILD_TARGET_CPU))\
374 $(foreach sdk, $($(source)_SDKS.$(BUILD_TARGET)) \
375 $($(source)_SDKS.$(BUILD_TYPE)) \
376 $($(source)_SDKS),\
377 $(SDK_$(sdk)_DEFS)\
378 $(SDK_$(sdk)_DEFS.$(BUILD_TYPE))\
379 $(SDK_$(sdk)_DEFS.$(BUILD_TARGET))\
380 $(SDK_$(sdk)_DEFS.$(BUILD_TARGET_ARCH))\
381 $(SDK_$(sdk)_DEFS.$(BUILD_TARGET_CPU))
382 $(SDK_$(sdk)_$(type)DEFS)\
383 $(SDK_$(sdk)_$(type)DEFS.$(BUILD_TYPE))\
384 $(SDK_$(sdk)_$(type)DEFS.$(BUILD_TARGET))\
385 $(SDK_$(sdk)_$(type)DEFS.$(BUILD_TARGET_ARCH))\
386 $(SDK_$(sdk)_$(type)DEFS.$(BUILD_TARGET_CPU)))\
387 $($(source)_DEFS)\
388 $($(source)_DEFS.$(BUILD_TYPE))\
389 $($(source)_DEFS.$(BUILD_TARGET))\
390 $($(source)_DEFS.$(BUILD_TARGET_ARCH))\
391 $($(source)_DEFS.$(BUILD_TARGET_CPU))\
392 $($(source)_$(type)DEFS)\
393 $($(source)_$(type)DEFS.$(BUILD_TYPE))\
394 $($(source)_$(type)DEFS.$(BUILD_TARGET))\
395 $($(source)_$(type)DEFS.$(BUILD_TARGET_ARCH))\
396 $($(source)_$(type)DEFS.$(BUILD_TARGET_CPU))\
397 $(foreach sdk, $($(target)_$(source)_SDKS.$(BUILD_TARGET)) \
398 $($(target)_$(source)_SDKS.$(BUILD_TYPE)) \
399 $($(target)_$(source)_SDKS),\
400 $(SDK_$(sdk)_DEFS)\
401 $(SDK_$(sdk)_DEFS.$(BUILD_TYPE))\
402 $(SDK_$(sdk)_DEFS.$(BUILD_TARGET))\
403 $(SDK_$(sdk)_DEFS.$(BUILD_TARGET_ARCH))\
404 $(SDK_$(sdk)_DEFS.$(BUILD_TARGET_CPU))
405 $(SDK_$(sdk)_$(type)DEFS)\
406 $(SDK_$(sdk)_$(type)DEFS.$(BUILD_TYPE))\
407 $(SDK_$(sdk)_$(type)DEFS.$(BUILD_TARGET))\
408 $(SDK_$(sdk)_$(type)DEFS.$(BUILD_TARGET_ARCH))\
409 $(SDK_$(sdk)_$(type)DEFS.$(BUILD_TARGET_CPU)))\
410 $($(target)_$(source)_DEFS)\
411 $($(target)_$(source)_DEFS.$(BUILD_TYPE))\
412 $($(target)_$(source)_DEFS.$(BUILD_TARGET))\
413 $($(target)_$(source)_DEFS.$(BUILD_TARGET_ARCH))\
414 $($(target)_$(source)_DEFS.$(BUILD_TARGET_CPU))\
415 $($(target)_$(source)_$(type)DEFS)\
416 $($(target)_$(source)_$(type)DEFS.$(BUILD_TYPE))\
417 $($(target)_$(source)_$(type)DEFS.$(BUILD_TARGET))\
418 $($(target)_$(source)_$(type)DEFS.$(BUILD_TARGET_ARCH))\
419 $($(target)_$(source)_$(type)DEFS.$(BUILD_TARGET_CPU))\
420 )
421$(eval incs :=\
422 $($(target)_$(source)_$(type)INCS.$(BUILD_TARGET_CPU))\
423 $($(target)_$(source)_$(type)INCS.$(BUILD_TARGET_ARCH))\
424 $($(target)_$(source)_$(type)INCS.$(BUILD_TARGET))\
425 $($(target)_$(source)_$(type)INCS.$(BUILD_TYPE))\
426 $($(target)_$(source)_$(type)INCS)\
427 $($(target)_$(source)_INCS.$(BUILD_TARGET_CPU))\
428 $($(target)_$(source)_INCS.$(BUILD_TARGET_ARCH))\
429 $($(target)_$(source)_INCS.$(BUILD_TARGET))\
430 $($(target)_$(source)_INCS.$(BUILD_TYPE))\
431 $($(target)_$(source)_INCS)\
432 $(foreach sdk, $($(target)_$(source)_SDKS.$(BUILD_TARGET)) \
433 $($(target)_$(source)_SDKS.$(BUILD_TYPE)) \
434 $($(target)_$(source)_SDKS),
435 $(SDK_$(sdk)_$(type)INCS.$(BUILD_TARGET_CPU))\
436 $(SDK_$(sdk)_$(type)INCS.$(BUILD_TARGET_ARCH))\
437 $(SDK_$(sdk)_$(type)INCS.$(BUILD_TARGET))\
438 $(SDK_$(sdk)_$(type)INCS.$(BUILD_TYPE))\
439 $(SDK_$(sdk)_$(type)INCS)\
440 $(SDK_$(sdk)_INCS.$(BUILD_TARGET_CPU))\
441 $(SDK_$(sdk)_INCS.$(BUILD_TARGET_ARCH))\
442 $(SDK_$(sdk)_INCS.$(BUILD_TARGET))\
443 $(SDK_$(sdk)_INCS.$(BUILD_TYPE))\
444 $(SDK_$(sdk)_INCS))\
445 $($(source)_$(type)INCS.$(BUILD_TARGET_CPU))\
446 $($(source)_$(type)INCS.$(BUILD_TARGET_ARCH))\
447 $($(source)_$(type)INCS.$(BUILD_TARGET))\
448 $($(source)_$(type)INCS.$(BUILD_TYPE))\
449 $($(source)_$(type)INCS)\
450 $($(source)_INCS.$(BUILD_TARGET_CPU))\
451 $($(source)_INCS.$(BUILD_TARGET_ARCH))\
452 $($(source)_INCS.$(BUILD_TARGET))\
453 $($(source)_INCS.$(BUILD_TYPE))\
454 $($(source)_INCS)\
455 $(foreach sdk, $($(source)_SDKS.$(BUILD_TARGET)) \
456 $($(source)_SDKS.$(BUILD_TYPE)) \
457 $($(source)_SDKS),\
458 $(SDK_$(sdk)_$(type)INCS.$(BUILD_TARGET_CPU))\
459 $(SDK_$(sdk)_$(type)INCS.$(BUILD_TARGET_ARCH))\
460 $(SDK_$(sdk)_$(type)INCS.$(BUILD_TARGET))\
461 $(SDK_$(sdk)_$(type)INCS.$(BUILD_TYPE))\
462 $(SDK_$(sdk)_$(type)INCS)\
463 $(SDK_$(sdk)_INCS.$(BUILD_TARGET_CPU))\
464 $(SDK_$(sdk)_INCS.$(BUILD_TARGET_ARCH))\
465 $(SDK_$(sdk)_INCS.$(BUILD_TARGET))\
466 $(SDK_$(sdk)_INCS.$(BUILD_TYPE))\
467 $(SDK_$(sdk)_INCS))\
468 $($(target)_$(type)INCS.$(BUILD_TARGET_CPU))\
469 $($(target)_$(type)INCS.$(BUILD_TARGET_ARCH))\
470 $($(target)_$(type)INCS.$(BUILD_TARGET))\
471 $($(target)_$(type)INCS.$(BUILD_TYPE))\
472 $($(target)_$(type)INCS)\
473 $($(target)_INCS.$(BUILD_TARGET_CPU))\
474 $($(target)_INCS.$(BUILD_TARGET_ARCH))\
475 $($(target)_INCS.$(BUILD_TARGET))\
476 $($(target)_INCS.$(BUILD_TYPE))\
477 $($(target)_INCS)\
478 $(foreach sdk, $($(target)_SDKS.$(BUILD_TARGET)) \
479 $($(target)_SDKS.$(BUILD_TYPE)) \
480 $($(target)_SDKS),\
481 $(SDK_$(sdk)_$(type)INCS.$(BUILD_TARGET_CPU))\
482 $(SDK_$(sdk)_$(type)INCS.$(BUILD_TARGET_ARCH))\
483 $(SDK_$(sdk)_$(type)INCS.$(BUILD_TARGET))\
484 $(SDK_$(sdk)_$(type)INCS.$(BUILD_TYPE))\
485 $(SDK_$(sdk)_$(type)INCS)\
486 $(SDK_$(sdk)_INCS.$(BUILD_TARGET_CPU))\
487 $(SDK_$(sdk)_INCS.$(BUILD_TARGET_ARCH))\
488 $(SDK_$(sdk)_INCS.$(BUILD_TARGET))\
489 $(SDK_$(sdk)_INCS.$(BUILD_TYPE))\
490 $(SDK_$(sdk)_INCS))\
491 $(INCS.$(BUILD_TARGET_CPU))\
492 $(INCS.$(BUILD_TARGET_ARCH))\
493 $(INCS.$(BUILD_TARGET))\
494 $(INCS.$(BUILD_TYPE))\
495 $(INCS)\
496 $(foreach sdk, $(SDKS.$(BUILD_TARGET)) \
497 $(SDKS.$(BUILD_TYPE)) \
498 $(SDKS),\
499 $(SDK_$(sdk)_$(type)INCS.$(BUILD_TARGET_CPU))\
500 $(SDK_$(sdk)_$(type)INCS.$(BUILD_TARGET_ARCH))\
501 $(SDK_$(sdk)_$(type)INCS.$(BUILD_TARGET))\
502 $(SDK_$(sdk)_$(type)INCS.$(BUILD_TYPE))\
503 $(SDK_$(sdk)_$(type)INCS)\
504 $(SDK_$(sdk)_INCS.$(BUILD_TARGET_CPU))\
505 $(SDK_$(sdk)_INCS.$(BUILD_TARGET_ARCH))\
506 $(SDK_$(sdk)_INCS.$(BUILD_TARGET))\
507 $(SDK_$(sdk)_INCS.$(BUILD_TYPE))\
508 $(SDK_$(sdk)_INCS))\
509 $(TOOL_$(tool)_$(type)INCS.$(BUILD_TARGET_CPU))\
510 $(TOOL_$(tool)_$(type)INCS.$(BUILD_TARGET_ARCH))\
511 $(TOOL_$(tool)_$(type)INCS.$(BUILD_TARGET))\
512 $(TOOL_$(tool)_$(type)INCS.$(BUILD_TYPE))\
513 $(TOOL_$(tool)_$(type)INCS)\
514 )
515$(eval flags :=\
516 $(TOOL_$(tool)_$(type)FLAGS)\
517 $(TOOL_$(tool)_$(type)FLAGS.$(BUILD_TYPE))\
518 $(TOOL_$(tool)_$(type)FLAGS.$(BUILD_TARGET))\
519 $(TOOL_$(tool)_$(type)FLAGS.$(BUILD_TARGET_ARCH))\
520 $(TOOL_$(tool)_$(type)FLAGS.$(BUILD_TARGET_CPU))\
521 $($(type)FLAGS)\
522 $($(type)FLAGS.$(BUILD_TYPE))\
523 $($(type)FLAGS.$(BUILD_TARGET))\
524 $($(type)FLAGS.$(BUILD_TARGET_ARCH))\
525 $($(type)FLAGS.$(BUILD_TARGET_CPU))\
526 $($(target)_$(type)FLAGS)\
527 $($(target)_$(type)FLAGS.$(BUILD_TYPE))\
528 $($(target)_$(type)FLAGS.$(BUILD_TARGET))\
529 $($(target)_$(type)FLAGS.$(BUILD_TARGET_ARCH))\
530 $($(target)_$(type)FLAGS.$(BUILD_TARGET_CPU))\
531 $($(source)_$(type)FLAGS)\
532 $($(source)_$(type)FLAGS.$(BUILD_TYPE))\
533 $($(source)_$(type)FLAGS.$(BUILD_TARGET))\
534 $($(source)_$(type)FLAGS.$(BUILD_TARGET_ARCH))\
535 $($(source)_$(type)FLAGS.$(BUILD_TARGET_CPU))\
536 $($(target)_$(source)_$(type)FLAGS)\
537 $($(target)_$(source)_$(type)FLAGS.$(BUILD_TYPE))\
538 $($(target)_$(source)_$(type)FLAGS.$(BUILD_TARGET))\
539 $($(target)_$(source)_$(type)FLAGS.$(BUILD_TARGET_ARCH))\
540 $($(target)_$(source)_$(type)FLAGS.$(BUILD_TARGET_CPU))\
541 )
542$(eval outbase := $(call _OBJECT_BASE,$(source),$(target)))
543$(eval dirdep := $(dir $(outbase)).dir_created)
544$(eval objsuff := $(firstword \
545 $($(target)_$(source)_OBJSUFF.$(BUILD_TARGET))\
546 $($(target)_$(source)_OBJSUFF)\
547 $($(source)_OBJSUFF.$(BUILD_TARGET))\
548 $($(source)_OBJSUFF)\
549 $($(target)_OBJSUFF.$(BUILD_TARGET))\
550 $($(target)_OBJSUFF)\
551 $(TOOL_$(tool)_$(type)OBJSUFF.$(BUILD_TARGET))\
552 $(TOOL_$(tool)_$(type)OBJSUFF)\
553 $(SUFF_OBJ)\
554 ))
555$(eval obj := $(outbase)$(objsuff))
556$(eval dep := $(outbase)$(SUFF_DEP))
557
558#$ (warning dbg: target=$(target) source=$(source) tool=$(tool) obj=$(obj) dep=$(dep) flags=$(flags) defs=$(defs) incs=$(incs) dirdep=$(dirdep) outbase=$(outbase) objsuff=$(objsuff))
559ifndef TOOL_$(tool)_COMPILE_$(type)
560$$(warning kBuild: TOOL_$(tool)_COMPILE_$(type) is not defined. source=$(source) target=$(target) )
561$$(warning kBuild: tools: \
562 1 $($(target)_$(source)_$(type)TOOL.$(BUILD_TARGET)) \
563 2 $($(target)_$(source)_$(type)TOOL) \
564 3 $($(target)_$(source)_TOOL.$(BUILD_TARGET)) \
565 4 $($(target)_$(source)_TOOL) \
566 5 $($(target)_$(type)TOOL.$(BUILD_TARGET)) \
567 6 $($(target)_$(type)TOOL) \
568 7 $($(target)_TOOL.$(BUILD_TARGET)) \
569 8 $($(target)_TOOL) \
570 9 $($(source)_$(type)TOOL.$(BUILD_TARGET)) \
571 10 $($(source)_$(type)TOOL) \
572 11 $($(source)_TOOL.$(BUILD_TARGET)) \
573 12 $($(source)_TOOL) \
574 13 $($(type)TOOL.$(BUILD_TARGET)) \
575 14 $($(type)TOOL) \
576 15 $(TOOL.$(BUILD_TARGET)) \
577 16 $(TOOL) )
578endif
579$(eval $(TOOL_$(tool)_COMPILE_$(type)))
580
581$(eval _OBJS_$(target) += $(obj))
582$(eval _DEPFILES += $(dep))
583
584endef
585
586## Generic macro for processing all target sources.
587# @param $(target) Normalized target name.
588define def_target_sources
589#$ (warning def_target_sources)
590# C sources
591$(foreach type,C,$(foreach source, $(filter %.c, $($(target)_SOURCES))\
592 ,$(eval $(def_target_source_c_cpp_asm)) ))
593
594# C++ sources
595$(foreach type,CXX,$(foreach source, $(filter %.cpp %.cxx %.xx, $($(target)_SOURCES))\
596 ,$(eval $(def_target_source_c_cpp_asm)) ))
597
598# ASM sources
599$(foreach type,AS,$(foreach source, $(filter %.asm %.s %.S, $($(target)_SOURCES))\
600 ,$(eval $(def_target_source_c_cpp_asm)) ))
601endef
602
603
604#
605# LIBRARIES
606#
607
608## Library (one).
609# @param $(target) Normalized library (target) name.
610define def_lib
611# source -> object
612$(eval $(def_target_sources))
613
614# library
615$(eval tool := $(call _TARGET_TOOL,$(target),AR))
616ifeq ($(tool),)
617$$(error kBuild: Library target $(target) doesn't have a tool defined!)
618endif
619$(eval flags :=\
620 $(TOOL_$(tool)_ARFLAGS)\
621 $(TOOL_$(tool)_ARFLAGS.$(BUILD_TYPE))\
622 $(ARFLAGS)\
623 $(ARFLAGS.$(BUILD_TYPE))\
624 $($(target)_ARFLAGS)\
625 $($(target)_ARFLAGS.$(BUILD_TYPE))\
626 )
627$(eval libsuff := $(firstword\
628 $($(target)_LIBSUFF.$(BUILD_TARGET))\
629 $($(target)_LIBSUFF)\
630 $(TOOL_$(tool)_ARLIBSUFF.$(BUILD_TARGET))\
631 $(TOOL_$(tool)_ARLIBSUFF)\
632 $(SUFF_LIB)\
633))
634## @todo prefix
635$(eval outbase := $(call _TARGET_BASE,$(target),$(target)))
636$(eval lib := $(outbase)$(libsuff))
637$(eval objs = $(_OBJS_$(target)))
638$(eval othersrc := $(filter-out %.c %.cpp %.cxx %.cc %.s %.S %.asm,$($(target)_SOURCES)))
639$(eval dirdep := $(dir $(lib)).dir_created)
640## @todo fix dependencies on makefiles an such
641$(eval deps := )
642
643$(eval $(TOOL_$(tool)_LINK_LIBRARY))
644
645_OBJS += $(_OBJS_$(target))
646_LIBS += $(lib)
647_OUT_FILES += $(lib)
648endef
649
650# Process libraries
651$(foreach target, $(LIBRARIES), $(eval $(def_lib)))
652
653
654
655#
656# PROGRAMS
657#
658
659## Program (one).
660# @param $(target) Normalized target (program) name.
661define def_program
662# source -> object
663$(eval $(def_target_sources))
664
665# library
666$(eval tool := $(call _TARGET_TOOL,$(target),LD))
667$(eval flags :=\
668 $(TOOL_$(tool)_LDFLAGS)\
669 $(TOOL_$(tool)_LDFLAGS.$(BUILD_TYPE))\
670 $(TOOL_$(tool)_LDFLAGS.$(BUILD_TARGET))\
671 $(TOOL_$(tool)_LDFLAGS.$(BUILD_TARGET_ARCH))\
672 $(TOOL_$(tool)_LDFLAGS.$(BUILD_TARGET_CPU))\
673 $(LDFLAGS)\
674 $(LDFLAGS.$(BUILD_TYPE))\
675 $(LDFLAGS.$(BUILD_TARGET))\
676 $(LDFLAGS.$(BUILD_TARGET_ARCH))\
677 $(LDFLAGS.$(BUILD_TARGET_CPU))\
678 $($(target)_LDFLAGS)\
679 $($(target)_LDFLAGS.$(BUILD_TYPE))\
680 $($(target)_LDFLAGS.$(BUILD_TARGET))\
681 $($(target)_LDFLAGS.$(BUILD_TARGET_ARCH))\
682 $($(target)_LDFLAGS.$(BUILD_TARGET_CPU))\
683)
684$(eval exesuff := $(firstword $($(target)_EXESUFF) $($(target)_EXESUFF) $(TOOL_$(tool)_LDEXESUFF) $(SUFF_EXE)))
685$(eval outbase := $(call _TARGET_BASE,$(target),$(target)))
686$(eval exe := $(outbase)$(exesuff))
687$(eval objs = $(_OBJS_$(target)))
688$(eval libs :=\
689 $($(target)_LIBS.$(BUILD_TARGET_CPU))\
690 $($(target)_LIBS.$(BUILD_TARGET_ARCH))\
691 $($(target)_LIBS.$(BUILD_TARGET))\
692 $($(target)_LIBS.$(BUILD_TYPE))\
693 $($(target)_LIBS)\
694 $(LIBS.$(BUILD_TARGET_CPU))\
695 $(LIBS.$(BUILD_TARGET_ARCH))\
696 $(LIBS.$(BUILD_TARGET))\
697 $(LIBS.$(BUILD_TYPE))\
698 $(LIBS)\
699 $(TOOL_$(tool)_LIBS.$(BUILD_TYPE))\
700 $(TOOL_$(tool)_LIBS)\
701)
702$(eval libpath :=\
703 $($(target)_LIBPATH.$(BUILD_TARGET_CPU))\
704 $($(target)_LIBPATH.$(BUILD_TARGET_ARCH))\
705 $($(target)_LIBPATH.$(BUILD_TARGET))\
706 $($(target)_LIBPATH.$(BUILD_TYPE))\
707 $($(target)_LIBPATH)\
708 $(LIBPATH.$(BUILD_TARGET_CPU))\
709 $(LIBPATH.$(BUILD_TARGET_ARCH))\
710 $(LIBPATH.$(BUILD_TARGET))\
711 $(LIBPATH.$(BUILD_TYPE))\
712 $(LIBPATH)\
713 $(TOOL_$(tool)_LIBPATH.$(BUILD_TARGET_CPU))\
714 $(TOOL_$(tool)_LIBPATH.$(BUILD_TARGET_ARCH))\
715 $(TOOL_$(tool)_LIBPATH.$(BUILD_TARGET))\
716 $(TOOL_$(tool)_LIBPATH.$(BUILD_TYPE))\
717 $(TOOL_$(tool)_LIBPATH)\
718)
719$(eval dirdep := $(dir $(exe)).dir_created)
720## @todo fix dependencies
721$(eval deps := )
722#
723$(eval deffile := $(strip $(firstword
724 $($(target)_DEFFILE.$(BUILD_TARGET).$(BUILD_TYPE))\
725 $($(target)_DEFFILE.$(BUILD_TARGET))\
726 $($(target)_DEFFILE.$(BUILD_TYPE))\
727 $($(target)_DEFFILE)\
728 $(DEFFILE.$(BUILD_TARGET).$(BUILD_TYPE))\
729 $(DEFFILE.$(BUILD_TARGET))\
730 $(DEFFILE.$(BUILD_TYPE))\
731 $(DEFFILE)\
732)))
733$(eval custom_pre := $(strip $(firstword
734 $($(target)_CUSTOM_PRE.$(BUILD_TARGET).$(BUILD_TYPE))\
735 $($(target)_CUSTOM_PRE.$(BUILD_TARGET))\
736 $($(target)_CUSTOM_PRE.$(BUILD_TYPE))\
737 $($(target)_CUSTOM_PRE)\
738 $(CUSTOM_PRE.$(BUILD_TARGET).$(BUILD_TYPE))\
739 $(CUSTOM_PRE.$(BUILD_TARGET))\
740 $(CUSTOM_PRE.$(BUILD_TYPE))\
741 $(CUSTOM_PRE)\
742)))
743$(eval custom_post := $(strip $(firstword
744 $($(target)_CUSTOM_POST.$(BUILD_TARGET).$(BUILD_TYPE))\
745 $($(target)_CUSTOM_POST.$(BUILD_TARGET))\
746 $($(target)_CUSTOM_POST.$(BUILD_TYPE))\
747 $($(target)_CUSTOM_POST)\
748 $(CUSTOM_POST.$(BUILD_TARGET).$(BUILD_TYPE))\
749 $(CUSTOM_POST.$(BUILD_TARGET))\
750 $(CUSTOM_POST.$(BUILD_TYPE))\
751 $(CUSTOM_POST)\
752)))
753$(eval othersrc := $(filter-out %.c %.cpp %.cxx %.cc %.s %.S %.asm,$($(target)_SOURCES)))
754
755$(eval $(TOOL_$(tool)_LINK_PROGRAM))
756
757_OBJS += $(_OBJS_$(target))
758_EXES += $(exe)
759_OUT_FILES += $(exe)
760endef
761
762# Process libraries
763$(foreach target, $(PROGRAMS), $(eval $(def_program)))
764
765
766
767#
768# DLLS
769#
770
771
772
773#
774# SYSMODS
775#
776
777## System moduler (one).
778# @param $(target) Normalized target (program) name.
779define def_sysmod
780# source -> object
781$(eval $(def_target_sources))
782
783# library
784$(eval tool := $(call _TARGET_TOOL,$(target),LD))
785$(eval flags :=\
786 $(TOOL_$(tool)_LDFLAGS)\
787 $(TOOL_$(tool)_LDFLAGS.$(BUILD_TYPE))\
788 $(TOOL_$(tool)_LDFLAGS.$(BUILD_TARGET))\
789 $(TOOL_$(tool)_LDFLAGS.$(BUILD_TARGET_ARCH))\
790 $(TOOL_$(tool)_LDFLAGS.$(BUILD_TARGET_CPU))\
791 $(LDFLAGS)\
792 $(LDFLAGS.$(BUILD_TYPE))\
793 $(LDFLAGS.$(BUILD_TARGET))\
794 $(LDFLAGS.$(BUILD_TARGET_ARCH))\
795 $(LDFLAGS.$(BUILD_TARGET_CPU))\
796 $($(target)_LDFLAGS)\
797 $($(target)_LDFLAGS.$(BUILD_TYPE))\
798 $($(target)_LDFLAGS.$(BUILD_TARGET))\
799 $($(target)_LDFLAGS.$(BUILD_TARGET_ARCH))\
800 $($(target)_LDFLAGS.$(BUILD_TARGET_CPU))\
801)
802$(eval syssuff := $(firstword $($(target)_SYSSUFF) $($(target)_SYSSUFF) $(TOOL_$(tool)_LDSYSSUFF) $(SUFF_SYS)))
803$(eval outbase := $(call _TARGET_BASE,$(target),$(target)))
804$(eval sys := $(outbase)$(syssuff))
805$(eval objs = $(_OBJS_$(target)))
806$(eval libs :=\
807 $($(target)_LIBS.$(BUILD_TARGET_CPU))\
808 $($(target)_LIBS.$(BUILD_TARGET_ARCH))\
809 $($(target)_LIBS.$(BUILD_TARGET))\
810 $($(target)_LIBS.$(BUILD_TYPE))\
811 $($(target)_LIBS)\
812 $(LIBS.$(BUILD_TARGET_CPU))\
813 $(LIBS.$(BUILD_TARGET_ARCH))\
814 $(LIBS.$(BUILD_TARGET))\
815 $(LIBS.$(BUILD_TYPE))\
816 $(LIBS)\
817 $(TOOL_$(tool)_LIBS.$(BUILD_TYPE))\
818 $(TOOL_$(tool)_LIBS)\
819)
820$(eval libpath :=\
821 $($(target)_LIBPATH.$(BUILD_TARGET_CPU))\
822 $($(target)_LIBPATH.$(BUILD_TARGET_ARCH))\
823 $($(target)_LIBPATH.$(BUILD_TARGET))\
824 $($(target)_LIBPATH.$(BUILD_TYPE))\
825 $($(target)_LIBPATH)\
826 $(LIBPATH.$(BUILD_TARGET_CPU))\
827 $(LIBPATH.$(BUILD_TARGET_ARCH))\
828 $(LIBPATH.$(BUILD_TARGET))\
829 $(LIBPATH.$(BUILD_TYPE))\
830 $(LIBPATH)\
831 $(TOOL_$(tool)_LIBPATH.$(BUILD_TARGET_CPU))\
832 $(TOOL_$(tool)_LIBPATH.$(BUILD_TARGET_ARCH))\
833 $(TOOL_$(tool)_LIBPATH.$(BUILD_TARGET))\
834 $(TOOL_$(tool)_LIBPATH.$(BUILD_TYPE))\
835 $(TOOL_$(tool)_LIBPATH)\
836)
837$(eval dirdep := $(dir $(sys)).dir_created)
838## @todo fix dependencies
839$(eval deps := )
840#
841$(eval deffile := $(strip $(firstword
842 $($(target)_DEFFILE.$(BUILD_TARGET).$(BUILD_TYPE))\
843 $($(target)_DEFFILE.$(BUILD_TARGET))\
844 $($(target)_DEFFILE.$(BUILD_TYPE))\
845 $($(target)_DEFFILE)\
846 $(DEFFILE.$(BUILD_TARGET).$(BUILD_TYPE))\
847 $(DEFFILE.$(BUILD_TARGET))\
848 $(DEFFILE.$(BUILD_TYPE))\
849 $(DEFFILE)\
850)))
851$(eval custom_pre := $(strip $(firstword
852 $($(target)_CUSTOM_PRE.$(BUILD_TARGET).$(BUILD_TYPE))\
853 $($(target)_CUSTOM_PRE.$(BUILD_TARGET))\
854 $($(target)_CUSTOM_PRE.$(BUILD_TYPE))\
855 $($(target)_CUSTOM_PRE)\
856 $(CUSTOM_PRE.$(BUILD_TARGET).$(BUILD_TYPE))\
857 $(CUSTOM_PRE.$(BUILD_TARGET))\
858 $(CUSTOM_PRE.$(BUILD_TYPE))\
859 $(CUSTOM_PRE)\
860)))
861$(eval custom_post := $(strip $(firstword
862 $($(target)_CUSTOM_POST.$(BUILD_TARGET).$(BUILD_TYPE))\
863 $($(target)_CUSTOM_POST.$(BUILD_TARGET))\
864 $($(target)_CUSTOM_POST.$(BUILD_TYPE))\
865 $($(target)_CUSTOM_POST)\
866 $(CUSTOM_POST.$(BUILD_TARGET).$(BUILD_TYPE))\
867 $(CUSTOM_POST.$(BUILD_TARGET))\
868 $(CUSTOM_POST.$(BUILD_TYPE))\
869 $(CUSTOM_POST)\
870)))
871$(eval othersrc := $(filter-out %.c %.cpp %.cxx %.cc %.s %.S %.asm,$($(target)_SOURCES)))
872
873ifndef TOOL_$(tool)_LINK_SYSMOD
874$$(warning kBuild: TOOL_$(tool)_LINK_SYSMOD is not defined. target=$(target) )
875$$(warning kBuild: tools: \
876 1 $($(target)_$(source)TOOL.$(BUILD_TARGET)) \
877 2 $($(target)_$(source)TOOL) \
878 3 $($(target)_TOOL.$(BUILD_TARGET)) \
879 4 $($(target)_TOOL) \
880 5 $($(source)TOOL) \
881 6 $($(source)TOOL.$(BUILD_TARGET)) \
882 7 $(TOOL.$(BUILD_TARGET)) \
883 8 $(TOOL) )
884endif
885
886$(eval $(TOOL_$(tool)_LINK_SYSMOD))
887
888_OBJS += $(_OBJS_$(target))
889_SYSMODS += $(sys)
890_OUT_FILES += $(sys)
891endef
892
893# Process libraries
894$(foreach target, $(SYSMODS), $(eval $(def_sysmod)))
895
896
897
898#
899# OTHERS
900#
901
902
903
904#
905# DOCS
906#
907
908
909#
910# Directories.
911#
912_OUTPUT_FILES := $(_OBJS) $(_LIBS) $(_EXES) $(_DLLS) $(_SYSMODS)
913_DIRFILES := $(sort $(addsuffix /.dir_created,$(_DIRS)) $(addsuffix .dir_created,$(dir $(_OUTPUT_FILES))))
914
915define def_createdir
916$(dirfile):
917 $(call MSG_Ltarget,Creating directory $$(@D))
918 $(MKDIR) -p $$(@D)
919 @echo dir_created > $$@
920endef
921
922$(foreach dirfile,$(_DIRFILES),$(eval $(def_createdir)))
923
924
925#
926# Include dependency files.
927#
928$(foreach dep,$(wildcard $(_DEPFILES)),$(eval include $(dep)))
929
930
931#
932# PASSES (including directory and makefile walking)
933#
934# Do all the default passes if it's unspecified.
935
936#PASSES ?= needed libraries binaries others publish
937PASSES ?= libraries binaries
938
939## Proritized list of the default makefile when walking subdirectories.
940# The user can overload this list.
941DEFAULT_MAKEFILE ?= Makefile.kmk makefile.kmk Makefile makefile
942
943## Subdir
944# @param $(pass) Lowercase pass name.
945# @param $(PASS) Uppercase pass name.
946# @param $(subdir) Subdirectory
947# @param $(tag) tag to attach to the rule name.
948define def_pass_subdir
949pass_$(pass)$(tag)::
950 $(QUIET)$$(MAKE) -C $(subdir) -f $$(notdir $$(firstword $$(wildcard $$(addprefix $(subdir)/,$$(DEFAULT_MAKEFILE))))) pass_$(pass)
951endef
952
953## Submakefile
954# @param $(pass) Lowercase pass name.
955# @param $(PASS) Uppercase pass name.
956# @param $(makefile) Makefile.
957# @param $(tag) tag to attach to the rule name.
958define def_pass_makefile
959pass_$(pass)$(tag)::
960 $(QUIET)$$(MAKE) -C $(patsubst %/,%,$(dir $(makefile))) -f $(notdir $(makefile)) pass_$(pass)
961endef
962
963
964## Execute a pass.
965# @param $(pass) Lowercase pass name.
966# @param $(PASS) Uppercase pass name.
967define def_pass
968$(eval SUBDIRS_$(PASS) ?= $(SUBDIRS))
969$(eval SUBDIRS_AFTER_$(PASS) ?= $(SUBDIRS_AFTER))
970$(eval MAKEFILES_BEFORE_$(PASS) ?= $(MAKEFILES_BEFORE))
971$(eval MAKEFILES_AFTER_$(PASS) ?= $(MAKEFILES_AFTER))
972
973$(eval tag:=_before)
974$(foreach subdir,$(SUBDIRS_$(PASS)),$(eval $(def_pass_subdir)))
975$(foreach makefile,$(MAKEFILES_BEFORE_$(PASS)),$(eval $(def_pass_makefile)))
976
977$(eval tag:=_after)
978$(foreach subdir,$(SUBDIRS_AFTER_$(PASS)),$(eval $(def_pass_subdir)))
979$(foreach makefile,$(MAKEFILES_AFTER_$(PASS)),$(eval $(def_pass_makefile)))
980
981.NOTPARALLEL: pass_$(pass)_before pass_$(pass)_after
982.PHONY: pass_$(pass) pass_$(pass)_before pass_$(pass)_doit pass_$(pass)_after
983pass_$(pass): \
984 pass_$(pass)_before \
985 pass_$(pass)_doit \
986 pass_$(pass)_after
987
988endef
989
990
991## PASS: needed
992# This pass builds targets which are required for building the rest.
993pass_needed_doit: $(_NEEDEDS)
994pass := needed
995PASS := NEEDED
996$(eval $(def_pass))
997
998## PASS: libraries
999# This pass builds library targets.
1000pass_libraries_doit: $(_LIBS) $(_IMPORT_LIBS) $(_OTHER_LIBRARIES)
1001pass := libraries
1002PASS := LIBRARIES
1003$(eval $(def_pass))
1004
1005## PASS: binaries
1006# This pass builds binary targets, i.e. programs, dlls, system modules and stuff.
1007pass_binaries_doit: $(_DLLS) $(_EXES) $(_SYSMODS) $(_OTHER_BINARIES)
1008pass := binaries
1009PASS := BINARIES
1010$(eval $(def_pass))
1011
1012## PASS: others
1013# This pass builds other targets.
1014pass_others_doit: $(_OTHERS)
1015pass := others
1016PASS := OTHERS
1017$(eval $(def_pass))
1018
1019## PASS: publish
1020# This pass installs the built entities to a sandbox area.
1021pass_publish_doit: publish
1022publish::
1023pass := publish
1024PASS := PUBLISH
1025# $(sort).. not nice.
1026SUBDIRS_PUBLISH ?= $(sort $(SUBDIRS) $(SUBDIRS_LIBRARIES) $(SUBDIRS_BINARIES) $(SUBDIRS_OTHERS))
1027SUBDIRS_AFTER_PUBLISH ?= $(sort $(SUBDIRS_AFTER) $(SUBDIRS_AFTER_LIBRARIES) $(SUBDIRS_AFTER_BINARIES) $(SUBDIRS_AFTER_OTHERS))
1028MAKEFILES_BEFORE_PUBLISH?= $(sort $(MAKEFILES_BEFORE) $(MAKEFILES_BEFORE_LIBRARIES) $(MAKEFILES_BEFORE_BINARIES) $(MAKEFILES_BEFORE_OTHERS))
1029MAKEFILES_AFTER_PUBLISH ?= $(sort $(MAKEFILES_AFTER) $(MAKEFILES_AFTER_LIBRARIES) $(MAKEFILES_AFTER_BINARIES) $(MAKEFILES_AFTER_OTHERS))
1030$(eval $(def_pass))
1031
1032## PASS: packing
1033# This pass processes custom packing rules.
1034pass_packing_doit: packing
1035packing::
1036pass := packing
1037PASS := PACKING
1038$(eval $(def_pass))
1039
1040## PASS: clean
1041# This pass removes all generated files.
1042pass_clean_doit:
1043 $(RM) -f $(_OUT_FILES) $(_OBJS) $(_DEPFILES) $(_DIRFILES)
1044pass := clean
1045PASS := CLEAN
1046$(eval $(def_pass))
1047clean: pass_clean
1048
1049## PASS: nothing
1050# This pass just walks the tree.
1051pass_nothing_doit:
1052 $(call MSG_Ltarget,Did nothing in $(CURDIR))
1053pass := nothing
1054PASS := NOTHING
1055$(eval $(def_pass))
1056nothing: pass_nothing
1057
1058
1059
1060#
1061# THE MAIN RULES
1062#
1063all_recursive: $(foreach pass,$(PASSES),pass_$(pass))
1064
1065rebuild: clean all_recursive
1066
1067
1068# misc shortcuts.
1069target: needed libraries binaries others
1070objects: $(_OBJS)
1071programs: $(_EXES)
1072dlls: $(_DLLS)
1073sysmods: $(_SYSMODS)
1074
1075
1076# end-of-file-content
1077__footer_kmk__ := target
1078endif # __footer_kmk__
Note: See TracBrowser for help on using the repository browser.