source: trunk/kBuild/footer.kmk@ 79

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

..

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 26.7 KB
Line 
1# $Id: footer.kmk 79 2004-06-01 01:39:33Z bird $
2## @file
3#
4# kBuild - File included at top of makefile.
5#
6# Copyright (c) 2004 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 2 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 330, Boston, MA 02111-1307 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) $(DRIVERS) $(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_DIRS :=
52
53# all objs of a specific target
54define def_objs_var
55_OBJS_$1 :=
56endef
57$(foreach target, $(ALL_TARGETS), $(eval _OBJS_$(target) := ))
58
59
60#
61# Basic macros
62#
63
64## Figure out the tool for a source
65# @param $1 source file
66# @param $2 normalized main target
67# @param $3 tooltype
68_SOURCE_TOOL = $(strip $(firstword \
69 $($1_$2_$(3)TOOL.$(BUILD_TARGET)) $($1_$2_TOOL.$(BUILD_TARGET)) \
70 $($1_$2_$(3)TOOL) $($1_$2_TOOL) \
71 $($1_$(3)TOOL.$(BUILD_TARGET)) $($1_TOOL.$(BUILD_TARGET)) \
72 $($1_$(3)TOOL) $($1_TOOL) \
73 $($2_$(3)TOOL.$(BUILD_TARGET)) $($2_TOOL.$(BUILD_TARGET)) \
74 $($2_$(3)TOOL) $($2_TOOL) \
75 $($(3)TOOL.$(BUILD_TARGET)) $(TOOL.$(BUILD_TARGET)) \
76 $($(3)TOOL) $(TOOL) ))
77
78## Figure out the tool for a target.
79# @param $1 normalized target.
80# @param $2 tooltype.
81_TARGET_TOOL = $(strip $(firstword \
82 $($(1)_$(2)TOOL.$(BUILD_TARGET)) $($(1)_$(2)TOOL) \
83 $($(1)_TOOL.$(BUILD_TARGET)) $($(1)_TOOL) \
84 $($(2)TOOL) $($(2)TOOL.$(BUILD_TARGET)) \
85 $(TOOL.$(BUILD_TARGET)) $(TOOL) \
86 ))
87
88## Figure out where to put object files.
89# @param $1 source file
90# @param $2 normalized main target
91_OBJECT_BASE = $(PATH_TARGET)/$(2)/$(basename $(1))
92
93## Figure out where to put object files.
94# @param $1 real target name.
95# @param $2 normalized main target
96_TARGET_BASE = $(PATH_TARGET)/$(2)/$(basename $(1))
97
98
99#
100# Include templates
101#
102_TEMPLATES := $(TEMPLATE)
103define def_templates
104ifdef $(target)_TEMPLATE
105_TEMPLATES += $($(target)_TEMPLATE)
106endif
107endef
108$(foreach target, $(ALL_TARGETS), $(eval $(def_templates)))
109_TEMPLATES := $(sort $(_TEMPLATES))
110# $ (warning dbg: _TEMPLATES=$(_TEMPLATES))
111
112define def_templates_include
113ifndef TEMPLATE_$(template)
114include $(firstword $(wildcard $(PATH_KBUILD)/templates/$(template).kmk))
115endif
116endef
117$(foreach template, $(_TEMPLATES), $(eval $(def_templates)))
118
119
120#
121# Common Inheritance
122#
123
124## Inherit defaults property
125# @param $(prop) Property name
126# @param $(target) Target name.
127define def_inherit_defaults_one
128ifndef $(target)_$(prop)
129ifdef $(prop)
130$(target)_$(prop) := $($(prop))
131endif
132endif
133endef
134
135## Inherit default properties for one target.
136# A bit tricky this one, but it depends a bit on whether or not TEMPLATE
137# is inherited from the default properties.
138# @param $(target) Target name
139#
140define def_inherit_defaults
141ifdef $(target)_TEMPLATE
142ifndef TEMPLATE_$($(target)_TEMPLATE)_TOOL
143$(foreach prop,TOOL, $(eval $(def_inherit_defaults_one)))
144endif
145ifndef TEMPLATE_$($(target)_TEMPLATE)_SDKS
146$(foreach prop,SDKS, $(eval $(def_inherit_defaults_one)))
147endif
148else
149$(foreach prop,TEMPLATE TOOL SDKS,$(eval $(def_inherit_defaults_one)))
150endif
151endef
152# Inherit default properties.
153$(foreach target, $(ALL_TARGETS), $(eval $(def_inherit_defaults)))
154
155
156## Inherit one template property in a accumulative manner.
157# @param $(prop) Property name
158# @param $(target) Target name
159# @todo fix the precedence order for some properties.
160define def_inherit_template_one
161ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop)
162ifndef $(target)_$(prop)
163$(eval $(target)_$(prop) := $(TEMPLATE_$($(target)_TEMPLATE)_$(prop)))
164endif
165endif
166ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(BUILD_TARGET)
167ifndef $(target)_$(prop).$(BUILD_TARGET)
168$(eval $(target)_$(prop).$(BUILD_TARGET) := $(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(BUILD_TARGET)))
169endif
170endif
171endef
172
173## Inherit one template property.
174# @param $(prop) Property name
175# @param $(target) Target name
176define def_inherit_template_one_accumulate
177ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop)
178$(eval $(target)_$(prop) := $($(target)_$(prop)) $(TEMPLATE_$($(target)_TEMPLATE)_$(prop)))
179endif
180ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(BUILD_TARGET)
181$(eval $(target)_$(prop).$(BUILD_TARGET) := $($(target)_$(prop).$(BUILD_TARGET)) $(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(BUILD_TARGET)))
182endif
183ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(BUILD_TARGET_CPU)
184$(eval $(target)_$(prop).$(BUILD_TARGET_CPU) := $($(target)_$(prop).$(BUILD_TARGET)) $(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(BUILD_TARGET_CPU)))
185endif
186ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(BUILD_TARGET_ARCH)
187$(eval $(target)_$(prop).$(BUILD_TARGET_ARCH) := $($(target)_$(prop).$(BUILD_TARGET)) $(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(BUILD_TARGET_ARCH)))
188endif
189endef
190
191## Inherit template properties for on target.
192# @param $(target) Target name.
193define def_inherit_template
194$(foreach prop, TOOL ARTOOL CTOOL CXXTOOL ASTOOL LDTOOL\
195 ,$(eval $(def_inherit_template_one)))
196$(foreach prop,SDKS DEFS INCS COPTS CFLAGS CDEFS CINCS CXXOPTS CXXFLAGS CXXDEFS CXXINCS ASOPTS ASFLAGS ASDEFS ASINCS\
197 ,$(eval $(def_inherit_template_one_accumulate)))
198endef
199# Inherit template properties
200$(foreach target, $(ALL_TARGETS), $(eval $(def_inherit_template)))
201
202
203
204#
205# Include tools
206#
207_TOOLS := $(TOOL)
208define def_tools_target_source
209$(foreach tool,\
210 $($(source)_TOOL.$(BUILD_TARGET)) $($(target)_$(source)_TOOL.$(BUILD_TARGET))\
211 $($(source)_TOOL) $($(target)_$(source)_TOOL)\
212 $($(source)_CTOOL.$(BUILD_TARGET)) $($(target)_$(source)_CTOOL.$(BUILD_TARGET))\
213 $($(source)_CTOOL) $($(target)_$(source)_CTOOL)\
214 $($(source)_CXXTOOL.$(BUILD_TARGET)) $($(target)_$(source)_CXXTOOL.$(BUILD_TARGET))\
215 $($(source)_CXXTOOL) $($(target)_$(source)_CXXTOOL)\
216 $($(source)_ASTOOL.$(BUILD_TARGET)) $($(target)_$(source)_ASTOOL.$(BUILD_TARGET))\
217 $($(source)_ASTOOL) $($(target)_$(source)_ASTOOL)\
218 $($(source)_ARTOOL.$(BUILD_TARGET)) $($(target)_$(source)_ARTOOL.$(BUILD_TARGET))\
219 $($(source)_ARTOOL) $($(target)_$(source)_ARTOOL)\
220 $($(source)_LDTOOL.$(BUILD_TARGET)) $($(target)_$(source)_LDTOOL.$(BUILD_TARGET))\
221 $($(source)_LDTOOL) $($(target)_$(source)_LDTOOL)\
222 ,$(eval _TOOLS += $(tool)))
223endef
224define def_tools_target
225$(foreach tool,\
226 $($(target)_TOOL.$(BUILD_TARGET))\
227 $($(target)_TOOL)\
228 $($(target)_CTOOL.$(BUILD_TARGET))\
229 $($(target)_CTOOL)\
230 $($(target)_CXXTOOL.$(BUILD_TARGET))\
231 $($(target)_CXXTOOL)\
232 $($(target)_ASTOOL.$(BUILD_TARGET))\
233 $($(target)_ASTOOL)\
234 $($(target)_ARTOOL.$(BUILD_TARGET))\
235 $($(target)_ARTOOL)\
236 $($(target)_LDTOOL.$(BUILD_TARGET))\
237 $($(target)_LDTOOL)\
238 ,$(eval _TOOLS += $(tool)))
239$(foreach source, $($(target)_SOURCES), $(eval $(def_tools_target_source)))
240endef
241$(foreach target, $(ALL_TARGETS), $(eval $(def_tools_target)))
242_TOOLS := $(sort $(_TOOLS))
243
244define def_tools_include
245$(warning tool=$(tool))
246ifndef TOOL_$(tool)
247include $(firstword $(wildcard $(PATH_KBUILD)/tools/$(tool).kmk))
248endif
249endef
250$(foreach tool, $(_TOOLS), $(eval $(def_tools_include)))
251
252
253#
254# Include SDKs
255#
256_SDKS := $(SDKS)
257define def_sdks_target_source
258$(foreach sdk, $($(source)_SDKS) $($(target)_$(source)_SDKS), \
259 $(eval _SDKS += $(sdk)))
260endef
261define def_sdks_target
262$(foreach sdk, $($(target)_SDKS), $(eval _SDKS += $(sdk)))
263$(foreach source, $($(target)_SOURCES), $(eval $(def_sdks_target_source)))
264endef
265$(foreach target, $(ALL_TARGETS), $(eval $(def_sdks_target)))
266_SDKS := $(sort $(_SDKS))
267
268define def_sdks_include
269ifndef SDK_$(sdk)
270include $(firstword $(wildcard $(PATH_KBUILD)/sdks/$(sdk).kmk))
271endif
272endef
273$(foreach sdk, $(_SDKS), $(eval $(def_sdk)))
274
275#
276# Object processing.
277#
278
279## Generic macro for processing C, C++ and Assembly sources.
280# @param $(target) Normalized target name.
281# @param $(source) Source file name.
282# @param $(type) Source type. {C,CXX,AS}
283#
284# @remark I've no clue why I've to $(eval ..) everything in this define. MAKE bug?
285define def_target_source_c_cpp_asm
286#$ (warning dbg: def_target_source_c_cpp_asm: source=$(source) target=$(target) type=$(type))
287
288$(eval tool:=$(call _SOURCE_TOOL,$(source),$(target),$(type)))
289$(eval defs :=\
290 $(TOOL_$(tool)_DEFS)\
291 $(TOOL_$(tool)_DEFS.$(BUILD_TYPE))\
292 $(TOOL_$(tool)_DEFS.$(BUILD_TARGET))\
293 $(TOOL_$(tool)_DEFS.$(BUILD_TARGET_ARCH))\
294 $(TOOL_$(tool)_DEFS.$(BUILD_TARGET_CPU))\
295 $(TOOL_$(tool)_$(type)DEFS)\
296 $(TOOL_$(tool)_$(type)DEFS.$(BUILD_TYPE))\
297 $(foreach sdk, $(SDKS.$(BUILD_TARGET)) \
298 $(SDKS.$(BUILD_TYPE)) \
299 $(SDKS),\
300 $(SDK_$(sdk)_DEFS)\
301 $(SDK_$(sdk)_DEFS.$(BUILD_TYPE))\
302 $(SDK_$(sdk)_DEFS.$(BUILD_TARGET))\
303 $(SDK_$(sdk)_DEFS.$(BUILD_TARGET_ARCH))\
304 $(SDK_$(sdk)_DEFS.$(BUILD_TARGET_CPU))
305 $(SDK_$(sdk)_$(type)DEFS)\
306 $(SDK_$(sdk)_$(type)DEFS.$(BUILD_TYPE))\
307 $(SDK_$(sdk)_$(type)DEFS.$(BUILD_TARGET))\
308 $(SDK_$(sdk)_$(type)DEFS.$(BUILD_TARGET_ARCH))\
309 $(SDK_$(sdk)_$(type)DEFS.$(BUILD_TARGET_CPU)))\
310 $(DEFS)\
311 $(DEFS.$(BUILD_TYPE))\
312 $(DEFS.$(BUILD_TARGET))\
313 $(DEFS.$(BUILD_TARGET_ARCH))\
314 $(DEFS.$(BUILD_TARGET_CPU))\
315 $($(type)DEFS)\
316 $($(type)DEFS.$(BUILD_TYPE))\
317 $($(type)DEFS.$(BUILD_TARGET))\
318 $($(type)DEFS.$(BUILD_TARGET_ARCH))\
319 $($(type)DEFS.$(BUILD_TARGET_CPU))\
320 $(foreach sdk, $($(target)_SDKS.$(BUILD_TARGET)) \
321 $($(target)_SDKS.$(BUILD_TYPE)) \
322 $($(target)_SDKS),\
323 $(SDK_$(sdk)_DEFS)\
324 $(SDK_$(sdk)_DEFS.$(BUILD_TYPE))\
325 $(SDK_$(sdk)_DEFS.$(BUILD_TARGET))\
326 $(SDK_$(sdk)_DEFS.$(BUILD_TARGET_ARCH))\
327 $(SDK_$(sdk)_DEFS.$(BUILD_TARGET_CPU))
328 $(SDK_$(sdk)_$(type)DEFS)\
329 $(SDK_$(sdk)_$(type)DEFS.$(BUILD_TYPE))\
330 $(SDK_$(sdk)_$(type)DEFS.$(BUILD_TARGET))\
331 $(SDK_$(sdk)_$(type)DEFS.$(BUILD_TARGET_ARCH))\
332 $(SDK_$(sdk)_$(type)DEFS.$(BUILD_TARGET_CPU)))\
333 $($(target)_DEFS)\
334 $($(target)_DEFS.$(BUILD_TYPE))\
335 $($(target)_DEFS.$(BUILD_TARGET))\
336 $($(target)_DEFS.$(BUILD_TARGET_ARCH))\
337 $($(target)_DEFS.$(BUILD_TARGET_CPU))\
338 $($(target)_$(type)DEFS)\
339 $($(target)_$(type)DEFS.$(BUILD_TYPE))\
340 $($(target)_$(type)DEFS.$(BUILD_TARGET))\
341 $($(target)_$(type)DEFS.$(BUILD_TARGET_ARCH))\
342 $($(target)_$(type)DEFS.$(BUILD_TARGET_CPU))\
343 $(foreach sdk, $($(source)_SDKS.$(BUILD_TARGET)) \
344 $($(source)_SDKS.$(BUILD_TYPE)) \
345 $($(source)_SDKS),\
346 $(SDK_$(sdk)_DEFS)\
347 $(SDK_$(sdk)_DEFS.$(BUILD_TYPE))\
348 $(SDK_$(sdk)_DEFS.$(BUILD_TARGET))\
349 $(SDK_$(sdk)_DEFS.$(BUILD_TARGET_ARCH))\
350 $(SDK_$(sdk)_DEFS.$(BUILD_TARGET_CPU))
351 $(SDK_$(sdk)_$(type)DEFS)\
352 $(SDK_$(sdk)_$(type)DEFS.$(BUILD_TYPE))\
353 $(SDK_$(sdk)_$(type)DEFS.$(BUILD_TARGET))\
354 $(SDK_$(sdk)_$(type)DEFS.$(BUILD_TARGET_ARCH))\
355 $(SDK_$(sdk)_$(type)DEFS.$(BUILD_TARGET_CPU)))\
356 $($(source)_DEFS)\
357 $($(source)_DEFS.$(BUILD_TYPE))\
358 $($(source)_DEFS.$(BUILD_TARGET))\
359 $($(source)_DEFS.$(BUILD_TARGET_ARCH))\
360 $($(source)_DEFS.$(BUILD_TARGET_CPU))\
361 $($(source)_$(type)DEFS)\
362 $($(source)_$(type)DEFS.$(BUILD_TYPE))\
363 $($(source)_$(type)DEFS.$(BUILD_TARGET))\
364 $($(source)_$(type)DEFS.$(BUILD_TARGET_ARCH))\
365 $($(source)_$(type)DEFS.$(BUILD_TARGET_CPU))\
366 $(foreach sdk, $($(target)_$(source)_SDKS.$(BUILD_TARGET)) \
367 $($(target)_$(source)_SDKS.$(BUILD_TYPE)) \
368 $($(target)_$(source)_SDKS),\
369 $(SDK_$(sdk)_DEFS)\
370 $(SDK_$(sdk)_DEFS.$(BUILD_TYPE))\
371 $(SDK_$(sdk)_DEFS.$(BUILD_TARGET))\
372 $(SDK_$(sdk)_DEFS.$(BUILD_TARGET_ARCH))\
373 $(SDK_$(sdk)_DEFS.$(BUILD_TARGET_CPU))
374 $(SDK_$(sdk)_$(type)DEFS)\
375 $(SDK_$(sdk)_$(type)DEFS.$(BUILD_TYPE))\
376 $(SDK_$(sdk)_$(type)DEFS.$(BUILD_TARGET))\
377 $(SDK_$(sdk)_$(type)DEFS.$(BUILD_TARGET_ARCH))\
378 $(SDK_$(sdk)_$(type)DEFS.$(BUILD_TARGET_CPU)))\
379 $($(target)_$(source)_DEFS)\
380 $($(target)_$(source)_DEFS.$(BUILD_TYPE))\
381 $($(target)_$(source)_DEFS.$(BUILD_TARGET))\
382 $($(target)_$(source)_DEFS.$(BUILD_TARGET_ARCH))\
383 $($(target)_$(source)_DEFS.$(BUILD_TARGET_CPU))\
384 $($(target)_$(source)_$(type)DEFS)\
385 $($(target)_$(source)_$(type)DEFS.$(BUILD_TYPE))\
386 $($(target)_$(source)_$(type)DEFS.$(BUILD_TARGET))\
387 $($(target)_$(source)_$(type)DEFS.$(BUILD_TARGET_ARCH))\
388 $($(target)_$(source)_$(type)DEFS.$(BUILD_TARGET_CPU))\
389 )
390$(eval incs :=\
391 $($(target)_$(source)_$(type)INCS.$(BUILD_TARGET_CPU))\
392 $($(target)_$(source)_$(type)INCS.$(BUILD_TARGET_ARCH))\
393 $($(target)_$(source)_$(type)INCS.$(BUILD_TARGET))\
394 $($(target)_$(source)_$(type)INCS.$(BUILD_TYPE))\
395 $($(target)_$(source)_$(type)INCS)\
396 $($(target)_$(source)_INCS.$(BUILD_TARGET_CPU))\
397 $($(target)_$(source)_INCS.$(BUILD_TARGET_ARCH))\
398 $($(target)_$(source)_INCS.$(BUILD_TARGET))\
399 $($(target)_$(source)_INCS.$(BUILD_TYPE))\
400 $($(target)_$(source)_INCS)\
401 $(foreach sdk, $($(target)_$(source)_SDKS.$(BUILD_TARGET)) \
402 $($(target)_$(source)_SDKS.$(BUILD_TYPE)) \
403 $($(target)_$(source)_SDKS),
404 $(SDK_$(sdk)_$(type)INCS.$(BUILD_TARGET_CPU))\
405 $(SDK_$(sdk)_$(type)INCS.$(BUILD_TARGET_ARCH))\
406 $(SDK_$(sdk)_$(type)INCS.$(BUILD_TARGET))\
407 $(SDK_$(sdk)_$(type)INCS.$(BUILD_TYPE))\
408 $(SDK_$(sdk)_$(type)INCS)\
409 $(SDK_$(sdk)_INCS.$(BUILD_TARGET_CPU))\
410 $(SDK_$(sdk)_INCS.$(BUILD_TARGET_ARCH))\
411 $(SDK_$(sdk)_INCS.$(BUILD_TARGET))\
412 $(SDK_$(sdk)_INCS.$(BUILD_TYPE))\
413 $(SDK_$(sdk)_INCS))\
414 $($(source)_$(type)INCS.$(BUILD_TARGET_CPU))\
415 $($(source)_$(type)INCS.$(BUILD_TARGET_ARCH))\
416 $($(source)_$(type)INCS.$(BUILD_TARGET))\
417 $($(source)_$(type)INCS.$(BUILD_TYPE))\
418 $($(source)_$(type)INCS)\
419 $($(source)_INCS.$(BUILD_TARGET_CPU))\
420 $($(source)_INCS.$(BUILD_TARGET_ARCH))\
421 $($(source)_INCS.$(BUILD_TARGET))\
422 $($(source)_INCS.$(BUILD_TYPE))\
423 $($(source)_INCS)\
424 $(foreach sdk, $($(source)_SDKS.$(BUILD_TARGET)) \
425 $($(source)_SDKS.$(BUILD_TYPE)) \
426 $($(source)_SDKS),\
427 $(SDK_$(sdk)_$(type)INCS.$(BUILD_TARGET_CPU))\
428 $(SDK_$(sdk)_$(type)INCS.$(BUILD_TARGET_ARCH))\
429 $(SDK_$(sdk)_$(type)INCS.$(BUILD_TARGET))\
430 $(SDK_$(sdk)_$(type)INCS.$(BUILD_TYPE))\
431 $(SDK_$(sdk)_$(type)INCS)\
432 $(SDK_$(sdk)_INCS.$(BUILD_TARGET_CPU))\
433 $(SDK_$(sdk)_INCS.$(BUILD_TARGET_ARCH))\
434 $(SDK_$(sdk)_INCS.$(BUILD_TARGET))\
435 $(SDK_$(sdk)_INCS.$(BUILD_TYPE))\
436 $(SDK_$(sdk)_INCS))\
437 $($(target)_$(type)INCS.$(BUILD_TARGET_CPU))\
438 $($(target)_$(type)INCS.$(BUILD_TARGET_ARCH))\
439 $($(target)_$(type)INCS.$(BUILD_TARGET))\
440 $($(target)_$(type)INCS.$(BUILD_TYPE))\
441 $($(target)_$(type)INCS)\
442 $($(target)_INCS.$(BUILD_TARGET_CPU))\
443 $($(target)_INCS.$(BUILD_TARGET_ARCH))\
444 $($(target)_INCS.$(BUILD_TARGET))\
445 $($(target)_INCS.$(BUILD_TYPE))\
446 $($(target)_INCS)\
447 $(foreach sdk, $($(target)_SDKS.$(BUILD_TARGET)) \
448 $($(target)_SDKS.$(BUILD_TYPE)) \
449 $($(target)_SDKS),\
450 $(SDK_$(sdk)_$(type)INCS.$(BUILD_TARGET_CPU))\
451 $(SDK_$(sdk)_$(type)INCS.$(BUILD_TARGET_ARCH))\
452 $(SDK_$(sdk)_$(type)INCS.$(BUILD_TARGET))\
453 $(SDK_$(sdk)_$(type)INCS.$(BUILD_TYPE))\
454 $(SDK_$(sdk)_$(type)INCS)\
455 $(SDK_$(sdk)_INCS.$(BUILD_TARGET_CPU))\
456 $(SDK_$(sdk)_INCS.$(BUILD_TARGET_ARCH))\
457 $(SDK_$(sdk)_INCS.$(BUILD_TARGET))\
458 $(SDK_$(sdk)_INCS.$(BUILD_TYPE))\
459 $(SDK_$(sdk)_INCS))\
460 $(INCS.$(BUILD_TARGET_CPU))\
461 $(INCS.$(BUILD_TARGET_ARCH))\
462 $(INCS.$(BUILD_TARGET))\
463 $(INCS.$(BUILD_TYPE))\
464 $(INCS)\
465 $(foreach sdk, $(SDKS.$(BUILD_TARGET)) \
466 $(SDKS.$(BUILD_TYPE)) \
467 $(SDKS),\
468 $(SDK_$(sdk)_$(type)INCS.$(BUILD_TARGET_CPU))\
469 $(SDK_$(sdk)_$(type)INCS.$(BUILD_TARGET_ARCH))\
470 $(SDK_$(sdk)_$(type)INCS.$(BUILD_TARGET))\
471 $(SDK_$(sdk)_$(type)INCS.$(BUILD_TYPE))\
472 $(SDK_$(sdk)_$(type)INCS)\
473 $(SDK_$(sdk)_INCS.$(BUILD_TARGET_CPU))\
474 $(SDK_$(sdk)_INCS.$(BUILD_TARGET_ARCH))\
475 $(SDK_$(sdk)_INCS.$(BUILD_TARGET))\
476 $(SDK_$(sdk)_INCS.$(BUILD_TYPE))\
477 $(SDK_$(sdk)_INCS))\
478 $(TOOL_$(tool)_$(type)INCS.$(BUILD_TARGET_CPU))\
479 $(TOOL_$(tool)_$(type)INCS.$(BUILD_TARGET_ARCH))\
480 $(TOOL_$(tool)_$(type)INCS.$(BUILD_TARGET))\
481 $(TOOL_$(tool)_$(type)INCS.$(BUILD_TYPE))\
482 $(TOOL_$(tool)_$(type)INCS)\
483 )
484$(eval flags :=\
485 $(TOOL_$(tool)_$(type)FLAGS)\
486 $(TOOL_$(tool)_$(type)FLAGS.$(BUILD_TYPE))\
487 $(TOOL_$(tool)_$(type)FLAGS.$(BUILD_TARGET))\
488 $(TOOL_$(tool)_$(type)FLAGS.$(BUILD_TARGET_ARCH))\
489 $(TOOL_$(tool)_$(type)FLAGS.$(BUILD_TARGET_CPU))\
490 $($(type)FLAGS)\
491 $($(type)FLAGS.$(BUILD_TYPE))\
492 $($(type)FLAGS.$(BUILD_TARGET))\
493 $($(type)FLAGS.$(BUILD_TARGET_ARCH))\
494 $($(type)FLAGS.$(BUILD_TARGET_CPU))\
495 $($(target)_$(type)FLAGS)\
496 $($(target)_$(type)FLAGS.$(BUILD_TYPE))\
497 $($(target)_$(type)FLAGS.$(BUILD_TARGET))\
498 $($(target)_$(type)FLAGS.$(BUILD_TARGET_ARCH))\
499 $($(target)_$(type)FLAGS.$(BUILD_TARGET_CPU))\
500 $($(source)_$(type)FLAGS)\
501 $($(source)_$(type)FLAGS.$(BUILD_TYPE))\
502 $($(source)_$(type)FLAGS.$(BUILD_TARGET))\
503 $($(source)_$(type)FLAGS.$(BUILD_TARGET_ARCH))\
504 $($(source)_$(type)FLAGS.$(BUILD_TARGET_CPU))\
505 $($(target)_$(source)_$(type)FLAGS)\
506 $($(target)_$(source)_$(type)FLAGS.$(BUILD_TYPE))\
507 $($(target)_$(source)_$(type)FLAGS.$(BUILD_TARGET))\
508 $($(target)_$(source)_$(type)FLAGS.$(BUILD_TARGET_ARCH))\
509 $($(target)_$(source)_$(type)FLAGS.$(BUILD_TARGET_CPU))\
510 )
511$(eval outbase := $(call _OBJECT_BASE,$(source),$(target)))
512$(eval dirdep := $(dir $(outbase)).dir_created)
513$(eval objsuff := $(firstword \
514 $($(target)_$(source)_OBJSUFF.$(BUILD_TARGET))\
515 $($(target)_$(source)_OBJSUFF)\
516 $($(source)_OBJSUFF.$(BUILD_TARGET))\
517 $($(source)_OBJSUFF)\
518 $($(target)_OBJSUFF.$(BUILD_TARGET))\
519 $($(target)_OBJSUFF)\
520 $(TOOL_$(tool)_$(type)OBJSUFF.$(BUILD_TARGET))\
521 $(TOOL_$(tool)_$(type)OBJSUFF)\
522 $(SUFF_OBJ)\
523 ))
524$(eval obj := $(outbase)$(objsuff))
525$(eval dep := $(outbase)$(SUFF_DEP))
526
527#$ (warning dbg: target=$(target) source=$(source) tool=$(tool) obj=$(obj) dep=$(dep) flags=$(flags) defs=$(defs) incs=$(incs) dirdep=$(dirdep) outbase=$(outbase) objsuff=$(objsuff))
528$(eval $(TOOL_$(tool)_COMPILE_$(type)))
529
530$(eval _OBJS_$(target) += $(obj))
531$(eval _DEPFILES += $(dep))
532
533endef
534
535## Generic macro for processing all target sources.
536# @param $(target) Normalized target name.
537define def_target_sources
538#$ (warning def_target_sources)
539# C sources
540$(foreach type,C,$(foreach source, $(filter %.c, $($(target)_SOURCES))\
541 ,$(eval $(def_target_source_c_cpp_asm)) ))
542
543# C++ sources
544$(foreach type,CXX,$(foreach source, $(filter %.cpp, $($(target)_SOURCES)) $(filter %.cxx, $($(target)_SOURCES)) $(filter %.cc, $($(target)_SOURCES))\
545 ,$(eval $(def_target_source_c_cpp_asm)) ))
546
547# ASM sources
548$(foreach type,AS,$(foreach source, $(filter %.asm, $($(target)_SOURCES)) $(filter %.s, $($(target)_SOURCES)) $(filter %.S, $($(target)_SOURCES))\
549 ,$(eval $(def_target_source_c_cpp_asm)) ))
550endef
551
552
553#
554# LIBRARIES
555#
556
557## Library (one).
558# @param $(target) Normalized library (target) name.
559define def_lib
560# source -> object
561$(eval $(def_target_sources))
562
563# library
564$(eval tool := $(call _TARGET_TOOL,$(target),AR))
565ifeq ($(tool),)
566$$(error kBuild: Library target $(target) doesn't have a tool defined!)
567endif
568$(eval flags :=\
569 $(TOOL_$(tool)_ARFLAGS)\
570 $(TOOL_$(tool)_ARFLAGS.$(BUILD_TYPE))\
571 $(ARFLAGS)\
572 $(ARFLAGS.$(BUILD_TYPE))\
573 $($(target)_ARFLAGS)\
574 $($(target)_ARFLAGS.$(BUILD_TYPE))\
575 )
576$(eval libsuff := $(firstword\
577 $($(target)_LIBSUFF.$(BUILD_TARGET))\
578 $($(target)_LIBSUFF)\
579 $(TOOL_$(tool)_ARLIBSUFF.$(BUILD_TARGET))\
580 $(TOOL_$(tool)_ARLIBSUFF)\
581 $(SUFF_LIB)\
582))
583## @todo prefix
584$(eval outbase := $(call _TARGET_BASE,$(target),$(target)))
585$(eval lib := $(outbase)$(libsuff))
586$(eval objs = $(_OBJS_$(target)))
587$(eval dirdep := $(dir $(lib)).dir_created)
588## @todo fix dependencies on makefiles an such
589$(eval deps := )
590
591$(eval $(TOOL_$(tool)_LINK_LIBRARY))
592
593_OBJS += $(_OBJS_$(target))
594_LIBS += $(lib)
595_OUT_FILES += $(lib)
596endef
597
598# Process libraries
599$(foreach target, $(LIBRARIES), $(eval $(def_lib)))
600
601
602
603#
604# PROGRAMS
605#
606
607## Program (one).
608# @param $(target) Normalized target (program) name.
609define def_program
610# source -> object
611$(eval $(def_target_sources))
612
613# library
614$(eval tool := $(call _TARGET_TOOL,$(target),LD))
615$(eval flags :=\
616 $(TOOL_$(tool)_LDFLAGS)\
617 $(TOOL_$(tool)_LDFLAGS.$(BUILD_TYPE))\
618 $(LDFLAGS)\
619 $(LDFLAGS.$(BUILD_TYPE))\
620 $($(target)_LDFLAGS)\
621 $($(target)_LDFLAGS.$(BUILD_TYPE))\
622)
623$(eval exesuff := $(firstword $($(target)_EXESUFF) $($(target)_EXESUFF) $(TOOL_$(tool)_LDEXESUFF) $(SUFF_EXE)))
624$(eval outbase := $(call _TARGET_BASE,$(target),$(target)))
625$(eval exe := $(outbase)$(exesuff))
626$(eval objs = $(_OBJS_$(target)))
627$(eval libs :=\
628 $($(target)_LIBS.$(BUILD_TYPE))\
629 $($(target)_LIBS)\
630 $(LIBS.$(BUILD_TYPE))\
631 $(LIBS)\
632 $(TOOL_$(tool)_LIBS.$(BUILD_TYPE))\
633 $(TOOL_$(tool)_LIBS)\
634)
635$(eval libpath :=\
636 $($(target)_LIBPATH.$(BUILD_TYPE))\
637 $($(target)_LIBPATH)\
638 $(LIBPATH.$(BUILD_TYPE))\
639 $(LIBPATH)\
640 $(TOOL_$(tool)_LIBPATH.$(BUILD_TYPE))\
641 $(TOOL_$(tool)_LIBPATH)\
642)
643$(eval dirdep := $(dir $(exe)).dir_created)
644## @todo fix dependencies
645$(eval deps := )
646#
647$(eval deffile := $(strip $(firstword
648 $($(target)_DEFFILE.$(BUILD_TARGET).$(BUILD_TYPE))\
649 $($(target)_DEFFILE.$(BUILD_TARGET))\
650 $($(target)_DEFFILE.$(BUILD_TYPE))\
651 $($(target)_DEFFILE)\
652 $(DEFFILE.$(BUILD_TARGET).$(BUILD_TYPE))\
653 $(DEFFILE.$(BUILD_TARGET))\
654 $(DEFFILE.$(BUILD_TYPE))\
655 $(DEFFILE)\
656)))
657$(eval custom_pre := $(strip $(firstword
658 $($(target)_CUSTOM_PRE.$(BUILD_TARGET).$(BUILD_TYPE))\
659 $($(target)_CUSTOM_PRE.$(BUILD_TARGET))\
660 $($(target)_CUSTOM_PRE.$(BUILD_TYPE))\
661 $($(target)_CUSTOM_PRE)\
662 $(CUSTOM_PRE.$(BUILD_TARGET).$(BUILD_TYPE))\
663 $(CUSTOM_PRE.$(BUILD_TARGET))\
664 $(CUSTOM_PRE.$(BUILD_TYPE))\
665 $(CUSTOM_PRE)\
666)))
667$(eval custom_post := $(strip $(firstword
668 $($(target)_CUSTOM_POST.$(BUILD_TARGET).$(BUILD_TYPE))\
669 $($(target)_CUSTOM_POST.$(BUILD_TARGET))\
670 $($(target)_CUSTOM_POST.$(BUILD_TYPE))\
671 $($(target)_CUSTOM_POST)\
672 $(CUSTOM_POST.$(BUILD_TARGET).$(BUILD_TYPE))\
673 $(CUSTOM_POST.$(BUILD_TARGET))\
674 $(CUSTOM_POST.$(BUILD_TYPE))\
675 $(CUSTOM_POST)\
676)))
677
678$(eval $(TOOL_$(tool)_LINK_PROGRAM))
679
680_OBJS += $(_OBJS_$(target))
681_EXES += $(exe)
682_OUT_FILES += $(exe)
683endef
684
685# Process libraries
686$(foreach target, $(PROGRAMS), $(eval $(def_program)))
687
688
689
690#
691# DLLS
692#
693
694
695
696#
697# DRIVERS
698#
699
700
701
702#
703# OTHERS
704#
705
706
707
708#
709# DOCS
710#
711
712
713#
714# Directories.
715#
716_OUTPUT_FILES := $(_OBJS) $(_LIBS) $(_EXES) $(_DLLS)
717_DIRFILES := $(sort $(addsuffix /.dir_created,$(_DIRS)) $(addsuffix .dir_created,$(dir $(_OUTPUT_FILES))))
718
719define def_createdir
720$(dirfile):
721 $(call MSG_L1,Creating directory $$(@D))
722 $(MKDIR) -p $$(@D)
723 @echo dir_created > $$@
724endef
725
726$(foreach dirfile,$(_DIRFILES),$(eval $(def_createdir)))
727
728
729#
730# Include dependency files.
731#
732$(foreach dep,$(wildcard $(_DEPFILES)),$(eval include $(dep)))
733
734
735#
736# PASSES (including directory and makefile walking)
737#
738# Do all the default passes if it's unspecified.
739PASSES ?= needed libraries binaries others publish
740
741## Proritized list of the default makefile when walking subdirectories.
742# The user can overload this list.
743DEFAULT_MAKEFILE ?= Makefile.kmk makefile.kmk Makefile makefile
744
745## Subdir
746# @param $(pass) Lowercase pass name.
747# @param $(PASS) Uppercase pass name.
748# @param $(subdir) Subdirectory
749# @param $(tag) tag to attach to the rule name.
750define def_pass_subdir
751pass_$(pass)$(tag)::
752 $(QUIET)$$(MAKE) -C $(subdir) -f $$(notdir $$(firstword $$(wildcard $$(addprefix $(subdir)/,$$(DEFAULT_MAKEFILE))))) pass_$(pass)
753endef
754
755## Submakefile
756# @param $(pass) Lowercase pass name.
757# @param $(PASS) Uppercase pass name.
758# @param $(makefile) Makefile.
759# @param $(tag) tag to attach to the rule name.
760define def_pass_makefile
761pass_$(pass)$(tag)::
762 $(QUIET)$$(MAKE) -C $(patsubst %/,%,$(dir $(makefile))) -f $(notdir $(makefile)) pass_$(pass)
763endef
764
765
766## Execute a pass.
767# @param $(pass) Lowercase pass name.
768# @param $(PASS) Uppercase pass name.
769define def_pass
770$(eval SUBDIRS_$(PASS) ?= $(SUBDIRS))
771$(eval SUBDIRS_AFTER_$(PASS) ?= $(SUBDIRS_AFTER))
772$(eval MAKEFILES_BEFORE_$(PASS) ?= $(MAKEFILES_BEFORE))
773$(eval MAKEFILES_AFTER_$(PASS) ?= $(MAKEFILES_AFTER))
774
775$(eval tag:=_before)
776$(foreach subdir,$(SUBDIRS_$(PASS)),$(eval $(def_pass_subdir)))
777$(foreach makefile,$(MAKEFILES_BEFORE_$(PASS)),$(eval $(def_pass_makefile)))
778
779$(eval tag:=_after)
780$(foreach subdir,$(SUBDIRS_AFTER_$(PASS)),$(eval $(def_pass_subdir)))
781$(foreach makefile,$(MAKEFILES_AFTER_$(PASS)),$(eval $(def_pass_makefile)))
782
783.NOTPARALLEL: pass_$(pass)_before pass_$(pass)_after
784.PHONY: pass_$(pass) pass_$(pass)_before pass_$(pass)_doit pass_$(pass)_after
785pass_$(pass): \
786 pass_$(pass)_before \
787 pass_$(pass)_doit \
788 pass_$(pass)_after
789
790endef
791
792
793## PASS: needed
794# This pass builds targets which are required for building the rest.
795pass_needed_doit: $(_NEEDEDS)
796pass := needed
797PASS := NEEDED
798$(eval $(def_pass))
799
800## PASS: libraries
801# This pass builds library targets.
802pass_libraries_doit: $(_LIBS) $(_IMPORT_LIBS) $(_OTHER_LIBRARIES)
803pass := libraries
804PASS := LIBRARIES
805$(eval $(def_pass))
806
807## PASS: binaries
808# This pass builds binary targets, i.e. programs, dlls, drivers and stuff.
809pass_binaries_doit: $(_DLLS) $(_EXES) $(_KMODS) $(_OTHER_BINARIES)
810pass := binaries
811PASS := BINARIES
812$(eval $(def_pass))
813
814## PASS: others
815# This pass builds binary targets, i.e. programs, dlls, drivers and stuff.
816pass_others_doit: $(_OTHERS)
817pass := others
818PASS := OTHERS
819$(eval $(def_pass))
820
821## PASS: publish
822# This pass installs the built entities to a sandbox area.
823pass_publish_doit: publish
824publish::
825pass := publish
826PASS := PUBLISH
827# $(sort).. not nice.
828SUBDIRS_PUBLISH ?= $(sort $(SUBDIRS) $(SUBDIRS_LIBRARIES) $(SUBDIRS_BINARIES) $(SUBDIRS_OTHERS))
829SUBDIRS_AFTER_PUBLISH ?= $(sort $(SUBDIRS_AFTER) $(SUBDIRS_AFTER_LIBRARIES) $(SUBDIRS_AFTER_BINARIES) $(SUBDIRS_AFTER_OTHERS))
830MAKEFILES_BEFORE_PUBLISH?= $(sort $(MAKEFILES_BEFORE) $(MAKEFILES_BEFORE_LIBRARIES) $(MAKEFILES_BEFORE_BINARIES) $(MAKEFILES_BEFORE_OTHERS))
831MAKEFILES_AFTER_PUBLISH ?= $(sort $(MAKEFILES_AFTER) $(MAKEFILES_AFTER_LIBRARIES) $(MAKEFILES_AFTER_BINARIES) $(MAKEFILES_AFTER_OTHERS))
832$(eval $(def_pass))
833
834## PASS: packing
835# This pass processes custom packing rules.
836pass_packing_doit: packing
837packing::
838pass := packing
839PASS := PACKING
840$(eval $(def_pass))
841
842## PASS: clean
843# This pass removes all generated files.
844pass_clean_doit:
845 $(RM) -f $(_OUT_FILES) $(_OBJS) $(_DEPFILES) $(_DIRFILES)
846pass := clean
847PASS := CLEAN
848$(eval $(def_pass))
849clean: pass_clean
850
851## PASS: nothing
852# This pass just walks the tree.
853pass_nothing_doit:
854 $(call MSG_L1,Did nothing in $(CURDIR))
855pass := nothing
856PASS := NOTHING
857$(eval $(def_pass))
858nothing: pass_nothing
859
860
861
862#
863# THE MAIN RULES
864#
865all_recursive: $(foreach pass,$(PASSES),pass_$(pass))
866
867rebuild: clean all_recursive
868
869
870# misc shortcuts.
871target: needed libraries binaries others
872objects: $(_OBJS)
873programs: $(_EXES)
874dlls: $(_DLLS)
875kernelmodules: $(_KMODS)
876
877
878# end-of-file-content
879__footer_kmk__ := 1
880endif # __footer_kmk__
Note: See TracBrowser for help on using the repository browser.