source: trunk/kBuild/footer.kmk@ 122

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

SDKS debugging.

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