source: trunk/kBuild/footer.kmk@ 146

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

another bug.

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