source: trunk/kBuild/footer.kmk@ 1672

Last change on this file since 1672 was 1672, checked in by bird, 17 years ago

Global USES differs from target USES and must be executed before any inherting because they may add target properties. Added a unit callout prior to source processing.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 115.0 KB
Line 
1# $Id: footer.kmk 1672 2008-07-07 21:38:57Z bird $
2## @file
3# kBuild - File included at top of makefile.
4#
5
6#
7# Copyright (c) 2004-2008 knut st. osmundsen <bird-kBuild-spam@anduin.net>
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 330, Boston, MA 02111-1307 USA
24#
25#
26# As a special exception you are granted permission to include this file, via
27# the kmk include directive, as you wish without this in itself causing the
28# resulting makefile, program or whatever to be covered by the GPL license.
29# This exception does not however invalidate any other reasons why the makefile,
30# program, whatever should not be covered the GPL.
31#
32#
33
34ifndef __footer_kmk__
35# start-of-file-content
36ifdef KBUILD_PROFILE_SELF
37 _KBUILD_TS_FOOTER_START := $(nanots )
38 $(info prof: $(int-sub $(_KBUILD_TS_FOOTER_START), $(_KBUILD_TS_HEADER_START)) - $(int-sub $(_KBUILD_TS_FOOTER_START), $(_KBUILD_TS_PREV)) - start of footer.kmk)
39 $(info stat: $(make-stats ))
40 _KBUILD_TS_PREV := $(_KBUILD_TS_FOOTER_START)
41endif
42
43#
44# Variables.
45# (Some of these need initialization before including definitions using them.)
46#
47
48# All targets of each types.
49_ALL_BLDPROGS := $(BLDPROGS) $(BLDPROGS.$(KBUILD_HOST)) $(BLDPROGS.$(KBUILD_HOST).$(KBUILD_HOST_ARCH)) $(BLDPROGS.$(KBUILD_HOST_ARCH)) $(BLDPROGS.$(KBUILD_HOST_CPU)) $(BLDPROGS.$(KBUILD_TYPE))
50_ALL_LIBRARIES := $(LIBRARIES) $(LIBRARIES.$(KBUILD_TARGET)) $(LIBRARIES.$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)) $(LIBRARIES.$(KBUILD_TARGET_ARCH)) $(LIBRARIES.$(KBUILD_TARGET_CPU)) $(LIBRARIES.$(KBUILD_TYPE))
51_ALL_IMPORT_LIBS := $(IMPORT_LIBS) $(IMPORT_LIBS.$(KBUILD_TARGET)) $(IMPORT_LIBS.$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)) $(IMPORT_LIBS.$(KBUILD_TARGET_ARCH)) $(IMPORT_LIBS.$(KBUILD_TARGET_CPU)) $(IMPORT_LIBS.$(KBUILD_TYPE))
52_ALL_DLLS := $(DLLS) $(DLLS.$(KBUILD_TARGET)) $(DLLS.$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)) $(DLLS.$(KBUILD_TARGET_ARCH)) $(DLLS.$(KBUILD_TARGET_CPU)) $(DLLS.$(KBUILD_TYPE))
53_ALL_PROGRAMS := $(PROGRAMS) $(PROGRAMS.$(KBUILD_TARGET)) $(PROGRAMS.$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)) $(PROGRAMS.$(KBUILD_TARGET_ARCH)) $(PROGRAMS.$(KBUILD_TARGET_CPU)) $(PROGRAMS.$(KBUILD_TYPE))
54_ALL_SYSMODS := $(SYSMODS) $(SYSMODS.$(KBUILD_TARGET)) $(SYSMODS.$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)) $(SYSMODS.$(KBUILD_TARGET_ARCH)) $(SYSMODS.$(KBUILD_TARGET_CPU)) $(SYSMODS.$(KBUILD_TYPE))
55_ALL_OTHERS := $(OTHERS) $(OTHERS.$(KBUILD_TARGET)) $(OTHERS.$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)) $(OTHERS.$(KBUILD_TARGET_ARCH)) $(OTHERS.$(KBUILD_TARGET_CPU)) $(OTHERS.$(KBUILD_TYPE))
56_ALL_INSTALLS := $(INSTALLS) $(INSTALLS.$(KBUILD_TARGET)) $(INSTALLS.$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)) $(INSTALLS.$(KBUILD_TARGET_ARCH)) $(INSTALLS.$(KBUILD_TARGET_CPU)) $(INSTALLS.$(KBUILD_TYPE))
57_ALL_FETCHES := $(FETCHES) $(FETCHES.$(KBUILD_TARGET)) $(FETCHES.$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)) $(FETCHES.$(KBUILD_TARGET_ARCH)) $(FETCHES.$(KBUILD_TARGET_CPU)) $(FETCHES.$(KBUILD_TYPE))
58_ALL_PATCHES := $(PATCHES) $(PATCHES.$(KBUILD_TARGET)) $(PATCHES.$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)) $(PATCHES.$(KBUILD_TARGET_ARCH)) $(PATCHES.$(KBUILD_TARGET_CPU)) $(PATCHES.$(KBUILD_TYPE))
59
60# all targets.
61_ALL_TARGETS = \
62 $(_ALL_FETCHES) \
63 $(_ALL_PATCHES) \
64 $(_ALL_BLDPROGS) \
65 $(_ALL_LIBRARIES) \
66 $(_ALL_IMPORT_LIBS) \
67 $(_ALL_DLLS) \
68 $(_ALL_PROGRAMS) \
69 $(_ALL_SYSMODS) \
70 $(_ALL_INSTALLS) \
71 $(_ALL_OTHERS)
72
73# all $(KBUILD_TARGET) targets.
74_ALL_TARGET_TARGETS = \
75 $(_ALL_FETCHES) \
76 $(_ALL_PATCHES) \
77 $(_ALL_LIBRARIES) \
78 $(_ALL_IMPORT_LIBS) \
79 $(_ALL_DLLS) \
80 $(_ALL_PROGRAMS) \
81 $(_ALL_SYSMODS) \
82 $(_ALL_INSTALLS) \
83 $(_ALL_OTHERS)
84
85# all $(KBUILD_HOST) targets.
86_ALL_HOST_TARGETS = \
87 $(_ALL_BLDPROGS)
88
89# all targets making use of srcname.
90_ALL_SRCNAME_TARGETS = \
91 $(_ALL_FETCHES) \
92 $(_ALL_PATCHES)
93
94# dependency files.
95_DEPFILES :=
96
97# included dependency files.
98_DEPFILES_INCLUDED :=
99
100
101# All kind of output files except for _OBJS and _DEPFILES.
102# Compiling or linking definition outputting other things that $@ and any
103# required dependency file must add those output files to this variable.
104_OUT_FILES :=
105
106# Files which only requires cleaning up.
107_CLEAN_FILES :=
108
109# all of a type
110_OBJS :=
111_FETCHES :=
112_DOWNLOADS:=
113_UNPACKS :=
114_PATCHES :=
115_UNFETCHES:=
116_BLDPROGS :=
117_LIBS :=
118_DLLS :=
119_PROGRAMS :=
120_SYSMODS :=
121_INSTALLS :=
122_INSTALLS_FILES :=
123_INSTALLS_DIRS :=
124_OTHERS :=
125_PACKING :=
126_DIRS := $(PATH_TARGET)/ $(PATH_TARGET) $(BLDDIRS)
127_IMPORT_LIBS :=
128
129# misc
130pass_prev :=
131
132
133
134#
135# Footer macros
136#
137
138## Figure out the tool for a target.
139# @param $1 normalized target.
140# @param $2 tooltype.
141# @param bld_trg build target.
142# @param bld_trg_arch build target architecture.
143_TARGET_TOOL = $(strip $(firstword \
144 $($(1)_$(2)TOOL.$(bld_trg).$(bld_trg_arch)) \
145 $($(1)_$(2)TOOL.$(bld_trg)) \
146 $($(1)_$(2)TOOL) \
147 $($(1)_TOOL.$(bld_trg).$(bld_trg_arch)) \
148 $($(1)_TOOL.$(bld_trg)) \
149 $($(1)_TOOL) \
150 $($(2)TOOL.$(bld_trg).$(bld_trg_arch)) \
151 $($(2)TOOL.$(bld_trg)) \
152 $($(2)TOOL) \
153 $(TOOL.$(bld_trg).$(bld_trg_arch)) \
154 $(TOOL.$(bld_trg)) \
155 $(TOOL) \
156 ))
157
158## Figure out the actual name of an installed file.
159# @param $1 The file to install.
160# @param $2 The target name.
161# @param $3 The _INST value (can be empty).
162# @param $4 The default directory to use when $3 is empty.
163_INSTALL_FILE = $(patsubst %/,%/$(notdir $(1)),$(if $(3),$(PATH_INS)/$(3),$(4)/))
164
165
166
167## Inherit one keyword in a non-accumulative manner.
168# @param $(trg) Target object.
169# @param $(prop) The property.
170# @param $(src_key) Source keyword.
171# @param $(trg_key) Target keyword.
172define def_inherit_one_keyword
173ifdef $(trg)_$(prop).$(src_key)
174 ifndef $(trg)_$(prop).$(trg_key)
175 $(trg)_$(prop).$(trg_key) = $($(trg)_$(prop).$(src_key))
176 endif
177endif
178endef
179
180
181# EXPAND_BY = overriding
182
183## Inherit one keyword in a non-accumulative manner.
184# @param $(trg) Target object.
185# @param $(prop) The property.
186# @param $(src_key) Source keyword.
187# @param $(trg_key) Target keyword.
188define def_inherit_one_keyword_overriding_now_l
189ifdef $(trg)_$(prop).$(src_key)
190 ifndef $(trg)_$(prop).$(trg_key)
191 $(trg)_$(prop).$(trg_key) := $($(trg)_$(prop).$(src_key))
192 endif
193endif
194endef
195
196## @copydoc def_inherit_one_overriding_now_l
197define def_inherit_one_keyword_overriding_now_r
198ifdef $(trg)_$(prop).$(src_key)
199 ifndef $(trg)_$(prop).$(trg_key)
200 $(trg)_$(prop).$(trg_key) := $($(trg)_$(prop).$(src_key))
201 endif
202endif
203endef
204
205## Inherit one keyword in a non-accumulative manner, deferred expansion.
206# @param $(trg) Target object.
207# @param $(prop) The property.
208# @param $(src_key) Source keyword.
209# @param $(trg_key) Target keyword.
210# @remark This define relies on double evaluation
211define def_inherit_one_keyword_overriding_deferred
212ifdef $(trg)_$(prop).$(src_key)
213 ifndef $(trg)_$(prop).$(trg_key)
214 $(trg)_$(prop).$(trg_key) = $$($(trg)_$(prop).$(src_key))
215 endif
216endif
217endef
218
219## @copydoc def_inherit_one_overriding_deferred
220define def_inherit_one_keyword_overriding_deferred_l
221ifdef $(trg)_$(prop).$(src_key)
222 ifndef $(trg)_$(prop).$(trg_key)
223 $(trg)_$(prop).$(trg_key) = $$($(trg)_$(prop).$(src_key))
224 endif
225endif
226endef
227
228## @copydoc def_inherit_one_overriding_deferred
229define def_inherit_one_keyword_overriding_deferred_r
230ifdef $(trg)_$(prop).$(src_key)
231 ifndef $(trg)_$(prop).$(trg_key)
232 $(trg)_$(prop).$(trg_key) = $$($(trg)_$(prop).$(src_key))
233 endif
234endif
235endef
236
237
238# EXPAND_BY = prepending
239
240## Inherit one keyword in a prepending manner.
241# @param $(trg) Target object.
242# @param $(prop) The property.
243# @param $(src_key) Source keyword.
244# @param $(trg_key) Target keyword.
245define def_inherit_one_keyword_prepending_now_l
246ifdef $(trg)_$(prop).$(src_key)
247 $(trg)_$(prop).$(trg_key) := $($(trg)_$(prop).$(src_key)) $($(trg)_$(prop).$(trg_key))
248endif
249endef
250
251## @copydoc def_inherit_one_prepending_now_l
252define def_inherit_one_keyword_prepending_now_r
253ifdef $(trg)_$(prop).$(src_key)
254 $(trg)_$(prop).$(trg_key) := $($(trg)_$(prop).$(trg_key)) $($(trg)_$(prop).$(src_key))
255endif
256endef
257
258## Inherit one keyword in a non-accumulative manner, deferred expansion.
259# @param $(trg) Target object.
260# @param $(prop) The property.
261# @param $(src_key) Source keyword.
262# @param $(trg_key) Target keyword.
263# @remark This define relies on double evaluation
264define def_inherit_one_keyword_prepending_deferred
265ifdef $(trg)_$(prop).$(src_key)
266 ifndef $(trg)_$(prop).$(trg_key)
267 $(trg)_$(prop).$(trg_key) = $$($(trg)_$(prop).$(src_key))
268 endif
269endif
270endef
271
272## Inherit one keyword in a prepending manner, deferred expansion.
273# @param $(trg) Target object.
274# @param $(prop) The property.
275# @param $(src_key) Source keyword.
276# @param $(trg_key) Target keyword.
277define def_inherit_one_keyword_prepending_deferred_l
278ifdef $(trg)_$(prop).$(src_key)
279 $(trg)_$(prop).$(trg_key) <= $$($(trg)_$(prop).$(src_key))
280endif
281endef
282
283## @copydoc def_inherit_one_prepending_deferred_l
284define def_inherit_one_keyword_prepending_deferred_r
285ifdef $(trg)_$(prop).$(src_key)
286 $(trg)_$(prop).$(trg_key) += $$($(trg)_$(prop).$(src_key))
287endif
288endef
289
290
291# EXPAND_BY = appending
292
293## Inherit one keyword in an appending manner.
294# @param $(trg) Target object.
295# @param $(prop) The property.
296# @param $(src_key) Source keyword.
297# @param $(trg_key) Target keyword.
298define def_inherit_one_keyword_appending_now_l
299ifdef $(trg)_$(prop).$(src_key)
300 $(trg)_$(prop).$(trg_key) := $($(trg)_$(prop).$(trg_key)) $($(trg)_$(prop).$(src_key))
301endif
302endef
303
304## @copydoc def_inherit_one_appending_now_l
305define def_inherit_one_keyword_appending_now_r
306ifdef $(trg)_$(prop).$(src_key)
307 $(trg)_$(prop).$(trg_key) := $($(trg)_$(prop).$(src_key)) $($(trg)_$(prop).$(trg_key))
308endif
309endef
310
311## Inherit one keyword in a non-accumulative manner, deferred expansion.
312# @param $(trg) Target object.
313# @param $(prop) The property.
314# @param $(src_key) Source keyword.
315# @param $(trg_key) Target keyword.
316# @remark This define relies on double evaluation
317define def_inherit_one_keyword_appending_deferred
318ifdef $(trg)_$(prop).$(src_key)
319 ifndef $(trg)_$(prop).$(trg_key)
320 $(trg)_$(prop).$(trg_key) = $$($(trg)_$(prop).$(src_key))
321 endif
322endif
323endef
324
325## Inherit one keyword in an appending manner, deferred expansion.
326# @param $(trg) Target object.
327# @param $(prop) The property.
328# @param $(src_key) Source keyword.
329# @param $(trg_key) Target keyword.
330define def_inherit_one_keyword_appending_deferred_l
331ifdef $(trg)_$(prop).$(src_key)
332 $(trg)_$(prop).$(trg_key) += $$($(trg)_$(prop).$(src_key))
333endif
334endef
335
336## @copydoc def_inherit_one_appending_deferred_l
337define def_inherit_one_keyword_appending_deferred_r
338ifdef $(trg)_$(prop).$(src_key)
339 $(trg)_$(prop).$(trg_key) <= $$($(trg)_$(prop).$(src_key))
340endif
341endef
342
343
344## Worker fro def_inherit that deals with one keyword that makes
345# use of inheritance.
346# @param prefix_keyword key_prefix:keyword. The cool join/split game as usual.
347# @param trg Object to consider for inheriting.
348# @param properties List of the properties with straight expansion.
349# @param properties_now_l List of the properties with immediate expansion, accumulating on the left side.
350# @param properties_now_r List of the properties with immediate expansion, accumulating on the right side.
351# @param properties_deferred List of the properties with deferred expansion (e.g. function), non-accumulative .
352# @param properties_deferred_l List of the properties with deferred expansion (e.g. function), accumulating on the left side.
353# @param properties_deferred_r List of the properties with deferred expansion (e.g. function), accumulating on the right side.
354define def_inherit_keyword
355local prefix := $(word 1,$(subst :, ,$(prefix_keyword)))
356local trg_key := $(word 2,$(subst :, ,$(prefix_keyword)))
357local src_key := $($(prefix)_$(trg_key)_EXTENDS)
358local by := $($(prefix)_$(trg_key)_EXTENDS_BY)
359
360# Inherit the properties.
361$(foreach prop, $(properties), $(eval $(def_inherit_one_keyword)))
362$(foreach prop, $(properties_now_l), $(eval $(def_inherit_one_keyword_$(by)_now_l)))
363$(foreach prop, $(properties_now_r), $(eval $(def_inherit_one_keyword_$(by)_now_r)))
364$(foreach prop, $(properties_deferred), $(eval $(def_inherit_one_keyword_$(by)_deferred)))
365$(foreach prop, $(properties_deferred_l), $(eval $(def_inherit_one_keyword_$(by)_deferred_l)))
366$(foreach prop, $(properties_deferred_r), $(eval $(def_inherit_one_keyword_$(by)_deferred_r)))
367
368endef # def_inherit_keyword
369
370
371## Inherit one template property in a non-accumulative manner.
372# @param $(prop) Property name
373# @param $(src) Source (parent) object.
374# @param $(trg) Target (child) object.
375define def_inherit_one
376ifdef $(src)_$(prop)
377 ifndef $(trg)_$(prop)
378 $(trg)_$(prop) = $($(src)_$(prop))
379 endif
380endif
381endef
382
383
384# EXPAND_BY = overriding
385
386## Inherit one template property in a non-accumulative manner.
387# @param $(prop) Property name
388# @param $(src) Source (parent) object.
389# @param $(trg) Target (child) object.
390define def_inherit_one_overriding_now_l
391ifdef $(src)_$(prop)
392 ifndef $(trg)_$(prop)
393 $(trg)_$(prop) := $($(src)_$(prop))
394 endif
395endif
396endef
397
398## @copydoc def_inherit_one_overriding_now_l
399define def_inherit_one_overriding_now_r
400ifdef $(src)_$(prop)
401 ifndef $(trg)_$(prop)
402 $(trg)_$(prop) := $($(src)_$(prop))
403 endif
404endif
405endef
406
407## Inherit one template property in a non-accumulative manner, deferred expansion.
408# @param $(prop) Property name
409# @param $(src) Source
410# @param $(trg) Target
411# @remark This define relies on double evaluation
412define def_inherit_one_overriding_deferred
413ifdef $(src)_$(prop)
414 ifndef $(trg)_$(prop)
415 $(trg)_$(prop) = $$($(src)_$(prop))
416 endif
417endif
418endef
419
420## @copydoc def_inherit_one_overriding_deferred
421define def_inherit_one_overriding_deferred_l
422ifdef $(src)_$(prop)
423 ifndef $(trg)_$(prop)
424 $(trg)_$(prop) = $$($(src)_$(prop))
425 endif
426endif
427endef
428
429## @copydoc def_inherit_one_overriding_deferred
430define def_inherit_one_overriding_deferred_r
431ifdef $(src)_$(prop)
432 ifndef $(trg)_$(prop)
433 $(trg)_$(prop) = $$($(src)_$(prop))
434 endif
435endif
436endef
437
438
439# EXPAND_BY = prepending
440
441## Inherit one template property in a prepending manner.
442# @param $(prop) Property name
443# @param $(src) Source (parent) object.
444# @param $(trg) Target (child) object.
445define def_inherit_one_prepending_now_l
446ifdef $(src)_$(prop)
447 $(trg)_$(prop) := $($(src)_$(prop)) $($(trg)_$(prop))
448endif
449endef
450
451## @copydoc def_inherit_one_prepending_now_l
452define def_inherit_one_prepending_now_r
453ifdef $(src)_$(prop)
454 $(trg)_$(prop) := $($(trg)_$(prop)) $($(src)_$(prop))
455endif
456endef
457
458## Inherit one template property in a non-accumulative manner, deferred expansion.
459# @param $(prop) Property name
460# @param $(src) Source
461# @param $(trg) Target
462# @remark This define relies on double evaluation
463define def_inherit_one_prepending_deferred
464ifdef $(src)_$(prop)
465 ifndef $(trg)_$(prop)
466 $(trg)_$(prop) = $$($(src)_$(prop))
467 endif
468endif
469endef
470
471## Inherit one template property in a prepending manner, deferred expansion.
472# @param $(prop) Property name
473# @param $(src) Source (parent) object.
474# @param $(trg) Target (child) object.
475define def_inherit_one_prepending_deferred_l
476ifdef $(src)_$(prop)
477 $(trg)_$(prop) <= $$($(src)_$(prop))
478endif
479endef
480
481## @copydoc def_inherit_one_prepending_deferred_l
482define def_inherit_one_prepending_deferred_r
483ifdef $(src)_$(prop)
484 $(trg)_$(prop) += $$($(src)_$(prop))
485endif
486endef
487
488
489# EXPAND_BY = appending
490
491## Inherit one template property in an appending manner.
492# @param $(prop) Property name
493# @param $(src) Source (parent) object.
494# @param $(trg) Target (child) object.
495define def_inherit_one_appending_now_l
496ifdef $(src)_$(prop)
497 $(trg)_$(prop) := $($(trg)_$(prop)) $($(src)_$(prop))
498endif
499endef
500
501## @copydoc def_inherit_one_appending_now_l
502define def_inherit_one_appending_now_r
503ifdef $(src)_$(prop)
504 $(trg)_$(prop) := $($(src)_$(prop)) $($(trg)_$(prop))
505endif
506endef
507
508## Inherit one template property in a non-accumulative manner, deferred expansion.
509# @param $(prop) Property name
510# @param $(src) Source
511# @param $(trg) Target
512# @remark This define relies on double evaluation
513define def_inherit_one_appending_deferred
514ifdef $(src)_$(prop)
515 ifndef $(trg)_$(prop)
516 $(trg)_$(prop) = $$($(src)_$(prop))
517 endif
518endif
519endef
520
521## Inherit one template property in an appending manner, deferred expansion.
522# @param $(prop) Property name
523# @param $(src) Source (parent) object.
524# @param $(trg) Target (child) object.
525define def_inherit_one_appending_deferred_l
526ifdef $(src)_$(prop)
527 $(trg)_$(prop) += $$($(src)_$(prop))
528endif
529endef
530
531## @copydoc def_inherit_one_appending_deferred_l
532define def_inherit_one_appending_deferred_r
533ifdef $(src)_$(prop)
534 $(trg)_$(prop) <= $$($(src)_$(prop))
535endif
536endef
537
538
539## combines the specified properties $(1) with the $(_KEYWORDS) list.
540_INHERIT_JOIN_KEYWORDS = $(1) $(foreach keyword,$(_KEYWORDS), $(addsuffix .$(keyword), $(1)))
541
542
543## Generic inheritance for use with targets templates and tools.
544# @param trg Object to consider for inheriting.
545# @param src_prefix What to prefix the value found in EXTENDS with to get the object.
546# @param load_function Load function for stuff that needs
547# @param properties List of the properties with straight expansion.
548# @param properties_now_l List of the properties with immediate expansion, accumulating on the left side.
549# @param properties_now_r List of the properties with immediate expansion, accumulating on the right side.
550# @param properties_deferred List of the properties with deferred expansion (e.g. function), non-accumulative .
551# @param properties_deferred_l List of the properties with deferred expansion (e.g. function), accumulating on the left side.
552# @param properties_deferred_r List of the properties with deferred expansion (e.g. function), accumulating on the right side.
553define def_inherit
554
555# Load it - loading is a mess, fix.
556ifneq ($(load_function),)
557 local loading := $(patsubst $(src_prefix)%,%,$(trg))
558 $(evalvalctx $(load_function))
559endif
560
561local src := $(strip $($(trg)_EXTENDS))
562ifneq ($(src),)
563 ifndef $(trg)_EXTENDS_STATUS_
564 $(trg)_EXTENDS_STATUS_ := 0
565
566 # Load the source.
567 ifneq ($(load_function),)
568 local loading := $(src)
569 $(evalvalctx $(load_function))
570 endif
571
572 # less typing.
573 local src := $(src_prefix)$(src)
574
575 # Recursivly process the parent (src) if it's inherting from somebody too.
576 ifdef $(src)_EXTENDS
577 ifneq ($($(src)_EXTENDS_STATUS_),42)
578 # 'foreach' will create 'trg' in a new variable context hiding
579 # out current variable. 'src' OTOH will be overwritten.
580 $(foreach trg, $(src), $(evalval def_inherit))
581 local src := $(src_prefix)$(strip $($(trg)_EXTENDS))
582 endif
583 endif
584
585 # Get & check EXTENDS_BY.
586 local by = $(strip $($(trg)_EXTENDS_BY))
587 ifeq ($(by),)
588 local by = overriding
589 else ifn1of ($(by), overriding appending prepending)
590 $(error kBuild: Invalid EXTENDS_BY value '$(by)' on '$(trg)'!)
591 endif
592
593 # Inherit the properties.
594 $(foreach prop, $(call _INHERIT_JOIN_KEYWORDS,$(properties)), $(eval $(def_inherit_one)))
595 $(foreach prop, $(call _INHERIT_JOIN_KEYWORDS,$(properties_now_l)), $(eval $(def_inherit_one_$(by)_now_l)))
596 $(foreach prop, $(call _INHERIT_JOIN_KEYWORDS,$(properties_now_r)), $(eval $(def_inherit_one_$(by)_now_r)))
597 $(foreach prop, $(call _INHERIT_JOIN_KEYWORDS,$(properties_deferred)), $(eval $(def_inherit_one_$(by)_deferred)))
598 $(foreach prop, $(call _INHERIT_JOIN_KEYWORDS,$(properties_deferred_l)), $(eval $(def_inherit_one_$(by)_deferred_l)))
599 $(foreach prop, $(call _INHERIT_JOIN_KEYWORDS,$(properties_deferred_r)), $(eval $(def_inherit_one_$(by)_deferred_r)))
600
601 # Mark the target as done.
602 $(trg)_EXTENDS_STATUS_ := 42
603 else
604 # Check for inheritance loops.
605 ifneq ($($(trg)_EXTENDS_STATUS_),42)
606 $(error kBuild: Target inheritance loop! target=$(trg) $(trg)_EXTENDS_STATUS_=$($(trg)_EXTENDS_STATUS_))
607 endif
608 endif
609endif
610
611# Keyword inheritance.
612$(foreach prefix_keyword, $(join $(_KEYWORDS_PREFIX), $(addprefix :,$(_KEYWORDS_EXTENDS))), $(evalval def_inherit_keyword))
613
614endef # def_inherit
615
616
617#
618# Load global units before doing any inheriting so they can add new properties.
619#
620# This only applies to the guys listed in the global USES since there is
621# no reliable way to deal with things on a target level without first
622# applying templates. So, to avoid having USES mess up all targets,
623# we'll make the global and per-target USES property work differently:
624# The global USES does not apply to targets, just globally.
625#
626
627## Unit load function.
628# @param loading The unit name
629define def_unit_load_function
630ifndef UNIT_$(loading)
631 UNIT_$(loading)_KMK_FILE := $(firstword $(foreach path, $(KBUILD_UNIT_PATHS) $(KBUILD_PATH)/units $(KBUILD_DEFAULT_PATHS), $(wildcard $(path)/$(loading).kmk)))
632 ifeq ($(UNIT_$(loading)_KMK_FILE),)
633 $(error kBuild: Cannot find include file for the unit '$(loading)'! Searched: $(KBUILD_UNIT_PATHS) $(KBUILD_PATH)/units $(KBUILD_DEFAULT_PATHS))
634 endif
635 include $(UNIT_$(loading)_KMK_FILE)
636 ifndef UNIT_$(loading)
637 $(warning kBuild: UNIT_$(loading) was not defined by $(UNIT_$(loading)_KMK_FILE)!)
638 endif
639endif
640endef # def_unit_load_function
641
642$(foreach loading, \
643 $(USES.$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)) \
644 $(USES.$(KBUILD_TARGET_CPU)) \
645 $(USES.$(KBUILD_TARGET_ARCH)) \
646 $(USES.$(KBUILD_TARGET)) \
647 $(USES.$(KBUILD_HOST).$(KBUILD_HOST_ARCH)) \
648 $(USES.$(KBUILD_HOST_CPU)) \
649 $(USES.$(KBUILD_HOST_ARCH)) \
650 $(USES.$(KBUILD_TARGET)) \
651 $(USES.$(KBUILD_TYPE)) \
652 $(USES),$(evalval def_unit_load_function))
653
654
655#
656# Determin all the templates that is being used and make
657# sure they are present before we try collect keywords.
658#
659_TEMPLATES := $(TEMPLATE)
660define def_templates
661ifdef $(target)_TEMPLATE
662 ifneq ("$($(target)_TEMPLATE)","$(strip $($(target)_TEMPLATE))")
663 $$(error kBuild: The template name of target '$(target)' contains tabs ($($(target)_TEMPLATE))). Please remove them)
664 endif
665 _TEMPLATES += $($(target)_TEMPLATE)
666endif
667endef # def_templates
668$(foreach target, $(_ALL_TARGETS), $(eval $(def_templates)))
669_TEMPLATES := $(sort $(_TEMPLATES))
670
671## Template load function.
672# @param loading The template name. This is prefixed.
673define def_templates_load_function
674ifndef TEMPLATE_$(loading)
675 TEMPLATE_$(loading)_KMK_FILE := $(firstword $(foreach path, $(KBUILD_TEMPLATE_PATHS) $(KBUILD_PATH)/templates $(KBUILD_DEFAULT_PATHS), $(wildcard $(path)/$(loading).kmk)))
676 ifeq ($(TEMPLATE_$(loading)_KMK_FILE),)
677 $(error kBuild: Cannot find include file for the template '$(loading)'! Searched: $(KBUILD_TEMPLATE_PATHS) $(KBUILD_PATH)/templates $(KBUILD_DEFAULT_PATHS))
678 endif
679 include $(TEMPLATE_$(loading)_KMK_FILE)
680 ifndef TEMPLATE_$(loading)
681 $(warning kBuild: TEMPLATE_$(loading) was not defined by $(TEMPLATE_$(loading)_KMK_FILE)!)
682 endif
683endif
684endef # def_templates_load_function
685$(foreach loading, $(_TEMPLATES), $(evalval def_templates_load_function))
686
687
688#
689# Determin the keywords required for correct inherting and setup keyword inheritance.
690#
691# This means walking all the lists of immediate template and targets and
692# pick up all the BLD_T* keywords. Since templates that are referenced
693# indirectly in the inheritance hierarchy, the result from this exercise
694# might not be 100% accurate... :-/
695#
696_BLD_TYPES := $(KBUILD_TYPE)
697_BLD_TARGETS := $(KBUILD_TARGET) $(KBUILD_HOSTS)
698_BLD_ARCHES := $(KBUILD_TARGET_ARCH) $(KBUILD_HOST_ARCH)
699_BLD_CPUS := $(KBUILD_TARGET_CPU) $(KBUILD_HOST_CPU)
700
701define def_collect_bld_xyz
702ifdef $(src)_BLD_TYPE
703 ifn1of ($($(src)_BLD_TYPE), $(KBUILD_BLD_TYPES))
704 $(error kBuild: $(src)_BLD_TYPE=$($(src)_BLD_TYPE) not in KBUILD_BLD_TYPES={$(KBUILD_BLD_TYPES)}!)
705 endif
706 _BLD_TYPES += $($(src)_BLD_TYPE)
707endif
708ifdef $(src)_BLD_TRG
709 ifn1of ($($(src)_BLD_TRG), $(KBUILD_OSES))
710 $(error kBuild: $(src)_BLD_TRG=$($(src)_BLD_TRG) not in KBUILD_OSES={$(KBUILD_OSES)}!)
711 endif
712 _BLD_TARGETS += $($(src)_BLD_TRG)
713endif
714ifdef $(src)_BLD_TRG_ARCH
715 ifn1of ($($(src)_BLD_TRG_ARCH), $(KBUILD_ARCHES))
716 $(error kBuild: $(src)_BLD_TRG_ARCH=$($(src)_BLD_TRG_ARCH) not in KBUILD_ARCHES={$(KBUILD_ARCHES)}!)
717 endif
718 _BLD_ARCHES += $($(src)_BLD_TRG_ARCH)
719endif
720ifdef $(src)_BLD_TRG_CPU
721 if1of ($($(src)_BLD_CPU), $(KBUILD_ARCHES) $(KBUILD_OSES) $(KBUILD_BLD_TYPES))
722 $(error kBuild: $(src)_BLD_TRG_CPU=$($(src)_BLD_TRG_CPU) found in KBUILD_ARCHES, KBUILD_OSES or KBUILD_BLD_TYPES!)
723 endif
724 _BLD_CPUS += $($(src)_BLD_TRG_CPU)
725endif
726endef # def_collect_bld_xyz
727$(foreach src, $(addprefix TEMPLATE_, $(_TEMPLATES)) $(_ALL_TARGETS) \
728 ,$(evalval def_collect_bld_xyz))
729
730# Drop duplicate values.
731# WARNING! These list might not include keywords only involved in inheritance.
732_BLD_TYPES := $(sort $(_BLD_TYPES))
733_BLD_TARGETS := $(sort $(_BLD_TARGETS))
734_BLD_ARCHES := $(sort $(_BLD_ARCHES))
735_BLD_CPUS := $(sort $(_BLD_CPUS))
736
737## Look for keywords which extends others and order them.
738# @param keyword
739# @param prefix
740# @param valid
741define def_keyword_ordering
742# Check for EXTENDS, fix and validate it if found.
743local src := $(strip $($(prefix)_$(keyword)_EXTENDS))
744ifneq ($(src),)
745 ifndef $(prefix)_$(keyword)_EXTENDS_STATUS_
746 ifn1of ($(src), $(valid))
747 $(error kBuild: $(keyword) tries to extend unknown keyword '$(src)'! (known = $(valid)))
748 endif
749
750 # Recursivly process the parent (src).
751 ifneq ($($(prefix)_$(src)_EXTENDS_STATUS_),42)
752 $(prefix)_$(keyword)_EXTENDS_STATUS_ := 0
753 # 'foreach' will create 'keyword' in a new variable context hiding
754 # out current variable. 'src' OTOH will be overwritten.
755 $(foreach keyword, $(src), $(evalval def_keyword_ordering))
756 local src := $(strip $($(prefix)_$(keyword)_EXTENDS))
757 endif
758
759 # Check and strip EXTENDS_BY.
760 local by = $(strip $($(prefix)_$(keyword)_EXTENDS_BY))
761 ifeq ($(by),)
762 local by = overriding
763 else ifn1of ($(by), overriding appending prepending)
764 $(error kBuild: Invalid EXTENDS_BY value '$(by)' on '$(keyword)'!)
765 endif
766
767 # Update the attributes with stripped
768 $(prefix)_$(keyword)_EXTENDS_BY := $(by)
769 $(prefix)_$(keyword)_EXTENDS := $(src)
770
771 # Add it to the list and mark it as done.
772 _KEYWORDS_EXTENDS += $(keyword)
773 _KEYWORDS_PREFIX += $(prefix)
774 $(prefix)_$(keyword)_EXTENDS_STATUS_ := 42
775 else
776 # Check for inheritance loops.
777 ifneq ($($(trg)_EXTENDS_STATUS_),42)
778 $(error kBuild: Keyword inheritance loop! keyword=$(keyword) $(prefix)_$(keyword)_EXTENDS_STATUS_=$($(prefix)_$(keyword)_EXTENDS_STATUS_))
779 endif
780 endif
781else
782 # Add it to the ordered list and mark it as done.
783 _KEYWORDS_ORDERED += $(keyword)
784 $(prefix)_$(src)_EXTENDS_STATUS_ := 42
785endif
786endef # def_keyword_ordering
787
788# Look for keywords which extends others and their parents, and from this
789# construct two lists.
790_KEYWORDS_ORDERED :=
791_KEYWORDS_EXTENDS :=
792_KEYWORDS_PREFIX :=
793
794prefix := BLD_TYPE
795valid := $(KBUILD_BLD_TYPES)
796$(foreach keyword, $(_BLD_TYPES) , $(evalval def_keyword_ordering))
797
798prefix := BLD_TRG
799valid := $(KBUILD_OSES)
800$(foreach keyword, $(_BLD_TARGETS), $(evalval def_keyword_ordering))
801
802prefix := BLD_ARCH
803valid := $(KBUILD_ARCHES)
804$(foreach keyword, $(_BLD_ARCHES) , $(evalval def_keyword_ordering))
805
806prefix := BLD_CPU
807valid := $(KBUILD_CPUS)
808$(foreach keyword, $(_BLD_CPUS) , $(evalval def_keyword_ordering))
809
810## @todo Inherit bld_trg.bld_arch for too?
811
812# Construct all the possible keywords.
813_KEYWORDS := $(_KEYWORDS_ORDERED) $(_KEYWORDS_EXTENDS) \
814 $(foreach bld_trg,$(_BLD_TARGETS),$(addprefix $(bld_trg).,$(_BLD_ARCHES)))
815
816ifdef KBUILD_PROFILE_SELF
817 _KBUILD_TS_NOW := $(nanots )
818 $(info prof: $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_HEADER_START)) - $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_PREV)) - done keywords)
819 $(info stat: $(make-stats ))
820 _KBUILD_TS_PREV := $(_KBUILD_TS_NOW)
821endif
822
823
824#
825# Target inheritance.
826#
827# This has to be done on a per target list basis as to avoid adding
828# incorrect properties that will wast memory, time, and may confuse
829# later strictness checks. This also has to be done *before* templates
830# are applied to the targets. Since we're doing that part rather
831# early on, the target inheritance feature is a bit restricted at
832# the moment. However, this will be addressed in a little(?) while.
833#
834
835src_prefix :=
836load_function :=
837properties_deferred_l :=
838properties_deferred_r :=
839
840# Fetches.
841properties := $(PROPS_FETCHES_SINGLE)
842properties_now_l := $(PROPS_FETCHES_ACCUMULATE_L)
843properties_now_r := $(PROPS_FETCHES_ACCUMULATE_R)
844properties_deferred := $(PROPS_FETCHES_DEFERRED)
845$(foreach trg, $(_ALL_FETCHES),$(evalval def_inherit))
846
847## Patches. - not implemented yet.
848#properties := $(PROPS_PATCHES_SINGLE)
849#properties_now_l := $(PROPS_PATCHES_ACCUMULATE_L)
850#properties_now_r := $(PROPS_PATCHES_ACCUMULATE_R)
851#properties_deferred := $(PROPS_PATCHES_DEFERRED)
852#$(foreach trg, $(_ALL_PATCHES),$(evalval def_inherit))
853
854# Programs and build programs.
855properties := $(PROPS_PROGRAMS_SINGLE)
856properties_now_l := $(PROPS_PROGRAMS_ACCUMULATE_L)
857properties_now_r := $(PROPS_PROGRAMS_ACCUMULATE_R)
858properties_deferred := $(PROPS_PROGRAMS_DEFERRED)
859$(foreach trg, $(_ALL_BLDPROGS) $(_ALL_PROGRAMS),$(evalval def_inherit))
860
861# Libraries and import libraries.
862properties := $(PROPS_LIBRARIES_SINGLE)
863properties_now_l := $(PROPS_LIBRARIES_ACCUMULATE_L)
864properties_now_r := $(PROPS_LIBRARIES_ACCUMULATE_R)
865properties_deferred := $(PROPS_LIBRARIES_DEFERRED)
866if1of ($(KBUILD_TARGET), nt os2 win)
867 $(foreach trg, $(_ALL_LIBRARIES) $(_ALL_IMPORT_LIBS),$(evalval def_inherit))
868else
869 $(foreach trg, $(_ALL_LIBRARIES),$(evalval def_inherit))
870endif
871
872# DLLs.
873properties := $(PROPS_DLLS_SINGLE)
874properties_now_l := $(PROPS_DLLS_ACCUMULATE_L)
875properties_now_r := $(PROPS_DLLS_ACCUMULATE_R)
876properties_deferred := $(PROPS_DLLS_DEFERRED)
877if1of ($(KBUILD_TARGET), nt os2 win)
878 $(foreach trg, $(_ALL_DLLS),$(evalval def_inherit))
879else
880 $(foreach trg, $(_ALL_DLLS) $(_ALL_IMPORT_LIBS),$(evalval def_inherit))
881endif
882
883# System modules.
884properties := $(PROPS_SYSMODS_SINGLE)
885properties_now_l := $(PROPS_SYSMODS_ACCUMULATE_L)
886properties_now_r := $(PROPS_SYSMODS_ACCUMULATE_R)
887properties_deferred := $(PROPS_SYSMODS_DEFERRED)
888$(foreach trg, $(_ALL_SYSMODS),$(evalval def_inherit))
889
890# Installs.
891properties := $(PROPS_INSTALLS_SINGLE)
892properties_now_l := $(PROPS_INSTALLS_ACCUMULATE_L)
893properties_now_r := $(PROPS_INSTALLS_ACCUMULATE_R)
894properties_deferred := $(PROPS_INSTALLS_DEFERRED)
895$(foreach trg, $(_ALL_INSTALLS),$(evalval def_inherit))
896
897ifdef KBUILD_PROFILE_SELF
898 _KBUILD_TS_NOW := $(nanots )
899 $(info prof: $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_HEADER_START)) - $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_PREV)) - done target inheritance)
900 $(info stat: $(make-stats ))
901 _KBUILD_TS_PREV := $(_KBUILD_TS_NOW)
902endif
903
904
905#
906# Template Inheritance.
907#
908# This is much the same as with target inheritance, except we cannot
909# restrict the properties involved since we haven't got a clue which
910# target platforms/archs are using them. But, we can drop the instance
911# expansion we're doing for targets since there won't be any more
912# changes to either the source nor the target templates beyond this
913# exercise.
914#
915
916src_prefix := TEMPLATE_
917load_function := def_templates_load_function
918properties :=
919properties_now_l :=
920properties_now_r :=
921properties_deferred := $(PROPS_SINGLE) $(PROPS_DEFERRED)
922properties_deferred_l := $(PROPS_ACCUMULATE_L)
923properties_deferred_r := $(PROPS_ACCUMULATE_R)
924$(foreach trg, $(addprefix TEMPLATE_,$(_TEMPLATES)),$(evalval def_inherit))
925
926# done inheriting.
927src_prefix :=
928load_function :=
929properties :=
930properties_now_l :=
931properties_now_r :=
932properties_deferred :=
933properties_deferred_l :=
934properties_deferred_r :=
935
936ifdef KBUILD_PROFILE_SELF
937 _KBUILD_TS_NOW := $(nanots )
938 $(info prof: $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_HEADER_START)) - $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_PREV)) - done template inheritance)
939 $(info stat: $(make-stats ))
940 _KBUILD_TS_PREV := $(_KBUILD_TS_NOW)
941endif
942
943
944
945
946#
947# Template/Target Expansion.
948#
949# Extend all targets with the values from the template. Doing this up front
950# allows more generic code and less mess down in the pass 2 target handling.
951# However it does eat a good deal of memory.
952#
953
954## Inherit one template property in a non-accumulative manner.
955# @param $(prop) Property name
956# @param $(target) Target name
957# @todo fix the precedence order for some properties.
958define def_inherit_template_one
959ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop)
960ifndef $(target)_$(prop)
961$(target)_$(prop) := $(TEMPLATE_$($(target)_TEMPLATE)_$(prop))
962endif
963endif
964ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg)
965ifndef $(target)_$(prop).$(bld_trg)
966$(target)_$(prop).$(bld_trg) := $(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg))
967endif
968endif
969ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg).$(bld_trg_arch)
970ifndef $(target)_$(prop).$(bld_trg).$(bld_trg_arch)
971$(target)_$(prop).$(bld_trg).$(bld_trg_arch) := $(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg).$(bld_trg_arch))
972endif
973endif
974ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_arch)
975ifndef $(target)_$(prop).$(bld_trg_arch)
976$(target)_$(prop).$(bld_trg_arch) := $(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_arch))
977endif
978endif
979ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_cpu)
980ifndef $(target)_$(prop).$(bld_trg_cpu)
981$(target)_$(prop).$(bld_trg_cpu) := $(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_cpu))
982endif
983endif
984endef
985
986## Inherit one template property in a non-accumulative manner, deferred expansion.
987# @param 1: $(prop) Property name
988# @param 2: $(target) Target name
989# @todo fix the precedence order for some properties.
990# @remark this define relies on double evaluation
991define def_inherit_template_one_deferred
992ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop)
993ifndef $(target)_$(prop)
994$(target)_$(prop) = $$(TEMPLATE_$($(target)_TEMPLATE)_$(prop))
995endif
996endif
997ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg)
998ifndef $(target)_$(prop).$(bld_trg)
999$(target)_$(prop).$(bld_trg) = $$(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg))
1000endif
1001endif
1002ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg).$(bld_trg_arch)
1003ifndef $(target)_$(prop).$(bld_trg).$(bld_trg_arch)
1004$(target)_$(prop).$(bld_trg).$(bld_trg_arch) = $$(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg).$(bld_trg_arch))
1005endif
1006endif
1007ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_arch)
1008ifndef $(target)_$(prop).$(bld_trg_arch)
1009$(target)_$(prop).$(bld_trg_arch) = $$(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_arch))
1010endif
1011endif
1012ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_cpu)
1013ifndef $(target)_$(prop).$(bld_trg_cpu)
1014$(target)_$(prop).$(bld_trg_cpu) = $$(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_cpu))
1015endif
1016endif
1017endef
1018
1019## Inherit one acculumlative template property where the 'most significant' items are at the left end.
1020# @param $(prop) Property name
1021# @param $(target) Target name
1022define def_inherit_template_one_accumulate_l
1023ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop)
1024$(target)_$(prop) += $$(TEMPLATE_$($(target)_TEMPLATE)_$(prop))
1025endif
1026ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(KBUILD_TYPE)
1027$(target)_$(prop).$(KBUILD_TYPE) += $$(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(KBUILD_TYPE))
1028endif
1029ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg)
1030$(target)_$(prop).$(bld_trg) += $$(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg))
1031endif
1032ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg).$(bld_trg_arch)
1033$(target)_$(prop).$(bld_trg).$(bld_trg_arch) += $$(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg).$(bld_trg_arch))
1034endif
1035ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_cpu)
1036$(target)_$(prop).$(bld_trg_cpu) += $$(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_cpu))
1037endif
1038ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_arch)
1039$(target)_$(prop).$(bld_trg_arch) += $$(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_arch))
1040endif
1041endef
1042
1043## Inherit one acculumlative template property where the 'most significant' items are at the right end.
1044# @param $(prop) Property name
1045# @param $(target) Target name
1046define def_inherit_template_one_accumulate_r
1047ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop)
1048$(target)_$(prop) <=$$(TEMPLATE_$($(target)_TEMPLATE)_$(prop))
1049endif
1050ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(KBUILD_TYPE)
1051$(target)_$(prop).$(KBUILD_TYPE) <=$$(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(KBUILD_TYPE))
1052endif
1053ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg)
1054$(target)_$(prop).$(bld_trg) <=$$(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg))
1055endif
1056ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg).$(bld_trg_arch)
1057$(target)_$(prop).$(bld_trg).$(bld_trg_arch) <=$$(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg).$(bld_trg_arch))
1058endif
1059ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_cpu)
1060$(target)_$(prop).$(bld_trg_cpu) <=$$(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_cpu))
1061endif
1062ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_arch)
1063$(target)_$(prop).$(bld_trg_arch) <=$$(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_arch))
1064endif
1065endef
1066
1067
1068## Inherit template properties for on target.
1069# @param $(target) Target name.
1070define def_inherit_template
1071# sanity check.
1072ifdef _$(target)_ALREADY_PROCESSED
1073 $(error kBuild: The target $(target) appears more than once in the target lists! Please correct the makefile(s))
1074endif
1075_$(target)_ALREADY_PROCESSED := 1
1076
1077# Inherit any default template.
1078ifdef TEMPLATE
1079ifeq ($($(target)_TEMPLATE),)
1080$(eval $(target)_TEMPLATE:=$(TEMPLATE))
1081endif
1082endif
1083# Expand the template if specified.
1084ifneq ($($(target)_TEMPLATE),)
1085$(foreach prop,$(PROPS_SINGLE),$(evalval def_inherit_template_one))
1086$(foreach prop,$(PROPS_DEFERRED),$(eval $(def_inherit_template_one_deferred))) # exploits the 2 evaluation, so no value!
1087$(foreach prop,$(PROPS_ACCUMULATE_L),$(eval $(def_inherit_template_one_accumulate_l))) # += works fine without value
1088$(foreach prop,$(PROPS_ACCUMULATE_R),$(eval $(def_inherit_template_one_accumulate_r))) # use <= (kmk addition)
1089endif
1090endef
1091
1092# Inherit template properties
1093bld_trg := $(KBUILD_TARGET)
1094bld_trg_arch := $(KBUILD_TARGET_ARCH)
1095bld_trg_cpu := $(KBUILD_TARGET_CPU)
1096$(foreach target, $(_ALL_TARGET_TARGETS),$(evalval def_inherit_template))
1097
1098bld_trg := $(KBUILD_HOST)
1099bld_trg_arch := $(KBUILD_HOST_ARCH)
1100bld_trg_cpu := $(KBUILD_HOST_CPU)
1101$(foreach target, $(_ALL_HOST_TARGETS),$(evalval def_inherit_template))
1102
1103ifdef KBUILD_PROFILE_SELF
1104 _KBUILD_TS_NOW := $(nanots )
1105 $(info prof: $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_HEADER_START)) - $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_PREV)) - done template/target expansion)
1106 $(info stat: $(make-stats ))
1107 _KBUILD_TS_PREV := $(_KBUILD_TS_NOW)
1108endif
1109
1110
1111#
1112# Include tools, sdks and units.
1113#
1114# The first part of this exercise is to figure out which TOOLS and SDKS
1115# that should be included.
1116#
1117_TOOLS := $(TOOL.$(KBUILD_TARGET)) $(TOOL.$(KBUILD_TARGET_ARCH)) $(TOOL.$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)) \
1118 $(TOOL.$(KBUILD_HOST)) $(TOOL.$(KBUILD_HOST_ARCH)) $(TOOL.$(KBUILD_HOST).$(KBUILD_HOST_ARCH)) \
1119 $(TOOL)
1120_SDKS := $(SDKS.$(KBUILD_TARGET)) $(SDKS.$(KBUILD_TARGET_ARCH)) $(SDKS.$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)) \
1121 $(SDKS.$(KBUILD_HOST)) $(SDKS.$(KBUILD_HOST_ARCH)) $(SDKS.$(KBUILD_HOST).$(KBUILD_HOST_ARCH)) \
1122 $(SDKS.$(KBUILD_TYPE)) \
1123 $(SDKS)
1124_USES := $(USES.$(KBUILD_TARGET)) $(USES.$(KBUILD_TARGET_ARCH)) $(USES.$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)) \
1125 $(USES.$(KBUILD_HOST)) $(USES.$(KBUILD_HOST_ARCH)) $(USES.$(KBUILD_HOST).$(KBUILD_HOST_ARCH)) \
1126 $(USES.$(KBUILD_TYPE)) \
1127 $(USES)
1128define def_tools_sdks_target_source
1129$(eval _TOOLS += $(foreach prop, $(PROPS_TOOLS), \
1130 $($(source)_$(prop).$(_bld_trg)) \
1131 $($(target)_$(source)_$(prop).$(_bld_trg)) \
1132 $($(source)_$(prop).$(_bld_trg).$(_bld_trg_arch)) \
1133 $($(target)_$(source)_$(prop).$(_bld_trg).$(_bld_trg_arch)) \
1134 $($(source)_$(prop).$(_bld_trg_arch)) \
1135 $($(target)_$(source)_$(prop).$(_bld_trg_arch)) \
1136 $($(source)_$(prop)) \
1137 $($(target)_$(source)_$(prop))))
1138$(eval _SDKS += \
1139 $($(source)_SDKS.$(_bld_trg)) \
1140 $($(target)_$(source)_SDKS.$(_bld_trg)) \
1141 $($(source)_SDKS.$(_bld_trg).$(_bld_trg_arch)) \
1142 $($(target)_$(source)_SDKS.$(_bld_trg).$(_bld_trg_arch)) \
1143 $($(source)_SDKS.$(_bld_trg_arch)) \
1144 $($(target)_$(source)_SDKS.$(_bld_trg_arch)) \
1145 $($(source)_SDKS.$(KBUILD_TYPE)) \
1146 $($(target)_$(source)_SDKS.$(KBUILD_TYPE)) \
1147 $($(source)_SDKS) \
1148 $($(target)_$(source)_SDKS))
1149$(eval _USES += \
1150 $($(source)_USES.$(_bld_trg)) \
1151 $($(target)_$(source)_USES.$(_bld_trg)) \
1152 $($(source)_USES.$(_bld_trg).$(_bld_trg_arch)) \
1153 $($(target)_$(source)_USES.$(_bld_trg).$(_bld_trg_arch)) \
1154 $($(source)_USES.$(_bld_trg_arch)) \
1155 $($(target)_$(source)_USES.$(_bld_trg_arch)) \
1156 $($(source)_USES.$(KBUILD_TYPE)) \
1157 $($(target)_$(source)_USES.$(KBUILD_TYPE)) \
1158 $($(source)_USES) \
1159 $($(target)_$(source)_USES))
1160endef # def_tools_sdks_target_source
1161
1162define def_tools_sdks_target
1163local _bld_type := $(firstword $($(target)_BLD_TYPE) $(KBUILD_TYPE))
1164local _bld_trg := $(firstword $($(target)_BLD_TRG) $(bld_trg))
1165local _bld_trg_arch := $(firstword $($(target)_BLD_TRG_ARCH) $(bld_trg_arch))
1166local _bld_trg_cpu := $(firstword $($(target)_BLD_TRG_CPU) $(bld_trg_cpu))
1167
1168$(eval _TOOLS += $(foreach prop, $(PROPS_TOOLS), \
1169 $($(target)_$(prop).$(_bld_trg)) \
1170 $($(target)_$(prop).$(_bld_trg_arch)) \
1171 $($(target)_$(prop).$(_bld_trg).$(_bld_trg_arch)) \
1172 $($(target)_$(prop))))
1173$(eval _SDKS += \
1174 $($(target)_SDKS.$(_bld_trg)) \
1175 $($(target)_SDKS.$(_bld_trg_arch)) \
1176 $($(target)_SDKS.$(_bld_trg).$(_bld_trg_arch)) \
1177 $($(target)_SDKS))
1178$(eval _USES += \
1179 $($(target)_USES.$(_bld_trg)) \
1180 $($(target)_USES.$(_bld_trg_arch)) \
1181 $($(target)_USES.$(_bld_trg).$(_bld_trg_arch)) \
1182 $($(target)_USES))
1183$(foreach source, \
1184 $($(target)_SOURCES.$(_bld_trg)) \
1185 $($(target)_SOURCES.$(_bld_trg_arch)) \
1186 $($(target)_SOURCES.$(_bld_trg).$(_bld_trg_arch)) \
1187 $($(target)_SOURCES.$(_bld_trg_cpu)) \
1188 $($(target)_SOURCES.$(_bld_type)) \
1189 $($(target)_SOURCES) \
1190 , $(evalval def_tools_sdks_target_source))
1191endef # def_tools_sdks_target
1192
1193define def_tools_srcname_target
1194local _bld_type := $(firstword $($(target)_BLD_TYPE) $(KBUILD_TYPE))
1195local _bld_trg := $(firstword $($(target)_BLD_TRG) $(bld_trg))
1196local _bld_trg_arch := $(firstword $($(target)_BLD_TRG_ARCH) $(bld_trg_arch))
1197local _bld_trg_cpu := $(firstword $($(target)_BLD_TRG_CPU) $(bld_trg_cpu))
1198
1199$(foreach source, $(notdir\
1200 $($(target)_SOURCES.$(_bld_trg)) \
1201 $($(target)_SOURCES.$(_bld_trg_arch)) \
1202 $($(target)_SOURCES.$(_bld_trg).$(_bld_trg_arch)) \
1203 $($(target)_SOURCES.$(_bld_trg_cpu)) \
1204 $($(target)_SOURCES.$(_bld_type)) \
1205 $($(target)_SOURCES) \
1206 ), $(evalval def_tools_sdks_target_source))
1207endef # def_tools_srcname_target
1208
1209bld_trg := $(KBUILD_TARGET)
1210bld_trg_arch := $(KBUILD_TARGET_ARCH)
1211bld_trg_cpu := $(KBUILD_TARGET_CPU)
1212$(foreach target, $(_ALL_TARGET_TARGETS), $(evalval def_tools_sdks_target))
1213$(foreach target, $(_ALL_SRCNAME_TARGETS), $(evalval def_tools_srcname_target))
1214
1215bld_trg := $(KBUILD_HOST)
1216bld_trg_arch := $(KBUILD_HOST_ARCH)
1217bld_trg_cpu := $(KBUILD_HOST_CPU)
1218$(foreach target, $(_ALL_HOST_TARGETS), $(evalval def_tools_sdks_target))
1219
1220_TOOLS := $(sort $(_TOOLS))
1221_SDKS := $(sort $(_SDKS))
1222
1223## Tool load function.
1224# @param loading The tool name
1225define def_tools_load_function
1226ifndef TOOL_$(loading)
1227 TOOL_$(loading)_KMK_FILE := $(firstword $(foreach path, $(KBUILD_TOOL_PATHS) $(KBUILD_PATH)/tools $(KBUILD_DEFAULT_PATHS), $(wildcard $(path)/$(loading).kmk)))
1228 ifeq ($(TOOL_$(loading)_KMK_FILE),)
1229 $(error kBuild: Cannot find include file for the tool '$(loading)'! Searched: $(KBUILD_TOOL_PATHS) $(KBUILD_PATH)/tools $(KBUILD_DEFAULT_PATHS))
1230 endif
1231 include $(TOOL_$(loading)_KMK_FILE)
1232 ifndef TOOL_$(loading)
1233 $(warning kBuild: TOOL_$(loading) was not defined by $(TOOL_$(loading)_KMK_FILE)!)
1234 endif
1235endif
1236endef # def_tools_include
1237
1238## SDK load function.
1239# @param loading The tool name
1240define def_sdk_load_function
1241ifndef SDK_$(loading)
1242 SDK_$(loading)_KMK_FILE := $(firstword $(foreach path, $(KBUILD_SDK_PATHS) $(KBUILD_PATH)/sdks $(KBUILD_DEFAULT_PATHS), $(wildcard $(path)/$(loading).kmk)))
1243 ifeq ($(SDK_$(loading)_KMK_FILE),)
1244 $(error kBuild: Cannot find include file for the SDK '$(loading)'! Searched: $(KBUILD_SDK_PATHS) $(KBUILD_PATH)/sdks $(KBUILD_DEFAULT_PATHS))
1245 endif
1246 include $(SDK_$(loading)_KMK_FILE)
1247 ifndef SDK_$(loading)
1248 $(warning kBuild: SDK_$(loading) was not defined by $(SDK_$(loading)_KMK_FILE)!)
1249 endif
1250endif
1251endef # def_sdk_load_function
1252
1253
1254properties :=
1255properties_now_l :=
1256properties_now_r :=
1257properties_deferred := $(PROPS_SINGLE) $(PROPS_DEFERRED)
1258properties_deferred_l := $(PROPS_ACCUMULATE_L)
1259properties_deferred_r := $(PROPS_ACCUMULATE_R)
1260
1261src_prefix := TOOL_
1262load_function := def_tools_load_function
1263$(foreach trg, $(addprefix TOOL_,$(_TOOLS)), $(evalval def_inherit))
1264
1265src_prefix := SDK_
1266load_function := def_sdk_load_function
1267$(foreach trg, $(addprefix SDK_,$(_SDKS)), $(evalval def_inherit))
1268
1269# done inheriting.
1270src_prefix :=
1271load_function :=
1272properties :=
1273properties_now_l :=
1274properties_now_r :=
1275properties_deferred :=
1276properties_deferred_l :=
1277properties_deferred_r :=
1278
1279# No inheriting for the uses, they're just global 'code'.
1280$(foreach loading, $(_USES), $(evalval def_unit_load_function))
1281
1282
1283ifdef KBUILD_PROFILE_SELF
1284 _KBUILD_TS_NOW := $(nanots )
1285 $(info prof: $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_HEADER_START)) - $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_PREV)) - done tools, sdks and units)
1286 $(info stat: $(make-stats ))
1287 _KBUILD_TS_PREV := $(_KBUILD_TS_NOW)
1288endif
1289
1290
1291
1292#
1293#
1294# Target lists - Pass 1
1295#
1296# This pass is for defining variables that might be referenced in
1297# properties of other targets.
1298#
1299#
1300
1301# Don't do anything for fetch targets (yet).
1302
1303##
1304# Link prolog for Pass 1.
1305#
1306# @param $(target) Normalized target name.
1307# @param $(EXT) EXE,DLL,SYS,LIB.
1308# @param $(EXTPRE) HOST or nothing.
1309# @param $(definst) The default _INST value.
1310# @param $(tool_prefix) LD or AR.
1311# @param $(bld_trg_base_var) TARGET or PLATFORM.
1312define def_pass1_link_common
1313
1314local bld_type := $(firstword $($(target)_BLD_TYPE) $(KBUILD_TYPE))
1315local bld_trg := $(firstword $($(target)_BLD_TRG) $(BUILD_$(bld_trg_base_var)))
1316local bld_trg_arch:= $(firstword $($(target)_BLD_TRG_ARCH) $(BUILD_$(bld_trg_base_var)_ARCH))
1317local bld_trg_cpu := $(firstword $($(target)_BLD_TRG_CPU) $(BUILD_$(bld_trg_base_var)_CPU))
1318
1319local tool := $(call _TARGET_TOOL,$(target),$(tool_prefix))
1320local name := $(firstword\
1321 $($(target)_NAME.$(bld_trg).$(bld_trg_arch))\
1322 $($(target)_NAME.$(bld_trg_arch))\
1323 $($(target)_NAME.$(bld_trg))\
1324 $($(target)_NAME.$(bld_type))\
1325 $($(target)_NAME)\
1326 $(target))
1327local outbase := $(call TARGET_BASE,$(name),$(target))
1328ifndef PATH_$(target)
1329 PATH_$(target) := $(patsubst %/,%,$(dir $(outbase)))
1330else ifneq ($(PATH_$(target)),$(patsubst %/,%,$(dir $(outbase))))
1331 $(error kBuild internal error: PATH_$(target)=$(PATH_$(target)) expected $(patsubst %/,%,$(dir $(outbase))))
1332endif
1333ifeq ($(tool_prefix),AR) ## @todo fix this mess!
1334local suff := $(firstword\
1335 $($(target)_$(EXT)SUFF.$(bld_trg).$(bld_trg_arch))\
1336 $($(target)_$(EXT)SUFF.$(bld_trg))\
1337 $($(target)_$(EXT)SUFF)\
1338 $(TOOL_$(tool)_$(tool_prefix)$(EXT)SUFF.$(bld_trg).$(bld_trg_arch))\
1339 $(TOOL_$(tool)_$(tool_prefix)$(EXT)SUFF.$(bld_trg))\
1340 $(TOOL_$(tool)_$(tool_prefix)$(EXT)SUFF)\
1341 $(SUFF_LIB))
1342else
1343local suff := $(firstword \
1344 $($(target)_$(EXT)SUFF) \
1345 $($(target)_$(EXT)SUFF) \
1346 $(TOOL_$(tool)_$(tool_prefix)$(EXT)SUFF) \
1347 $($(EXTPRE)SUFF_$(EXT)))
1348endif
1349local out := $(outbase)$(suff)
1350
1351# TARGET_*
1352TARGET_$(target) := $(out)
1353
1354# INSTARGET_*
1355ifndef $(target)_NOINST
1356INSTARGET_$(target) := $(patsubst %/,%/$(notdir $(out)), \
1357 $(if $($(target)_INST), $(addprefix $(PATH_INS)/,$($(target)_INST)), $(definst)/))
1358
1359else # NOINST
1360INSTARGET_$(target) :=
1361endif # NOINST
1362
1363endef
1364
1365
1366#
1367# BLDPROGS (Pass 1)
1368#
1369define def_pass1_bldprog
1370# set NOINST if not forced installation before doing the usual stuff.
1371ifndef $(target)_INST
1372$(target)_NOINST := 1
1373endif
1374$(evalval def_pass1_link_common)
1375endef
1376
1377EXT := EXE
1378EXTPRE := HOST
1379definst := $(PATH_BIN)
1380tool_prefix := LD
1381bld_trg_base_var := PLATFORM
1382$(foreach target, $(_ALL_BLDPROGS), \
1383 $(evalval def_pass1_bldprog))
1384
1385
1386#
1387# LIBRARIES (Pass 1)
1388#
1389EXT := LIB
1390EXTPRE :=
1391definst := $(PATH_LIB)
1392tool_prefix := AR
1393bld_trg_base_var := TARGET
1394$(foreach target, $(_ALL_LIBRARIES), \
1395 $(evalval def_pass1_link_common))
1396
1397
1398#
1399# DLLS (Pass 1)
1400#
1401EXT := DLL
1402EXTPRE :=
1403definst := $(PATH_DLL)
1404tool_prefix := LD
1405bld_trg_base_var := TARGET
1406$(foreach target, $(_ALL_DLLS), \
1407 $(evalval def_pass1_link_common))
1408
1409
1410#
1411# IMPORT LIBRARIES (Pass 1)
1412#
1413# - On OS/2 and windows these are libraries.
1414# - On other platforms they are fake DLLs.
1415#
1416if1of ($(KBUILD_TARGET), nt os2 win win64 win32)
1417 EXT := LIB
1418 EXTPRE :=
1419 definst := $(PATH_LIB)
1420 tool_prefix := AR
1421 bld_trg_base_var := TARGET
1422 $(foreach target, $(_ALL_IMPORT_LIBS), \
1423 $(evalval def_pass1_link_common))
1424else
1425 EXT := DLL
1426 EXTPRE :=
1427 definst := $(PATH_DLL)
1428 tool_prefix := LD
1429 bld_trg_base_var := TARGET
1430 $(foreach target, $(_ALL_IMPORT_LIBS), \
1431 $(evalval def_pass1_link_common))
1432endif
1433
1434
1435#
1436# PROGRAMS (Pass 1)
1437#
1438EXT := EXE
1439EXTPRE :=
1440definst := $(PATH_BIN)
1441tool_prefix := LD
1442bld_trg_base_var := TARGET
1443$(foreach target, $(_ALL_PROGRAMS), \
1444 $(evalval def_pass1_link_common))
1445
1446
1447#
1448# SYSMODS (Pass 1)
1449#
1450EXT := SYS
1451EXTPRE :=
1452definst := $(PATH_SYS)
1453tool_prefix := LD
1454bld_trg_base_var := TARGET
1455$(foreach target, $(_ALL_SYSMODS), \
1456 $(evalval def_pass1_link_common))
1457
1458
1459#
1460# INSTALLS (Pass 1)
1461# Note! INSTARGET_* for INSTALLS aren't available until later.
1462#
1463define def_pass1_install
1464local bld_type := $(firstword $($(target)_BLD_TYPE) $(KBUILD_TYPE))
1465local bld_trg := $(firstword $($(target)_BLD_TRG) $(KBUILD_TARGET))
1466local bld_trg_arch:= $(firstword $($(target)_BLD_TRG_ARCH) $(KBUILD_TARGET_ARCH))
1467local bld_trg_cpu := $(firstword $($(target)_BLD_TRG_CPU) $(KBUILD_TARGET_CPU))
1468# TARGET_*
1469TARGET_$(target) := $(PATH_TARGET)/$(target).ins
1470# INSTARGET_ later.
1471endef
1472$(foreach target, $(_ALL_INSTALLS), \
1473 $(evalval def_pass1_install))
1474
1475ifdef KBUILD_PROFILE_SELF
1476 _KBUILD_TS_NOW := $(nanots )
1477 $(info prof: $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_HEADER_START)) - $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_PREV)) - done pass 1)
1478 $(info stat: $(make-stats ))
1479 _KBUILD_TS_PREV := $(_KBUILD_TS_NOW)
1480endif
1481
1482
1483
1484
1485#
1486#
1487# Target lists - Pass 2
1488#
1489#
1490
1491
1492## @page pg_fetches Fetching Tools, Sources and Similar.
1493#
1494# The targets listed in the the FETCHES target list have the following attributes:
1495# SOURCES
1496# INST
1497# FETCHTOOL
1498# FETCHFLAGS
1499# FETCHDIR
1500# UNPACKTOOL
1501# UNPACKFLAGS
1502#
1503# As usual the target name is an alias for 'creating' the target. Other
1504# aliases are:
1505# pass_fetches
1506# fetch
1507# unfetch
1508# download
1509# unpack
1510#
1511# @remark
1512#
1513# This is a little bit complex because we must guarantee that if a source file
1514# changes only sligtly we must refetch it and to a proper unpacking of it. It
1515# is also a desire that fetched archives and unpacked files can be deleted to
1516# save space.
1517#
1518# Thus, we must be able to cleanup what we've unpacked should any of the
1519# sources be removed. We do this by maintaining a file listing the files
1520# and directories that was unpacked. This operation is named 'unfetch'.
1521#
1522# We make use of the SIZE and MD5 attributes for each of the sources to
1523# create a digest that is stored in the primary target file. Subsequent
1524# runswill compare their digest with it to decide if a refetch is required.
1525# When a refetch is found necessary, an 'unfetch' is performed first to
1526# clean out old files and directores. Note even changes in source order
1527# will cause a refetch due to the way the digest is constructed and
1528# evaluated.
1529#
1530# By not depending directly on the archives (nor on any unpacked files)
1531# but on a goal made up from the archive name, size and md5, we allow
1532# the user to delete the archives. Naturally, this means we'll have to
1533# check and fetch missing archives before attempting to unpack them.
1534#
1535# @remark
1536#
1537# This feature will *NOT* work correctly with vanilla GNU make becuase
1538# it makes use of includedep to avoid too many unnecessary files.
1539#
1540# @todo
1541# 1. Download corruption / continuation.
1542# 2. It's quite possible that there is one too many indirect dependency now...
1543#
1544
1545## generates the fetch rule
1546define def_fetch_src_fetch_rule
1547# Indirect goal for downloading something.
1548.PRECIOUS: $(out)
1549$(out) + $($(target)_$(srcname)_FETCH_OUTPUT_) +| $($(target)_$(srcname)_FETCH_OUTPUT_MAYBE_) : \
1550 | $($(target)_$(srcname)_FETCH_DEPORD_)
1551 %$$(call MSG_FETCH_DL,$(target),$(source),$(out))
1552 @## @todo do fancy stuff like download continuation.
1553 $$(QUIET)$$(RM) -f -- $(out)
1554 $($(target)_$(srcname)_FETCH_CMDS_)
1555 $$(QUIET)$(if $(md5),$$(MD5SUM_EXT) -b -C $(md5) $(out))
1556
1557
1558
1559# Intermediate goal for making sure the md5 and size matches. it will (re) fetch the archive if necessary.
1560$(out).checked_$(md5)_$(size): $($(target)_$(srcname)_FETCH_DEPEND_) | $($(target)_$(srcname)_FETCH_DEPORD_)
1561 %$$(call MSG_FETCH_CHK,$(target),$(source),$(out))
1562 $$(QUIET)$$(RM) -f -- $$@
1563 @# (re)fetch the file if it doesn't exist or if it doesn't matches the md5.
1564 @## @todo do fancy stuff like download continuation.
1565 $$(QUIET)( test -f $(out) && $(if $(md5),$$(MD5SUM_EXT) -b -C $(md5) $(out), true) ) \
1566 || ( $$(RM_EXT) -f $(out) \
1567 && $$(MAKE) $(out) -f $(MAKEFILE) --no-print-directory )
1568 $$(QUIET2)$$(APPEND) $$@
1569
1570_TARGET_$(target)_FETCHED += $(out) $(out).checked_$(md5)_$(size)
1571
1572# Just a little precaution.
1573.NOTPARALLEL: $(out) $(out).checked_$(md5)_$(size)
1574
1575endef
1576
1577## generates the unpack rule
1578define def_fetch_src_unpack_rule
1579# This is the unpack rule. it has an order-only dependency on the download check.
1580$(out) + $($(target)_$(srcname)_UNPACK_OUTPUT_) +| $($(target)_$(srcname)_UNPACK_OUTPUT_MAYBE_) : \
1581 $($(target)_$(srcname)_UNPACK_DEPEND_) \
1582 | $($(target)_$(srcname)_UNPACK_DEPORD_) $(archive).checked_$(md5)_$(size)
1583 %$$(call MSG_FETCH_UP,$(target),$(archive),$(inst))
1584 $$(QUIET)$$(RM) -f -- $(out)
1585 @# if the source archive doesn't exist fetch it (can have been deleted to save space).
1586 $$(QUIET)test -f $(archive) \
1587 || ( $$(RM_EXT) -f $(archive).checked_$(md5)_$(size) \
1588 && $$(MAKE) $(archive).checked_$(md5)_$(size) -f $(MAKEFILE) --no-print-directory )
1589 $($(target)_$(srcname)_UNPACK_CMDS_)
1590 $$(QUIET2)$$(APPEND) $(out) $(notdir $(archive).checked_$(md5)_$(size))
1591 $$(QUIET2)$$(APPEND) $(out) $(notdir $(out))
1592
1593$(eval _TARGET_$(target)_UNPACKED += $(out))
1594_TARGET_$(target)_DIGEST := $(_TARGET_$(target)_DIGEST)-$(srcname)_$(md5)_$(size)
1595
1596.NOTPARALLEL: $(out)
1597
1598endef
1599
1600## Processes a fetch source
1601#
1602define def_fetch_src
1603#$ (warning dbg: def_fetch_src: source='$(source)' target='$(target)')
1604
1605# common
1606local srcname := $(notdir $(source))
1607local inst := $(firstword \
1608 $($(target)_$(source)_INST)\
1609 $($(target)_$(srcname)_INST)\
1610 $($(source)_INST)\
1611 $($(srcname)_INST)\
1612 $($(target)_INST)\
1613)
1614ifneq ($(patsubst %/,ok,$(inst)),ok)
1615$(error kBuild: Bad or missing INST property for source '$(source)' in target '$(target)': $(inst))
1616endif
1617INSTARGET_$(target)_$(srcname) := $(inst)
1618local fetchdir := $(firstword \
1619 $($(target)_$(source)_FETCHDIR)\
1620 $($(target)_$(srcname)_FETCHDIR)\
1621 $($(source)_FETCHDIR)\
1622 $($(srcname)_FETCHDIR)\
1623 $($(target)_FETCHDIR)\
1624 $(FETCHDIR)\
1625 $(PATH_TARGET)\
1626)
1627local deps := \
1628 $($(target)_$(source)_DEPS)\
1629 $($(target)_$(srcname)_DEPS)\
1630 $($(source)_DEPS)\
1631 $($(srcname)_DEPS)\
1632 $($(target)_DEPS)
1633local orderdeps := \
1634 $($(target)_$(source)_ORDERDEPS)\
1635 $($(target)_$(srcname)_ORDERDEPS)\
1636 $($(source)_ORDERDEPS)\
1637 $($(srcname)_ORDERDEPS)\
1638 $($(target)_ORDERDEPS)
1639local md5 := $(firstword \
1640 $($(target)_$(source)_MD5)\
1641 $($(target)_$(srcname)_MD5)\
1642 $($(source)_MD5)\
1643 $($(srcname)_MD5)\
1644 $($(target)_MD5)\
1645)
1646local size := $(firstword \
1647 $($(target)_$(source)_SIZE)\
1648 $($(target)_$(srcname)_SIZE)\
1649 $($(source)_SIZE)\
1650 $($(srcname)_SIZE)\
1651 $($(target)_SIZE)\
1652)
1653clean_files += \
1654 $($(target)_$(source)_CLEAN)\
1655 $($(target)_$(srcname)_CLEAN)\
1656 $($(source)_CLEAN)\
1657 $($(srcname)_CLEAN)
1658local dep := # not legal for fetch and unpack tools
1659
1660
1661#
1662# The fetching.
1663#
1664local out := $(fetchdir)/$(srcname)
1665local archive := $(out)
1666TARGET_$(target)_$(srcname) := $(out)
1667local dirdep := $(call DIRDEP,$(fetchdir))
1668local tool := $(firstword \
1669 $($(target)_$(source)_FETCHTOOL)\
1670 $($(target)_$(srcname)_FETCHTOOL)\
1671 $($(target)_$(source)_TOOL)\
1672 $($(target)_$(srcname)_TOOL)\
1673 $($(source)_FETCHTOOL)\
1674 $($(srcname)_FETCHTOOL)\
1675 $($(source)_TOOL)\
1676 $($(srcname)_TOOL)\
1677 $($(target)_FETCHTOOL)\
1678 $($(target)_TOOL)\
1679 )
1680local flags :=\
1681 $(TOOL_$(tool)_FETCHFLAGS)\
1682 $(FETCHFLAGS)\
1683 $($(target)_FETCHFLAGS)\
1684 $($(srcname)_FETCHFLAGS)\
1685 $($(source)_FETCHFLAGS)\
1686 $($(target)_$(srcname)_FETCHFLAGS)\
1687 $($(target)_$(source)_FETCHFLAGS)
1688
1689#$ (warning dbg: target=$(target) source=$(source) $(srcname)=$(srcname) tool=$(tool) out=$(out) flags=$(flags) dirdep=$(dirdep) fetchdir=$(fetchdir) md5=$(md5) size=$(size))
1690
1691ifndef TOOL_$(tool)_FETCH_CMDS
1692$(warning kBuild: tools: \
1693 1 $($(target)_$(source)_FETCHTOOL)\
1694 2 $($(target)_$(srcname)_FETCHTOOL)\
1695 3 $($(target)_$(source)_TOOL)\
1696 4 $($(target)_$(srcname)_TOOL)\
1697 5 $($(source)_FETCHTOOL)\
1698 6 $($(srcname)_FETCHTOOL)\
1699 7 $($(source)_TOOL)\
1700 8 $($(srcname)_TOOL)\
1701 9 $($(target)_FETCHTOOL)\
1702 10 $($(target)_TOOL) )
1703$(error kBuild: TOOL_$(tool)_FETCH_CMDS is not defined. source=$(source) target=$(target) )
1704endif
1705
1706# call the tool
1707$(target)_$(srcname)_FETCH_CMDS_ := $(TOOL_$(tool)_FETCH_CMDS)
1708$(target)_$(srcname)_FETCH_OUTPUT_ := $(TOOL_$(tool)_FETCH_OUTPUT)
1709$(target)_$(srcname)_FETCH_OUTPUT_MAYBE_ := $(TOOL_$(tool)_FETCH_OUTPUT_MAYBE)
1710$(target)_$(srcname)_FETCH_DEPEND_ := $(TOOL_$(tool)_FETCH_DEPEND) $(deps)
1711$(target)_$(srcname)_FETCH_DEPORD_ := $(TOOL_$(tool)_FETCH_DEPORD) $(dirdep) $(orderdeps)
1712
1713# generate the fetch rule.
1714$(eval $(def_fetch_src_fetch_rule))
1715
1716
1717#
1718# The unpacking / installing.
1719#
1720local out := $(inst)_kBuild_$(target)_$(srcname)_unpacked.lst
1721local dirdep := $(call DIRDEP,$(inst))
1722local tool := $(firstword \
1723 $($(target)_$(source)_UNPACKTOOL)\
1724 $($(target)_$(srcname)_UNPACKTOOL)\
1725 $($(target)_$(source)_TOOL)\
1726 $($(target)_$(srcname)_TOOL)\
1727 $($(source)_UNPACKTOOL)\
1728 $($(srcname)_UNPACKTOOL)\
1729 $($(source)_TOOL)\
1730 $($(srcname)_TOOL)\
1731 $($(target)_UNPACKTOOL)\
1732 $($(target)_TOOL) \
1733 )
1734ifeq ($(tool),)
1735local tool := $(toupper $(subst .,,$(suffix $(subst tar.,TAR,$(srcname)))))
1736$(evalval def_tools_include)
1737endif
1738local flags :=\
1739 $(TOOL_$(tool)_UNPACKFLAGS)\
1740 $(UNPACKFLAGS)\
1741 $($(target)_UNPACKFLAGS)\
1742 $($(srcname)_UNPACKFLAGS)\
1743 $($(source)_UNPACKFLAGS)\
1744 $($(target)_$(srcname)_UNPACKFLAGS)\
1745 $($(target)_$(source)_UNPACKFLAGS)
1746
1747#$ (warning dbg: target=$(target) source=$(source) $(srcname)=$(srcname) tool=$(tool) out=$(out) flags=$(flags) dirdep=$(dirdep) inst=$(inst) md5=$(md5) size=$(size))
1748ifndef TOOL_$(tool)_UNPACK_CMDS
1749$(warning kBuild: tools: \
1750 1 $($(target)_$(source)_UNPACKTOOL)\
1751 2 $($(target)_$(srcname)_UNPACKTOOL)\
1752 3 $($(target)_$(source)_TOOL)\
1753 4 $($(target)_$(srcname)_TOOL)\
1754 5 $($(source)_UNPACKTOOL)\
1755 6 $($(srcname)_UNPACKTOOL)\
1756 7 $($(source)_TOOL)\
1757 8 $($(srcname)_TOOL)\
1758 9 $($(target)_UNPACKTOOL)\
1759 10 $($(target)_TOOL) \
1760 11 $(toupper $(subst tar.,TAR,$(ext $(srcname)))) \
1761 )
1762$(error kBuild: TOOL_$(tool)_UNPACK_CMDS is not defined. source=$(source) target=$(target) )
1763endif
1764
1765# call the tool
1766$(target)_$(srcname)_UNPACK_CMDS_ := $(TOOL_$(tool)_UNPACK_CMDS)
1767$(target)_$(srcname)_UNPACK_OUTPUT_ := $(TOOL_$(tool)_UNPACK_OUTPUT)
1768$(target)_$(srcname)_UNPACK_OUTPUT_MAYBE_ := $(TOOL_$(tool)_UNPACK_OUTPUT_MAYBE)
1769$(target)_$(srcname)_UNPACK_DEPEND_ := $(TOOL_$(tool)_UNPACK_DEPEND) $(deps)
1770$(target)_$(srcname)_UNPACK_DEPORD_ := $(TOOL_$(tool)_UNPACK_DEPORD) $(dirdep) $(orderdeps)
1771
1772# generate the fetch rule.
1773$(eval $(def_fetch_src_unpack_rule))
1774
1775_DIRS += $(inst) $(fetchdir)
1776
1777endef
1778
1779
1780##
1781# Define the target level rules for a fetch.
1782# @param target
1783# @param out
1784# @param inst
1785# @param _TARGET_$(target)_UNPACKED
1786# @param _TARGET_$(target)_DIGEST
1787# @param bld_trg
1788# @param bld_trg_arch
1789define def_fetch_rules
1790
1791$(out).lst: $(_TARGET_$(target)_UNPACKED) | $(call DIRDEP,$(inst))
1792 %$$(call MSG_FETCH_OK,$(target))
1793 $$(QUIET)$$(RM) -f -- $$@ $$@.tmp
1794 $$(QUIET2)$$(APPEND) $$@.tmp '$(notdir $(out))'
1795 $$(QUIET)$(if $(_TARGET_$(target)_UNPACKED),$$(CAT_EXT) $(_TARGET_$(target)_UNPACKED) >> $$@.tmp)
1796 $$(QUIET)$$(MV) -f -- $$@.tmp $$@
1797
1798$(out)_unfetched:
1799 %$$(call MSG_UNFETCH,$(target))
1800 $$(QUIET)$$(RM) -f -- $$(addprefix $(inst),$$(shell $$(CAT_EXT) $(out).lst 2> /dev/null | $$(SED) -e '/\/$$$$/d'))
1801 $$(QUIET)$$(RMDIR) -p --ignore-fail-on-non-empty --ignore-fail-on-not-exist -- $$(dir $$@) \
1802 $$(addprefix $(inst),$$(sort $$(dir $$(shell $$(CAT_EXT) $(out).lst 2> /dev/null))))
1803 $$(QUIET)$$(RM) -f -- $(out).lst $(out)
1804 $$(QUIET)$$(RMDIR) -p --ignore-fail-on-non-empty --ignore-fail-on-not-exist -- $$(dir $$@)
1805
1806$(out): $(comp-vars _TARGET_$(target)_DIGEST_PREV,_TARGET_$(target)_DIGEST,FORCE) | $(call DIRDEP,$(inst))
1807 $$(QUIET)$$(RM) -f -- $$@
1808 %$$(if $$(_TARGET_$(target)_DIGEST),$$(if $$(wildcard $(out).lst)\
1809 ,$$(call MSG_REFETCH,$(target)),$$(call MSG_FETCH,$(target))),$$(call MSG_UNFETCH,$(target)))
1810 $$(QUIET)$$(if $$(wildcard $(out).lst ),$$(MAKE) -f $(MAKEFILE) --no-print-directory $(out)_unfetched)
1811 $$(QUIET)$$(if $$(_TARGET_$(target)_DIGEST),$$(MAKE) -f $(MAKEFILE) --no-print-directory $(out).lst,$$(RMDIR) -p --ignore-fail-on-non-empty --ignore-fail-on-not-exist -- $$(dir $$@))
1812 $$(QUIET2)$$(if $$(_TARGET_$(target)_DIGEST),$$(APPEND) $$@ "_TARGET_$(target)_DIGEST_PREV := $(_TARGET_$(target)_DIGEST)")
1813
1814.NOTPARALLEL: $(out).lst $(out)_unfetched $(out)
1815
1816endef
1817
1818
1819##
1820# Deal with one fetch target.
1821# @param target
1822# @param bld_trg
1823# @param bld_trg_arch
1824define def_fetch
1825# common
1826INSTARGET_$(target) := $($(target)_INST)
1827ifneq ($(patsubst %/,ok,$(INSTARGET_$(target))),ok)
1828$(error kBuild: Bad or missing INST property for target '$(target)'. \
1829 $(target)_INST='$($(target)_INST)' ($(origin $(target)_INST)))
1830endif
1831_TARGET_$(target)_FETCHED :=
1832_TARGET_$(target)_UNPACKED :=
1833_TARGET_$(target)_DIGEST :=
1834local clean_files := $($(target)_CLEAN) $($(target)_CLEAN.$(bld_trg)) $($(target)_CLEAN.$(bld_trg).$(bld_trg_arch)) $($(target)_CLEAN.$(bld_trg_arch)) $($(target)_CLEAN.$(KBUILD_TYPE))
1835
1836# The 'sources'.
1837#$ (warning dbg fetch: target=$(target) sources=$($(target)_SOURCES) $($(target)_SOURCES.$(KBUILD_TYPE)) $($(target)_SOURCES.$(KBUILD_TARGET)) $($(target)_SOURCES.$(bld_trg_arch)) $($(target)_SOURCES.$(KBUILD_TARGET).$(bld_trg_arch)))
1838$(foreach source,$($(target)_SOURCES) $($(target)_SOURCES.$(KBUILD_TYPE)) $($(target)_SOURCES.$(bld_trg)) $($(target)_SOURCES.$(bld_trg_arch)) $($(target)_SOURCES.$(bld_trg).$(bld_trg_arch)),\
1839 $(evalval def_fetch_src))
1840
1841# The target.
1842local inst := $(INSTARGET_$(target))
1843local out := $(inst)_kBuild_fetch_$(target)
1844
1845$(eval includedep $(out))
1846
1847$(eval $(def_fetch_rules))
1848
1849# Define the aliases here (doesn't work if defined in def_fetch_rules, just like includedep).
1850$(target): $(out)
1851$(target)_unfetch: $(out)_unfetched
1852
1853_FETCHES += $(out)
1854_DOWNLOADS += $(_TARGET_$(target)_FETCHED)
1855_UNPACKS += $(_TARGET_$(target)_UNPACKED)
1856_UNFETCHES += $(out)_unfetched
1857_DIRS += $(inst)
1858_CLEAN_FILES += $(clean_files)
1859
1860endef
1861
1862# Walk the FETCH target lists.
1863bld_trg := $(KBUILD_TARGET)
1864bld_trg_arch := $(KBUILD_TARGET_ARCH)
1865$(foreach target, $(_ALL_FETCHES), \
1866 $(evalvalctx def_fetch))
1867
1868# some aliases.
1869download: $(_DOWNLOADS)
1870unpack: $(_UNPACKS)
1871fetch: $(_FETCHES)
1872unfetch: $(_UNFETCHES)
1873
1874ifdef KBUILD_PROFILE_SELF
1875 _KBUILD_TS_NOW := $(nanots )
1876 $(info prof: $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_HEADER_START)) - $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_PREV)) - done fetching targets)
1877 $(info stat: $(make-stats ))
1878 _KBUILD_TS_PREV := $(_KBUILD_TS_NOW)
1879endif
1880
1881
1882
1883##
1884## Patching.
1885##
1886##
1887#define def_patch_src
1888#
1889#endef
1890#
1891#
1892## Deal with one patch target.
1893#define def_patch
1894#
1895#$(foreach source,$($(target)_SOURCES) $($(target)_SOURCES.$(KBUILD_TYPE)) $($(target)_SOURCES.$(KBUILD_TARGET)) $($(target)_SOURCES.$(KBUILD_TARGET_ARCH)) $($(target)_SOURCES.$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)),\
1896# $(evalval def_patch_src))
1897#
1898#_PATCHES +=
1899#endef
1900#
1901#$(foreach target, $(_ALL_PATCHES), \
1902# $(evalval def_patch))
1903#
1904
1905
1906#
1907# Object processing.
1908#
1909
1910## wrapper the compile command dependency check.
1911ifndef NO_COMPILE_CMDS_DEPS
1912 _DEP_COMPILE_CMDS = $$(comp-cmds-ex $$($(target)_$(subst :,_,$(source))_CMDS_PREV_),$$(commands $(obj)),FORCE)
1913else
1914 _DEP_COMPILE_CMDS =
1915endif
1916
1917## Generates the rules for building a specific object, and the aliases
1918# for building a source file.
1919# @param $(obj) The object file.
1920define def_target_source_rule
1921ifdef TOOL_$(tool)_COMPILE_$(type)_USES_KOBJCACHE
1922$(outbase).koc +| $(obj) $($(target)_$(source)_OUTPUT_) $($(target)_$(source)_OUTPUT_MAYBE_) : \
1923 $($(target)_$(source)_DEPEND_) \
1924 $(value _DEP_COMPILE_CMDS) \
1925 | \
1926 $($(target)_$(source)_DEPORD_) \
1927 $$$$($(target)_INTERMEDIATES)
1928 %$$(call MSG_COMPILE,$(target),$(source),$$@,$(type))
1929else
1930$(obj) + $($(target)_$(source)_OUTPUT_) +| $($(target)_$(source)_OUTPUT_MAYBE_) : \
1931 $($(target)_$(source)_DEPEND_) \
1932 $(value _DEP_COMPILE_CMDS) \
1933 | \
1934 $($(target)_$(source)_DEPORD_) \
1935 $$$$($(target)_INTERMEDIATES)
1936 %$$(call MSG_COMPILE,$(target),$(source),$$@,$(type))
1937ifdef TOOL_$(tool)_COMPILE_$(type)_DONT_PURGE_OUTPUT
1938 $$(QUIET)$$(RM) -f -- $(dep) $(obj) $($(target)_$(source)_OUTPUT_) $($(target)_OUTPUT_MAYBE_)
1939endif
1940endif
1941
1942$($(target)_$(source)_CMDS_)
1943
1944ifndef NO_COMPILE_CMDS_DEPS
1945 %$$(QUIET2)$$(APPEND) '$(dep)'
1946 %$$(QUIET2)$$(APPEND) '$(dep)' 'define $(target)_$(subst :,_,$(source))_CMDS_PREV_'
1947 %$$(QUIET2)$$(APPEND) -c '$(dep)' '$(obj)'
1948 %$$(QUIET2)$$(APPEND) '$(dep)' 'endef'
1949endif
1950
1951$(basename $(notdir $(obj))).o: $(obj)
1952$(basename $(notdir $(obj))).obj: $(obj)
1953
1954## @todo make this 'local cmds' in 0.2.x or when a new kb-src-one is added.
1955$(target)_$(source)_CMDS_ :=
1956endef
1957
1958
1959## wrapper the link command dependency check.
1960ifndef NO_LINK_CMDS_DEPS
1961 _DEP_LINK_CMDS = $$(comp-cmds-ex $$($(target)_CMDS_PREV_),$$(commands $(out)),FORCE)
1962else
1963 _DEP_LINK_CMDS =
1964endif
1965
1966## Generate the link rule for a target.
1967# @param $(target) The normalized target name.
1968# @param $(dirdep) Directories we depend upon begin created before linking.
1969# @param $(dep) The name of the dependency file.
1970# @param $(out)
1971# @param $($(target)_OUTPUT_) Output files from the link.
1972# @param $($(target)_OUTPUT_MAYBE_) Output files that the link may perhaps create.
1973# @param $($(target)_DEPEND_) Dependencies.
1974# @param $($(target)_DEPORD_) Dependencies which should only affect build order.
1975# @param $(cmds) The link commands.
1976# @param $($(target)_CMDS_PREV_) The link commands from the previous run.
1977define def_link_rule
1978$(out) + $($(target)_OUTPUT_) +| $($(target)_OUTPUT_MAYBE_) : \
1979 $($(target)_DEPEND_) \
1980 $(value _DEP_LINK_CMDS) \
1981 | \
1982 $($(target)_DEPORD_)
1983 %$$(call MSG_LINK,$(target),$$@,$(tool_do))
1984 $$(QUIET)$$(RM) -f -- $(dep) $(out) $($(target)_OUTPUT_) $($(target)_OUTPUT_MAYBE_)
1985
1986$(cmds)
1987
1988ifndef NO_LINK_CMDS_DEPS
1989 %$$(QUIET2)$$(APPEND) '$(dep)' 'define $(target)_CMDS_PREV_'
1990 %$$(QUIET2)$$(APPEND) -c '$(dep)' '$(out)'
1991 %$$(QUIET2)$$(APPEND) '$(dep)' 'endef'
1992endif
1993
1994$(basename $(notdir $(out))): $(out)
1995
1996endef
1997
1998
1999## Generate the link & lib install rule
2000# @param $(target) Normalized target name.
2001# @param $(out) The build target.
2002# @param $(INSTARGET_$(target)) The installation targets.
2003# @param $(mode) The file mode (optional)
2004define def_link_install_rule
2005$(INSTARGET_$(target)) : $(out) | $(call DIRDEP,$(dir $(INSTARGET_$(target))))
2006 %$$(call MSG_INST_TRG,$(target),$(out),$$@)
2007 $$(QUIET)$$(INSTALL) $$(if $(mode),-m $(mode)) -- $(out) $$@
2008
2009ifdef KBUILD_DO_AUTO_INSTALL
2010$(basename $(notdir $(out))): $(INSTARGET_$(target))
2011endif
2012endef
2013
2014
2015## def_src_handler_*
2016#
2017# @{
2018define def_src_handler_c
2019local type := C
2020 $(kb-src-one )
2021endef
2022
2023define def_src_handler_cxx
2024local type := CXX
2025 $(kb-src-one )
2026endef
2027
2028define def_src_handler_objc
2029local type := OBJC
2030 $(kb-src-one )
2031endef
2032
2033define def_src_handler_asm
2034local type := AS
2035 $(kb-src-one )
2036endef
2037
2038define def_src_handler_rc
2039local type := RC
2040 $(kb-src-one )
2041endef
2042
2043define def_src_handler_obj
2044ifeq ($(defpath),)
2045 $(target)_OBJS_ += $(source)
2046else
2047 $(target)_OBJS_ += $(abspathex $(source), $(defpath))
2048endif
2049endef
2050## @}
2051
2052## Handle one source.
2053# .
2054define def_src_handler_one
2055local suff := $(suffix $(source))
2056local src_handler := $(firstword $(filter $(suff):%, $($(target)_$(source)_SRC_HANDLERS) $($(source)_SRC_HANDLERS) $(target_src_handlers) ))
2057local handler := $(patsubst $(suff):%,%,$(src_handler))
2058ifneq ($(handler),)
2059 $(evalvalctx $(handler))
2060else
2061 othersrc += $(source)
2062endif
2063endef
2064
2065## Generic macro for processing all target sources.
2066# @param $(target) Normalized target name.
2067# @param $(defpath)
2068# @param much-more...
2069# @returns othersrc, $(target)_OBJS_, ++
2070define def_target_sources
2071local target_src_handlers := $($(target)_SRC_HANDLERS) $(KBUILD_SRC_HANDLERS)
2072$(foreach source,\
2073 $($(target)_SOURCES)\
2074 $($(target)_SOURCES.$(bld_trg))\
2075 $($(target)_SOURCES.$(bld_trg).$(bld_trg_arch))\
2076 $($(target)_SOURCES.$(bld_trg_arch))\
2077 $($(target)_SOURCES.$(bld_trg_cpu))\
2078 $($(target)_SOURCES.$(bld_type))\
2079 ,$(evalval def_src_handler_one) )
2080
2081$(foreach source,\
2082 $($(target)_GEN_SOURCES_)\
2083 $($(target)_GEN_SOURCES_.$(bld_trg))\
2084 $($(target)_GEN_SOURCES_.$(bld_trg).$(bld_trg_arch))\
2085 $($(target)_GEN_SOURCES_.$(bld_trg_arch))\
2086 $($(target)_GEN_SOURCES_.$(bld_trg_cpu))\
2087 $($(target)_GEN_SOURCES_.$(bld_type))\
2088 ,$(evalval def_src_handler_one) )
2089endef
2090
2091
2092
2093## Generic macro for generating the install rule(s) for a target
2094# and update the globals with default out.
2095#
2096# @param $(target) Normalized target name.
2097# @param $(out) The output file.
2098# @param $(definst) The default _INST value.
2099# @param $(typevar) The name of the variable with all the root targets of its type.
2100# @remark Only library uses this now.
2101define def_target_install_pluss
2102ifndef $(target)_NOINST
2103INSTARGET_$(target) := $(patsubst %/,%/$(notdir $(out)), \
2104 $(if $($(target)_INST), $(addprefix $(PATH_INS)/,$($(target)_INST)), $(definst)/))
2105
2106$(eval $(def_link_install_rule))
2107
2108_INSTALLS_FILES += $(INSTARGET_$(target))
2109
2110ifdef KBUILD_DO_AUTO_INSTALL
2111$(typevar) += $(INSTARGET_$(target))
2112else
2113$(typevar) += $(out)
2114endif
2115else # _NOINST
2116$(typevar) += $(out)
2117endif
2118
2119_OUT_FILES += $($(target)_OUTPUT_) $($(target)_OUTPUT_MAYBE_) $(out)
2120_CLEAN_FILES += $($(target)_CLEAN) $($(target)_CLEAN.$(bld_trg)) $($(target)_CLEAN.$(bld_trg).$(bld_trg_arch)) $($(target)_CLEAN.$(bld_trg_arch)) $($(target)_CLEAN.$(bld_trg_cpu)) $($(target)_CLEAN.$(bld_type))
2121_DIRS += $($(target)_BLDDIRS) $($(target)_BLDDIRS.$(bld_trg)) $($(target)_BLDDIRS.$(bld_trg).$(bld_trg_arch)) $($(target)_BLDDIRS.$(bld_trg_arch)) $($(target)_BLDDIRS.$(bld_trg_cpu)) $($(target)_BLDDIRS.$(bld_type))
2122_OBJS += $($(target)_OBJS_)
2123
2124endef
2125
2126
2127
2128#
2129# LIBRARIES
2130#
2131
2132## Library (one).
2133# @param $(target) Normalized library (target) name.
2134define def_lib
2135# library basics
2136## @todo prefix
2137local bld_type := $(firstword $($(target)_BLD_TYPE) $(KBUILD_TYPE))
2138local bld_trg := $(firstword $($(target)_BLD_TRG) $(KBUILD_TARGET))
2139local bld_trg_arch:= $(firstword $($(target)_BLD_TRG_ARCH) $(KBUILD_TARGET_ARCH))
2140local bld_trg_cpu := $(firstword $($(target)_BLD_TRG_CPU) $(KBUILD_TARGET_CPU))
2141local tool := $(call _TARGET_TOOL,$(target),AR)
2142ifeq ($(tool),)
2143$(error kBuild: Library target $(target) does not have a tool defined!)
2144endif
2145local name := $(firstword\
2146 $($(target)_NAME.$(bld_trg).$(bld_trg_arch))\
2147 $($(target)_NAME.$(bld_trg_arch))\
2148 $($(target)_NAME.$(bld_trg))\
2149 $($(target)_NAME.$(bld_type))\
2150 $($(target)_NAME)\
2151 $(target))
2152local outbase := $(call TARGET_BASE,$(name),$(target))
2153ifndef PATH_$(target)
2154 PATH_$(target) := $(patsubst %/,%,$(dir $(outbase)))
2155else ifneq ($(PATH_$(target)),$(patsubst %/,%,$(dir $(outbase))))
2156 $(error kBuild internal error: PATH_$(target)=$(PATH_$(target)) expected $(patsubst %/,%,$(dir $(outbase))))
2157endif
2158local suff := $(firstword\
2159 $($(target)_LIBSUFF.$(bld_trg).$(bld_trg_arch))\
2160 $($(target)_LIBSUFF.$(bld_trg))\
2161 $($(target)_LIBSUFF)\
2162 $(TOOL_$(tool)_ARLIBSUFF.$(bld_trg).$(bld_trg_arch))\
2163 $(TOOL_$(tool)_ARLIBSUFF.$(bld_trg))\
2164 $(TOOL_$(tool)_ARLIBSUFF)\
2165 $(SUFF_LIB))
2166local out := $(outbase)$(suff)
2167local defpath := $($(target)_PATH)
2168TARGET_$(target) := $(out)
2169# no local here - must be writable across some foreachs.
2170othersrc :=
2171$(target)_OBJS_ :=
2172
2173# Do units pre source callouts.
2174local units := \
2175 $($(target)_USES.$(bld_trg).$(bld_trg_arch))\
2176 $($(target)_USES.$(bld_trg_arch))\
2177 $($(target)_USES.$(bld_trg))\
2178 $($(target)_USES.$(bld_type))\
2179 $($(target)_USES)
2180$(foreach unit,$(units),$(evalval def_unit_$(unit)_target_pre))
2181
2182# source -> object
2183$(evalval def_target_sources)
2184
2185# library linking
2186local tool := $(call _TARGET_TOOL,$(target),AR)
2187local name := $(firstword\
2188 $($(target)_NAME.$(bld_trg).$(bld_trg_arch))\
2189 $($(target)_NAME.$(bld_trg_arch))\
2190 $($(target)_NAME.$(bld_trg))\
2191 $($(target)_NAME.$(bld_type))\
2192 $($(target)_NAME)\
2193 $(target))
2194local outbase := $(call TARGET_BASE,$(name),$(target))
2195local flags :=\
2196 $(TOOL_$(tool)_ARFLAGS)\
2197 $(TOOL_$(tool)_ARFLAGS.$(bld_type))\
2198 $(ARFLAGS)\
2199 $(ARFLAGS.$(bld_type))\
2200 $($(target)_ARFLAGS)\
2201 $($(target)_ARFLAGS.$(bld_type)) \
2202 $($(target)_ARFLAGS.$(bld_trg)) \
2203 $($(target)_ARFLAGS.$(bld_trg_arch)) \
2204 $($(target)_ARFLAGS.$(bld_trg).$(bld_trg_arch)) \
2205 $($(target)_ARFLAGS.$(bld_trg_cpu))
2206local dirdep := $(call DIRDEP,$(dir $(out)))
2207local deps := $($(target)_DEPS)
2208local orderdeps := $($(target)_ORDERDEPS)
2209
2210# Adjust paths if we got a default path.
2211ifneq ($(defpath),)
2212 $(target)_OBJS_ := $(abspathex $($(target)_OBJS_),$(defpath))
2213 local deps := $(abspathex $(deps),$(defpath))
2214 local orderdeps := $(abspathex $(orderdeps),$(defpath))
2215 othersrc := $(abspathex $(othersrc),$(defpath))
2216endif
2217
2218
2219# Custom pre-link actions.
2220ifdef $(target)_PRE_CMDS.$(bld_trg).$(bld_trg_arch).$(bld_type)
2221 local pre_cmds := $($(target)_PRE_CMDS.$(bld_trg).$(bld_trg_arch).$(bld_type))
2222else ifdef $(target)_PRE_CMDS.$(bld_trg).$(bld_trg_arch)
2223 local pre_cmds := $($(target)_PRE_CMDS.$(bld_trg).$(bld_trg_arch))
2224else ifdef $(target)_PRE_CMDS.$(bld_trg).$(bld_type)
2225 local pre_cmds := $($(target)_PRE_CMDS.$(bld_trg).$(bld_type))
2226else ifdef $(target)_PRE_CMDS.$(bld_trg_arch)
2227 local pre_cmds := $($(target)_PRE_CMDS.$(bld_trg_arch))
2228else ifdef $(target)_PRE_CMDS.$(bld_trg)
2229 local pre_cmds := $($(target)_PRE_CMDS.$(bld_trg))
2230else ifdef $(target)_PRE_CMDS.$(bld_type)
2231 local pre_cmds := $($(target)_PRE_CMDS.$(bld_type))
2232else ifdef $(target)_PRE_CMDS
2233 local pre_cmds := $($(target)_PRE_CMDS)
2234else ifdef PRE_CMDS.$(bld_trg).$(bld_trg_arch).$(bld_type)
2235 local pre_cmds := $(PRE_CMDS.$(bld_trg).$(bld_trg_arch).$(bld_type))
2236else ifdef PRE_CMDS.$(bld_trg).$(bld_trg_arch)
2237 local pre_cmds := $(PRE_CMDS.$(bld_trg).$(bld_trg_arch))
2238else ifdef PRE_CMDS.$(bld_trg).$(bld_type)
2239 local pre_cmds := $(PRE_CMDS.$(bld_trg).$(bld_type))
2240else ifdef PRE_CMDS.$(bld_trg_arch)
2241 local pre_cmds := $(PRE_CMDS.$(bld_trg_arch))
2242else ifdef PRE_CMDS.$(bld_trg)
2243 local pre_cmds := $(PRE_CMDS.$(bld_trg))
2244else ifdef PRE_CMDS.$(bld_type)
2245 local pre_cmds := $(PRE_CMDS.$(bld_type))
2246else
2247 local pre_cmds := $(PRE_CMDS)
2248endif
2249
2250# Custom post-link actions.
2251ifdef $(target)_POST_CMDS.$(bld_trg).$(bld_trg_arch).$(bld_type)
2252 local post_cmds := $($(target)_POST_CMDS.$(bld_trg).$(bld_trg_arch).$(bld_type))
2253else ifdef $(target)_POST_CMDS.$(bld_trg).$(bld_trg_arch)
2254 local post_cmds := $($(target)_POST_CMDS.$(bld_trg).$(bld_trg_arch))
2255else ifdef $(target)_POST_CMDS.$(bld_trg).$(bld_type)
2256 local post_cmds := $($(target)_POST_CMDS.$(bld_trg).$(bld_type))
2257else ifdef $(target)_POST_CMDS.$(bld_trg_arch)
2258 local post_cmds := $($(target)_POST_CMDS.$(bld_trg_arch))
2259else ifdef $(target)_POST_CMDS.$(bld_trg)
2260 local post_cmds := $($(target)_POST_CMDS.$(bld_trg))
2261else ifdef $(target)_POST_CMDS.$(bld_type)
2262 local post_cmds := $($(target)_POST_CMDS.$(bld_type))
2263else ifdef $(target)_POST_CMDS
2264 local post_cmds := $($(target)_POST_CMDS)
2265else ifdef POST_CMDS.$(bld_trg).$(bld_trg_arch).$(bld_type)
2266 local post_cmds := $(POST_CMDS.$(bld_trg).$(bld_trg_arch).$(bld_type))
2267else ifdef POST_CMDS.$(bld_trg).$(bld_trg_arch)
2268 local post_cmds := $(POST_CMDS.$(bld_trg).$(bld_trg_arch))
2269else ifdef POST_CMDS.$(bld_trg).$(bld_type)
2270 local post_cmds := $(POST_CMDS.$(bld_trg).$(bld_type))
2271else ifdef POST_CMDS.$(bld_trg_arch)
2272 local post_cmds := $(POST_CMDS.$(bld_trg_arch))
2273else ifdef POST_CMDS.$(bld_trg)
2274 local post_cmds := $(POST_CMDS.$(bld_trg))
2275else ifdef POST_CMDS.$(bld_type)
2276 local post_cmds := $(POST_CMDS.$(bld_type))
2277else
2278 local post_cmds := $(POST_CMDS)
2279endif
2280
2281# eliminate this guy?
2282local objs = $($(target)_OBJS_)
2283
2284# dependency file
2285local dep := $(out)$(SUFF_DEP)
2286ifndef NO_LINK_CMDS_DEPS
2287 _DEPFILES_INCLUDED += $(dep)
2288 $(eval includedep $(dep))
2289endif
2290
2291# check that the tool is defined.
2292ifndef TOOL_$(tool)_LINK_LIBRARY_CMDS
2293$(warning kBuild: tools: \
2294 1 $($(target)_$(source)TOOL.$(bld_trg).$(bld_trg_arch)) \
2295 2 $($(target)_$(source)TOOL.$(bld_trg)) \
2296 3 $($(target)_$(source)TOOL) \
2297 4 $($(target)_TOOL.$(bld_trg).$(bld_trg_arch)) \
2298 5 $($(target)_TOOL.$(bld_trg)) \
2299 6 $($(target)_TOOL) \
2300 7 $($(source)TOOL) \
2301 8 $($(source)TOOL.$(bld_trg).$(bld_trg_arch)) \
2302 9 $($(source)TOOL.$(bld_trg)) \
2303 10 $(TOOL.$(bld_trg).$(bld_trg_arch)) \
2304 11 $(TOOL.$(bld_trg)) \
2305 12 $(TOOL) )
2306$(error kBuild: TOOL_$(tool)_LINK_LIBRARY_CMDS isn't defined! target=$(target) )
2307endif
2308
2309# call the tool
2310local cmds := $(TOOL_$(tool)_LINK_LIBRARY_CMDS)
2311ifneq ($(pre_cmds),)
2312 local cmds := $(TAB)$(pre_cmds)$(NL)$(TAB)$(cmds)
2313endif
2314ifneq ($(post_cmds),)
2315 local cmds := $(cmds)$(NL)$(TAB)$(post_cmds)
2316endif
2317$(target)_OUTPUT_ := $(TOOL_$(tool)_LINK_LIBRARY_OUTPUT)
2318$(target)_OUTPUT_MAYBE_ := $(TOOL_$(tool)_LINK_LIBRARY_OUTPUT_MAYBE)
2319$(target)_DEPEND_ := $(TOOL_$(tool)_LINK_LIBRARY_DEPEND) $(deps) $($(target)_OBJS_)
2320$(target)_DEPORD_ := $(TOOL_$(tool)_LINK_LIBRARY_DEPORD) $(dirdep) $(orderdeps)
2321
2322# generate the link rule.
2323$(eval $(def_link_rule))
2324
2325# installing and globals
2326$(evalval def_target_install_pluss)
2327endef
2328
2329# Process libraries
2330definst := $(PATH_LIB)
2331typevar := _LIBS
2332tool_do := LINK_LIBRARY
2333mode := 0644
2334$(foreach target, $(_ALL_LIBRARIES), $(evalval def_lib))
2335
2336ifdef KBUILD_PROFILE_SELF
2337 _KBUILD_TS_NOW := $(nanots )
2338 $(info prof: $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_HEADER_START)) - $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_PREV)) - done library targets)
2339 $(info stat: $(make-stats ))
2340 _KBUILD_TS_PREV := $(_KBUILD_TS_NOW)
2341endif
2342
2343
2344#
2345# Link operations.
2346#
2347
2348##
2349# Link prolog
2350#
2351# @param $(target) Normalized target name.
2352# @param $(EXT) EXE,DLL,SYS.
2353# @param $(definst) The default _INST value.
2354# @param $(typevar) The name of the variable with all the root targets of its type.
2355define def_link_common
2356# basics
2357local bld_type := $(firstword $($(target)_BLD_TYPE) $(KBUILD_TYPE))
2358local bld_trg := $(firstword $($(target)_BLD_TRG) $(BUILD_$(bld_trg_base_var)))
2359local bld_trg_arch:= $(firstword $($(target)_BLD_TRG_ARCH) $(BUILD_$(bld_trg_base_var)_ARCH))
2360local bld_trg_cpu := $(firstword $($(target)_BLD_TRG_CPU) $(BUILD_$(bld_trg_base_var)_CPU))
2361
2362local tool := $(call _TARGET_TOOL,$(target),LD)
2363local name := $(firstword\
2364 $($(target)_NAME.$(bld_trg).$(bld_trg_arch))\
2365 $($(target)_NAME.$(bld_trg_arch))\
2366 $($(target)_NAME.$(bld_trg))\
2367 $($(target)_NAME.$(bld_type))\
2368 $($(target)_NAME)\
2369 $(target))
2370local outbase := $(call TARGET_BASE,$(name),$(target))
2371ifndef PATH_$(target)
2372 PATH_$(target) := $(patsubst %/,%,$(dir $(outbase)))
2373else ifneq ($(PATH_$(target)),$(patsubst %/,%,$(dir $(outbase))))
2374 $(error kBuild internal error: PATH_$(target)=$(PATH_$(target)) expected $(patsubst %/,%,$(dir $(outbase))))
2375endif
2376local suff := $(firstword \
2377 $($(target)_$(EXT)SUFF) \
2378 $($(target)_$(EXT)SUFF) \
2379 $(TOOL_$(tool)_LD$(EXT)SUFF) \
2380 $($(EXTPRE)SUFF_$(EXT)))
2381local out := $(outbase)$(suff)
2382TARGET_$(target) := $(out)
2383local defpath := $($(target)_PATH)
2384# no local here - must be writable across some foreachs.
2385othersrc :=
2386$(target)_OBJS_ :=
2387
2388# Do units pre source callouts.
2389local units := \
2390 $($(target)_USES.$(bld_trg).$(bld_trg_arch))\
2391 $($(target)_USES.$(bld_trg_arch))\
2392 $($(target)_USES.$(bld_trg))\
2393 $($(target)_USES.$(bld_type))\
2394 $($(target)_USES)
2395$(foreach unit,$(units),$(evalval def_unit_$(unit)_target_pre))
2396
2397# source -> object
2398$(evalval def_target_sources)
2399
2400# more link stuff.
2401local tool := $(call _TARGET_TOOL,$(target),LD)
2402local name := $(firstword\
2403 $($(target)_NAME.$(bld_trg).$(bld_trg_arch))\
2404 $($(target)_NAME.$(bld_trg_arch))\
2405 $($(target)_NAME.$(bld_trg))\
2406 $($(target)_NAME.$(bld_type))\
2407 $($(target)_NAME)\
2408 $(target))
2409local outbase := $(call TARGET_BASE,$(name),$(target))
2410local flags :=\
2411 $(TOOL_$(tool)_LDFLAGS)\
2412 $(TOOL_$(tool)_LDFLAGS.$(bld_type))\
2413 $(TOOL_$(tool)_LDFLAGS.$(bld_trg))\
2414 $(TOOL_$(tool)_LDFLAGS.$(bld_trg_arch))\
2415 $(TOOL_$(tool)_LDFLAGS.$(bld_trg).$(bld_trg_arch))\
2416 $(TOOL_$(tool)_LDFLAGS.$(bld_trg_cpu))\
2417 $(foreach sdk, $(SDKS) \
2418 $(SDKS.$(bld_type)) \
2419 $(SDKS.$(bld_trg)) \
2420 $(SDKS.$(bld_trg_arch)) \
2421 $(SDKS.$(bld_trg).$(bld_trg_arch)),\
2422 $(SDK_$(sdk)_LDFLAGS)\
2423 $(SDK_$(sdk)_LDFLAGS.$(bld_type))\
2424 $(SDK_$(sdk)_LDFLAGS.$(bld_trg))\
2425 $(SDK_$(sdk)_LDFLAGS.$(bld_trg_arch))\
2426 $(SDK_$(sdk)_LDFLAGS.$(bld_trg).$(bld_trg_arch))\
2427 $(SDK_$(sdk)_LDFLAGS.$(bld_trg_cpu)))\
2428 $(LDFLAGS)\
2429 $(LDFLAGS.$(bld_type))\
2430 $(LDFLAGS.$(bld_trg))\
2431 $(LDFLAGS.$(bld_trg_arch))\
2432 $(LDFLAGS.$(bld_trg).$(bld_trg_arch))\
2433 $(LDFLAGS.$(bld_trg_cpu))\
2434 $(foreach sdk, $($(target)_SDKS) \
2435 $($(target)_SDKS.$(bld_type)) \
2436 $($(target)_SDKS.$(bld_trg)) \
2437 $($(target)_SDKS.$(bld_trg_arch)) \
2438 $($(target)_SDKS.$(bld_trg).$(bld_trg_arch)),\
2439 $(SDK_$(sdk)_LDFLAGS)\
2440 $(SDK_$(sdk)_LDFLAGS.$(bld_type))\
2441 $(SDK_$(sdk)_LDFLAGS.$(bld_trg))\
2442 $(SDK_$(sdk)_LDFLAGS.$(bld_trg_arch))\
2443 $(SDK_$(sdk)_LDFLAGS.$(bld_trg).$(bld_trg_arch))\
2444 $(SDK_$(sdk)_LDFLAGS.$(bld_trg_cpu)))\
2445 $($(target)_LDFLAGS)\
2446 $($(target)_LDFLAGS.$(bld_type))\
2447 $($(target)_LDFLAGS.$(bld_trg))\
2448 $($(target)_LDFLAGS.$(bld_trg_arch))\
2449 $($(target)_LDFLAGS.$(bld_trg).$(bld_trg_arch))\
2450 $($(target)_LDFLAGS.$(bld_trg_cpu))
2451local libs :=\
2452 $($(target)_LIBS.$(bld_trg_cpu))\
2453 $($(target)_LIBS.$(bld_trg).$(bld_trg_arch))\
2454 $($(target)_LIBS.$(bld_trg_arch))\
2455 $($(target)_LIBS.$(bld_trg))\
2456 $($(target)_LIBS.$(bld_type))\
2457 $($(target)_LIBS)\
2458 $(foreach sdk, $($(target)_SDKS.$(bld_trg).$(bld_trg_arch)) \
2459 $($(target)_SDKS.$(bld_trg_arch)) \
2460 $($(target)_SDKS.$(bld_trg)) \
2461 $($(target)_SDKS.$(bld_type)) \
2462 $($(target)_SDKS),\
2463 $(SDK_$(sdk)_LIBS.$(bld_trg_cpu))\
2464 $(SDK_$(sdk)_LIBS.$(bld_trg).$(bld_trg_arch))\
2465 $(SDK_$(sdk)_LIBS.$(bld_trg_arch))\
2466 $(SDK_$(sdk)_LIBS.$(bld_trg))\
2467 $(SDK_$(sdk)_LIBS.$(bld_type))\
2468 $(SDK_$(sdk)_LIBS))\
2469 $(LIBS.$(bld_trg_cpu))\
2470 $(LIBS.$(bld_trg).$(bld_trg_arch))\
2471 $(LIBS.$(bld_trg_arch))\
2472 $(LIBS.$(bld_trg))\
2473 $(LIBS.$(bld_type))\
2474 $(LIBS)\
2475 $(foreach sdk, $(SDKS.$(bld_trg).$(bld_trg_arch)) \
2476 $(SDKS.$(bld_trg_arch)) \
2477 $(SDKS.$(bld_trg)) \
2478 $(SDKS.$(bld_type)) \
2479 $(SDKS),\
2480 $(SDK_$(sdk)_LIBS.$(bld_trg_cpu))\
2481 $(SDK_$(sdk)_LIBS.$(bld_trg).$(bld_trg_arch))\
2482 $(SDK_$(sdk)_LIBS.$(bld_trg_arch))\
2483 $(SDK_$(sdk)_LIBS.$(bld_trg))\
2484 $(SDK_$(sdk)_LIBS.$(bld_type))\
2485 $(SDK_$(sdk)_LIBS))\
2486 $(TOOL_$(tool)_LIBS.$(bld_trg_cpu))\
2487 $(TOOL_$(tool)_LIBS.$(bld_trg).$(bld_trg_arch))\
2488 $(TOOL_$(tool)_LIBS.$(bld_trg_arch))\
2489 $(TOOL_$(tool)_LIBS.$(bld_trg))\
2490 $(TOOL_$(tool)_LIBS.$(bld_type))\
2491 $(TOOL_$(tool)_LIBS)
2492local libpath :=\
2493 $($(target)_LIBPATH.$(bld_trg_cpu))\
2494 $($(target)_LIBPATH.$(bld_trg).$(bld_trg_arch))\
2495 $($(target)_LIBPATH.$(bld_trg_arch))\
2496 $($(target)_LIBPATH.$(bld_trg))\
2497 $($(target)_LIBPATH.$(bld_type))\
2498 $($(target)_LIBPATH)\
2499 $(foreach sdk, $($(target)_SDKS.$(bld_trg).$(bld_trg_arch)) \
2500 $($(target)_SDKS.$(bld_trg_arch)) \
2501 $($(target)_SDKS.$(bld_trg)) \
2502 $($(target)_SDKS.$(bld_type)) \
2503 $($(target)_SDKS),\
2504 $(SDK_$(sdk)_LIBPATH.$(bld_trg_cpu))\
2505 $(SDK_$(sdk)_LIBPATH.$(bld_trg).$(bld_trg_arch))\
2506 $(SDK_$(sdk)_LIBPATH.$(bld_trg_arch))\
2507 $(SDK_$(sdk)_LIBPATH.$(bld_trg))\
2508 $(SDK_$(sdk)_LIBPATH.$(bld_type))\
2509 $(SDK_$(sdk)_LIBPATH))\
2510 $(LIBPATH.$(bld_trg_cpu))\
2511 $(LIBPATH.$(bld_trg).$(bld_trg_arch))\
2512 $(LIBPATH.$(bld_trg_arch))\
2513 $(LIBPATH.$(bld_trg))\
2514 $(LIBPATH.$(bld_type))\
2515 $(LIBPATH)\
2516 $(foreach sdk, $(SDKS.$(bld_trg).$(bld_trg_arch)) \
2517 $(SDKS.$(bld_trg_arch)) \
2518 $(SDKS.$(bld_trg)) \
2519 $(SDKS.$(bld_type)) \
2520 $(SDKS),\
2521 $(SDK_$(sdk)_LIBPATH.$(bld_trg_cpu))\
2522 $(SDK_$(sdk)_LIBPATH.$(bld_trg).$(bld_trg_arch))\
2523 $(SDK_$(sdk)_LIBPATH.$(bld_trg_arch))\
2524 $(SDK_$(sdk)_LIBPATH.$(bld_trg))\
2525 $(SDK_$(sdk)_LIBPATH.$(bld_type))\
2526 $(SDK_$(sdk)_LIBPATH))\
2527 $(TOOL_$(tool)_LIBPATH.$(bld_trg_cpu))\
2528 $(TOOL_$(tool)_LIBPATH.$(bld_trg).$(bld_trg_arch))\
2529 $(TOOL_$(tool)_LIBPATH.$(bld_trg_arch))\
2530 $(TOOL_$(tool)_LIBPATH.$(bld_trg))\
2531 $(TOOL_$(tool)_LIBPATH.$(bld_type))\
2532 $(TOOL_$(tool)_LIBPATH)
2533local dirdep := $(call DIRDEP,$(dir $(out)))
2534local deps := $($(target)_DEPS)
2535local orderdeps := $($(target)_ORDERDEPS)
2536
2537# Adjust paths if we got a default path.
2538ifneq ($(defpath),)
2539 local libpath := $(abspathex $(libpath),$(defpath))
2540 $(target)_OBJS_ := $(abspathex $($(target)_OBJS_),$(defpath))
2541 local deps := $(abspathex $(deps),$(defpath))
2542 local orderdeps := $(abspathex $(orderdeps),$(defpath))
2543 othersrc := $(abspathex $(othersrc),$(defpath))
2544 # libs are not subject to this because of the the -l<lib> stuff. Use $(<target>_PATH)/lib if relative to current dir!
2545endif
2546
2547# Custom pre-link actions.
2548ifdef $(target)_PRE_CMDS.$(bld_trg).$(bld_trg_arch).$(bld_type)
2549 local pre_cmds := $($(target)_PRE_CMDS.$(bld_trg).$(bld_trg_arch).$(bld_type))
2550else ifdef $(target)_PRE_CMDS.$(bld_trg).$(bld_trg_arch)
2551 local pre_cmds := $($(target)_PRE_CMDS.$(bld_trg).$(bld_trg_arch))
2552else ifdef $(target)_PRE_CMDS.$(bld_trg).$(bld_type)
2553 local pre_cmds := $($(target)_PRE_CMDS.$(bld_trg).$(bld_type))
2554else ifdef $(target)_PRE_CMDS.$(bld_trg_arch)
2555 local pre_cmds := $($(target)_PRE_CMDS.$(bld_trg_arch))
2556else ifdef $(target)_PRE_CMDS.$(bld_trg)
2557 local pre_cmds := $($(target)_PRE_CMDS.$(bld_trg))
2558else ifdef $(target)_PRE_CMDS.$(bld_type)
2559 local pre_cmds := $($(target)_PRE_CMDS.$(bld_type))
2560else ifdef $(target)_PRE_CMDS
2561 local pre_cmds := $($(target)_PRE_CMDS)
2562else ifdef PRE_CMDS.$(bld_trg).$(bld_trg_arch).$(bld_type)
2563 local pre_cmds := $(PRE_CMDS.$(bld_trg).$(bld_trg_arch).$(bld_type))
2564else ifdef PRE_CMDS.$(bld_trg).$(bld_trg_arch)
2565 local pre_cmds := $(PRE_CMDS.$(bld_trg).$(bld_trg_arch))
2566else ifdef PRE_CMDS.$(bld_trg).$(bld_type)
2567 local pre_cmds := $(PRE_CMDS.$(bld_trg).$(bld_type))
2568else ifdef PRE_CMDS.$(bld_trg_arch)
2569 local pre_cmds := $(PRE_CMDS.$(bld_trg_arch))
2570else ifdef PRE_CMDS.$(bld_trg)
2571 local pre_cmds := $(PRE_CMDS.$(bld_trg))
2572else ifdef PRE_CMDS.$(bld_type)
2573 local pre_cmds := $(PRE_CMDS.$(bld_type))
2574else
2575 local pre_cmds := $(PRE_CMDS)
2576endif
2577
2578# Custom post-link actions.
2579ifdef $(target)_POST_CMDS.$(bld_trg).$(bld_trg_arch).$(bld_type)
2580 local post_cmds := $($(target)_POST_CMDS.$(bld_trg).$(bld_trg_arch).$(bld_type))
2581else ifdef $(target)_POST_CMDS.$(bld_trg).$(bld_trg_arch)
2582 local post_cmds := $($(target)_POST_CMDS.$(bld_trg).$(bld_trg_arch))
2583else ifdef $(target)_POST_CMDS.$(bld_trg).$(bld_type)
2584 local post_cmds := $($(target)_POST_CMDS.$(bld_trg).$(bld_type))
2585else ifdef $(target)_POST_CMDS.$(bld_trg_arch)
2586 local post_cmds := $($(target)_POST_CMDS.$(bld_trg_arch))
2587else ifdef $(target)_POST_CMDS.$(bld_trg)
2588 local post_cmds := $($(target)_POST_CMDS.$(bld_trg))
2589else ifdef $(target)_POST_CMDS.$(bld_type)
2590 local post_cmds := $($(target)_POST_CMDS.$(bld_type))
2591else ifdef $(target)_POST_CMDS
2592 local post_cmds := $($(target)_POST_CMDS)
2593else ifdef POST_CMDS.$(bld_trg).$(bld_trg_arch).$(bld_type)
2594 local post_cmds := $(POST_CMDS.$(bld_trg).$(bld_trg_arch).$(bld_type))
2595else ifdef POST_CMDS.$(bld_trg).$(bld_trg_arch)
2596 local post_cmds := $(POST_CMDS.$(bld_trg).$(bld_trg_arch))
2597else ifdef POST_CMDS.$(bld_trg).$(bld_type)
2598 local post_cmds := $(POST_CMDS.$(bld_trg).$(bld_type))
2599else ifdef POST_CMDS.$(bld_trg_arch)
2600 local post_cmds := $(POST_CMDS.$(bld_trg_arch))
2601else ifdef POST_CMDS.$(bld_trg)
2602 local post_cmds := $(POST_CMDS.$(bld_trg))
2603else ifdef POST_CMDS.$(bld_type)
2604 local post_cmds := $(POST_CMDS.$(bld_type))
2605else
2606 local post_cmds := $(POST_CMDS)
2607endif
2608
2609# eliminate this guy?
2610local objs = $($(target)_OBJS_)
2611
2612# installation targets
2613ifndef $(target)_NOINST
2614INSTARGET_$(target) := $(patsubst %/,%/$(notdir $(out)), \
2615 $(if $($(target)_INST), $(addprefix $(PATH_INS)/,$($(target)_INST)), $(definst)/))
2616ifdef KBUILD_DO_AUTO_INSTALL
2617$(typevar) += $(INSTARGET_$(target))
2618else
2619$(typevar) += $(out)
2620endif
2621# generate the install rule
2622$(eval $(def_link_install_rule))
2623
2624else # NOINST
2625INSTARGET_$(target) :=
2626$(typevar) += $(out)
2627endif # NOINST
2628
2629# dependency file
2630local dep := $(outbase)$(SUFF_DEP)
2631ifndef NO_LINK_CMDS_DEPS
2632 _DEPFILES_INCLUDED += $(dep)
2633 $(eval includedep $(dep))
2634endif
2635
2636# check that the tool is defined.
2637ifndef TOOL_$(tool)_$(tool_do)_CMDS
2638$(warning kBuild: tools: \
2639 1 $($(target)_$(source)TOOL.$(bld_trg).$(bld_trg_arch)) \
2640 2 $($(target)_$(source)TOOL.$(bld_trg)) \
2641 3 $($(target)_$(source)TOOL) \
2642 4 $($(target)_TOOL.$(bld_trg).$(bld_trg_arch)) \
2643 5 $($(target)_TOOL.$(bld_trg)) \
2644 6 $($(target)_TOOL) \
2645 7 $($(source)TOOL.$(bld_trg).$(bld_trg_arch)) \
2646 8 $($(source)TOOL.$(bld_trg)) \
2647 9 $($(source)TOOL) \
2648 10 $(TOOL.$(bld_trg).$(bld_trg_arch)) \
2649 11 $(TOOL.$(bld_trg)) \
2650 12 $(TOOL) )
2651$(error kBuild: TOOL_$(tool)_$(tool_do)_CMDS isn't defined! target=$(target) )
2652endif
2653
2654# call the tool
2655local cmds := $(TOOL_$(tool)_$(tool_do)_CMDS)
2656ifneq ($(pre_cmds),)
2657 local cmds := $(TAB)$(pre_cmds)$(NL)$(TAB)$(cmds)
2658endif
2659ifneq ($(post_cmds),)
2660 local cmds := $(cmds)$(NL)$(TAB)$(post_cmds)
2661endif
2662$(target)_OUTPUT_ := $(TOOL_$(tool)_$(tool_do)_OUTPUT)
2663$(target)_OUTPUT_MAYBE_ := $(TOOL_$(tool)_$(tool_do)_OUTPUT_MAYBE)
2664$(target)_DEPEND_ := $(TOOL_$(tool)_$(tool_do)_DEPEND) $(deps) $($(target)_OBJS_)
2665$(target)_DEPORD_ := $(TOOL_$(tool)_$(tool_do)_DEPORD) $(dirdep) $(orderdeps)
2666
2667# generate the link rule.
2668$(eval $(def_link_rule))
2669
2670
2671# Update globals.
2672_OBJS += $($(target)_OBJS_)
2673_OUT_FILES += $($(target)_OUTPUT_) $(out)
2674_CLEAN_FILES += $($(target)_CLEAN) $($(target)_CLEAN.$(bld_trg)) $($(target)_CLEAN.$(bld_trg).$(bld_trg_arch)) $($(target)_CLEAN.$(bld_trg_arch)) $($(target)_CLEAN.$(bld_trg_cpu)) $($(target)_CLEAN.$(bld_type))
2675_DIRS += $($(target)_BLDDIRS) $($(target)_BLDDIRS.$(bld_trg)) $($(target)_BLDDIRS.$(bld_trg).$(bld_trg_arch)) $($(target)_BLDDIRS.$(bld_trg_arch)) $($(target)_BLDDIRS.$(bld_trg_cpu)) $($(target)_BLDDIRS.$(bld_type))
2676_INSTALLS_FILES += $(INSTARGET_$(target))
2677
2678endef
2679
2680
2681#
2682# BLDPROGS
2683#
2684
2685## Build program (one).
2686# @param $(target) Normalized target (program) name.
2687define def_bldprog
2688
2689# set NOINST if not forced installation.
2690ifndef $(target)_INST
2691$(target)_NOINST := 1
2692endif
2693
2694# do the usual stuff.
2695$(evalval def_link_common)
2696
2697endef
2698
2699# Process build programs.
2700EXT := EXE
2701EXTPRE := HOST
2702tool_do := LINK_PROGRAM
2703definst := $(PATH_BIN)
2704typevar := _BLDPROGS
2705mode := 0755
2706bld_trg_base_var := PLATFORM
2707$(foreach target, $(_ALL_BLDPROGS), $(evalval def_bldprog))
2708
2709ifdef KBUILD_PROFILE_SELF
2710 _KBUILD_TS_NOW := $(nanots )
2711 $(info prof: $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_HEADER_START)) - $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_PREV)) - done build program targets)
2712 $(info stat: $(make-stats ))
2713 _KBUILD_TS_PREV := $(_KBUILD_TS_NOW)
2714endif
2715
2716
2717#
2718# DLLS
2719#
2720
2721# Process dlls
2722EXT := DLL
2723EXTPRE :=
2724tool_do := LINK_DLL
2725definst := $(PATH_DLL)
2726typevar := _DLLS
2727mode := 0644
2728bld_trg_base_var := TARGET
2729$(foreach target, $(_ALL_DLLS), $(evalval def_link_common))
2730
2731ifdef KBUILD_PROFILE_SELF
2732 _KBUILD_TS_NOW := $(nanots )
2733 $(info prof: $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_HEADER_START)) - $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_PREV)) - done dll targets)
2734 $(info stat: $(make-stats ))
2735 _KBUILD_TS_PREV := $(_KBUILD_TS_NOW)
2736endif
2737
2738
2739#
2740# IMPORT LIBRARIES
2741#
2742# - On OS/2 and windows these are libraries.
2743# - On other platforms they are fake DLLs.
2744#
2745EXTPRE :=
2746typevar := _IMPORT_LIBS
2747mode := 0644
2748bld_trg_base_var := TARGET
2749ifeq ($(filter-out nt os2 win win64 win32,$(KBUILD_TARGET)),)
2750 EXT := LIB
2751 tool_do := LINK_LIBRARY
2752 definst := $(PATH_LIB)
2753 $(foreach target, $(_ALL_IMPORT_LIBS), $(evalval def_lib))
2754else
2755 EXT := DLL
2756 tool_do := LINK_DLL
2757 definst := $(PATH_DLL)
2758 $(foreach target, $(_ALL_IMPORT_LIBS), $(evalval def_link_common))
2759endif
2760
2761ifdef KBUILD_PROFILE_SELF
2762 _KBUILD_TS_NOW := $(nanots )
2763 $(info prof: $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_HEADER_START)) - $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_PREV)) - done import library targets)
2764 $(info stat: $(make-stats ))
2765 _KBUILD_TS_PREV := $(_KBUILD_TS_NOW)
2766endif
2767
2768
2769#
2770# PROGRAMS
2771#
2772
2773# Process programs
2774EXT := EXE
2775EXTPRE :=
2776tool_do := LINK_PROGRAM
2777definst := $(PATH_BIN)
2778typevar := _PROGRAMS
2779mode := 0755
2780bld_trg_base_var := TARGET
2781$(foreach target, $(_ALL_PROGRAMS), $(evalval def_link_common))
2782
2783ifdef KBUILD_PROFILE_SELF
2784 _KBUILD_TS_NOW := $(nanots )
2785 $(info prof: $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_HEADER_START)) - $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_PREV)) - done program targets)
2786 $(info stat: $(make-stats ))
2787 _KBUILD_TS_PREV := $(_KBUILD_TS_NOW)
2788endif
2789
2790
2791#
2792# SYSMODS
2793#
2794
2795# Process sysmods
2796EXT := SYS
2797EXTPRE :=
2798tool_do := LINK_SYSMOD
2799definst := $(PATH_SYS)
2800typevar := _SYSMODS
2801mode := 0644
2802bld_trg_base_var := TARGET
2803$(foreach target, $(_ALL_SYSMODS), $(evalval def_link_common))
2804
2805ifdef KBUILD_PROFILE_SELF
2806 _KBUILD_TS_NOW := $(nanots )
2807 $(info prof: $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_HEADER_START)) - $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_PREV)) - done sysmod targets)
2808 $(info stat: $(make-stats ))
2809 _KBUILD_TS_PREV := $(_KBUILD_TS_NOW)
2810endif
2811
2812
2813#
2814# OTHERS
2815#
2816_OTHERS = $(OTHERS) $(OTHERS.$(KBUILD_TARGET)) $(OTHERS.$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH))
2817
2818
2819#
2820# INSTALLS
2821#
2822
2823## generate the install rule
2824define def_install_src_rule
2825# the install rule
2826$(insdst) : $(srcsrc) | $(call DIRDEP,$(dir $(insdst)))
2827 %$$(call MSG_INST_FILE,$(srcsrc),$(insdst))
2828 $$(QUIET)$(inscmd)
2829endef
2830
2831## install one file
2832define def_install_src
2833
2834# deal with '=>' in the source file name.
2835local srcdst := $(subst =>, ,$(src))
2836local srcsrc := $(firstword $(srcdst))
2837local srcdstdir := $(dir $(word 2,$(srcdst)))
2838local srcdst := $(word $(words $(srcdst)),$(srcdst))
2839
2840# _INSTFUN
2841ifdef $(srcsrc)_INSTFUN
2842 local instfun := $(srcsrc)_INSTFUN
2843else ifdef $(target)_INSTFUN
2844 local instfun := $(target)_INSTFUN
2845else
2846 local instfun := _INSTALL_FILE
2847endif
2848
2849# _INST
2850ifdef $(srcsrc)_INST
2851 local inst := $(patsubst %/,%,$($(srcsrc)_INST))/$(dir $(srcdstdir))
2852else ifdef $(target)_INST
2853 local inst := $(patsubst %/,%,$($(target)_INST))/$(dir $(srcdstdir))
2854else
2855 local inst := $(dir $(srcdstdir))
2856endif
2857
2858# calc target
2859local insdst := $(call $(instfun),$(srcdst),$(target),$(inst),$(PATH_INS))
2860#$(warning instfun=$(instfun) srcdst=$(srcdst) target=$(target) inst=$(inst) => insdst=$(insdst))
2861
2862# mode, uid and gid
2863local mode := $(firstword \
2864 $($(target)_$(srcsrc)_MODE.$(bld_trg).$(bld_trg_arch)) \
2865 $($(target)_$(srcsrc)_MODE.$(bld_trg)) \
2866 $($(target)_$(srcsrc)_MODE) \
2867 $($(target)_$(srcdst)_MODE.$(bld_trg).$(bld_trg_arch)) \
2868 $($(target)_$(srcdst)_MODE.$(bld_trg)) \
2869 $($(target)_$(srcdst)_MODE) \
2870 $($(srcsrc)_MODE.$(bld_trg).$(bld_trg_arch)) \
2871 $($(srcsrc)_MODE.$(bld_trg)) \
2872 $($(srcsrc)_MODE) \
2873 $($(srcdst)_MODE.$(bld_trg).$(bld_trg_arch)) \
2874 $($(srcdst)_MODE.$(bld_trg)) \
2875 $($(srcdst)_MODE) \
2876 $($(target)_MODE.$(bld_trg).$(bld_trg_arch)) \
2877 $($(target)_MODE.$(bld_trg)) \
2878 $($(target)_MODE))
2879local uid := $(firstword \
2880 $($(target)_$(srcsrc)_UID.$(bld_trg).$(bld_trg_arch)) \
2881 $($(target)_$(srcsrc)_UID.$(bld_trg)) \
2882 $($(target)_$(srcsrc)_UID) \
2883 $($(target)_$(srcdst)_UID.$(bld_trg).$(bld_trg_arch)) \
2884 $($(target)_$(srcdst)_UID.$(bld_trg)) \
2885 $($(target)_$(srcdst)_UID) \
2886 $($(srcsrc)_UID.$(bld_trg).$(bld_trg_arch)) \
2887 $($(srcsrc)_UID.$(bld_trg)) \
2888 $($(srcsrc)_UID) \
2889 $($(srcdst)_UID.$(bld_trg).$(bld_trg_arch)) \
2890 $($(srcdst)_UID.$(bld_trg)) \
2891 $($(srcdst)_UID) \
2892 $($(target)_UID.$(bld_trg).$(bld_trg_arch)) \
2893 $($(target)_UID.$(bld_trg)) \
2894 $($(target)_UID))
2895local gid := $(firstword \
2896 $($(target)_$(srcsrc)_GID.$(bld_trg).$(bld_trg_arch)) \
2897 $($(target)_$(srcsrc)_GID.$(bld_trg)) \
2898 $($(target)_$(srcsrc)_GID) \
2899 $($(target)_$(srcdst)_GID.$(bld_trg).$(bld_trg_arch)) \
2900 $($(target)_$(srcdst)_GID.$(bld_trg)) \
2901 $($(target)_$(srcdst)_GID) \
2902 $($(srcsrc)_GID.$(bld_trg).$(bld_trg_arch)) \
2903 $($(srcsrc)_GID.$(bld_trg)) \
2904 $($(srcsrc)_GID) \
2905 $($(srcdst)_GID.$(bld_trg).$(bld_trg_arch)) \
2906 $($(srcdst)_GID.$(bld_trg)) \
2907 $($(srcdst)_GID) \
2908 $($(target)_GID.$(bld_trg).$(bld_trg_arch)) \
2909 $($(target)_GID.$(bld_trg)) \
2910 $($(target)_GID))
2911local flags := \
2912 $($(target)_IFFLAGS) \
2913 $($(target)_IFFLAGS.$(bld_trg)) \
2914 $($(target)_IFFLAGS.$(bld_trg).$(bld_trg_arch)) \
2915 $($(srcdst)_IFFLAGS) \
2916 $($(srcdst)_IFFLAGS.$(bld_trg)) \
2917 $($(srcdst)_IFFLAGS.$(bld_trg).$(bld_trg_arch)) \
2918 $($(srcsrc)_IFFLAGS) \
2919 $($(srcsrc)_IFFLAGS.$(bld_trg)) \
2920 $($(srcsrc)_IFFLAGS.$(bld_trg).$(bld_trg_arch)) \
2921 $($(target)_$(srcdst)_IFFLAGS) \
2922 $($(target)_$(srcdst)_IFFLAGS.$(bld_trg)) \
2923 $($(target)_$(srcdst)_IFFLAGS.$(bld_trg).$(bld_trg_arch)) \
2924 $($(target)_$(srcsrc)_IFFLAGS) \
2925 $($(target)_$(srcsrc)_IFFLAGS.$(bld_trg)) \
2926 $($(target)_$(srcsrc)_IFFLAGS.$(bld_trg).$(bld_trg_arch))
2927clean_files += \
2928 $($(srcdst)_CLEAN) \
2929 $($(srcdst)_CLEAN.$(bld_trg)) \
2930 $($(srcdst)_CLEAN.$(bld_trg).$(bld_trg_arch)) \
2931 $($(srcsrc)_CLEAN) \
2932 $($(srcsrc)_CLEAN.$(bld_trg)) \
2933 $($(srcsrc)_CLEAN.$(bld_trg).$(bld_trg_arch)) \
2934 $($(target)_$(srcdst)_CLEAN) \
2935 $($(target)_$(srcdst)_CLEAN.$(bld_trg)) \
2936 $($(target)_$(srcdst)_CLEAN.$(bld_trg).$(bld_trg_arch)) \
2937 $($(target)_$(srcsrc)_CLEAN) \
2938 $($(target)_$(srcsrc)_CLEAN.$(bld_trg)) \
2939 $($(target)_$(srcsrc)_CLEAN.$(bld_trg).$(bld_trg_arch))
2940
2941
2942# Adjust the source if we got a default PATH. (This must be done this late!)
2943ifdef $(target)_PATH
2944 local srcsrc := $(abspathex $(srcsrc),$($(target)_PATH))
2945endif
2946
2947# create the command
2948ifdef $(srcsrc)_INSTALLER
2949 local inscmd := $(call $(srcsrc)_INSTALLER,$(srcsrc),$(insdst),$(target),$(flags))
2950else ifdef $(target)_INSTALLER
2951 local inscmd := $(call $(target)_INSTALLER,$(srcsrc),$(insdst),$(target),$(flags))
2952else
2953 local inscmd := $$(INSTALL)\
2954 $(if $(uid),-o $(uid))\
2955 $(if $(gid),-g $(gid))\
2956 $(if $(mode),-m $(mode))\
2957 $(flags) -- \
2958 $(srcsrc) $(insdst)
2959endif
2960
2961# generate the rule (need double evaluation here)
2962$(eval $(def_install_src_rule))
2963
2964INSTARGET_$(target) += $(insdst)
2965endef
2966
2967
2968## generate the symlink rule
2969define def_install_symlink_rule
2970# the install rule
2971$(insdst) : | $(call DIRDEP,$(dir $(insdst)))
2972 %$$(call MSG_INST_SYM,$(insdst),$(symdst))
2973 $$(QUIET)$$(RM) -f -- $$@
2974 $$(QUIET)$$(LN_SYMLINK) $(symdst) $(insdst)
2975endef
2976
2977## create one symlink
2978define def_install_symlink
2979
2980# deal with '=>' in the source file name.
2981local symdst := $(subst =>, ,$(src))
2982local symlnk := $(firstword $(symdst))
2983local symdst := $(word $(words $(symdst)),$(symdst))
2984
2985# _INSTFUN
2986ifdef $(symlnk)_INSTFUN
2987 local instfun := $(symlnk)_INSTFUN
2988else ifdef $(target)_INSTFUN
2989 local instfun := $(target)_INSTFUN
2990else
2991 local instfun := _INSTALL_FILE
2992endif
2993
2994# _INST
2995ifdef $(symlnk)_INST
2996 local inst := $(patsubst %/,%,$($(symlnk)_INST))/$(dir $(symlnk))
2997else ifdef $(target)_INST
2998 local inst := $(patsubst %/,%,$($(target)_INST))/$(dir $(symlnk))
2999else
3000 local inst := $(dir $(symlnk))
3001endif
3002
3003# calc target
3004local insdst := $(call $(instfun),$(symlnk),$(target),$(inst),$(PATH_INS))
3005#$(warning symlnk=$(symlnk) symdst=$(symdst) insdst=$(insdst) instfun=$(instfun) inst='$(inst)')
3006
3007# generate the rule (need double evaluation here)
3008$(eval $(def_install_symlink_rule))
3009
3010INSTARGET_$(target) += $(insdst)
3011endef
3012
3013
3014## generate the install rule
3015define def_install_directory_rule
3016# the install rule
3017$(insdst):
3018 %$$(call MSG_INST_DIR,$(insdst))
3019 $$(QUIET)$$(INSTALL) -d \
3020 $(if $(uid),-o $(uid))\
3021 $(if $(gid),-g $(gid))\
3022 $(if $(mode),-m $(mode))\
3023 $(flags) -- \
3024 $(insdst)
3025
3026.NOTPARALLEL: $(insdst)
3027endef
3028
3029
3030## create one directory
3031define def_install_directory
3032
3033# _INST
3034ifdef $(directory)_INST
3035 local inst := $(PATH_INS)/$(patsubst %/,%,$($(directory)_INST))
3036else ifdef $(target)_INST
3037 local inst := $(PATH_INS)/$(patsubst %/,%,$($(target)_INST))
3038else
3039 local inst := $(PATH_INS)
3040endif
3041
3042local mode := $(firstword \
3043 $($(target)_$(directory)_MODE.$(bld_trg).$(bld_trg_arch)) \
3044 $($(target)_$(directory)_MODE.$(bld_trg)) \
3045 $($(target)_$(directory)_MODE) \
3046 $($(directory)_MODE.$(bld_trg).$(bld_trg_arch)) \
3047 $($(directory)_MODE.$(bld_trg)) \
3048 $($(directory)_MODE) \
3049 $($(target)_MODE.$(bld_trg).$(bld_trg_arch)) \
3050 $($(target)_MODE.$(bld_trg)) \
3051 $($(target)_MODE))
3052local uid := $(firstword \
3053 $($(target)_$(directory)_UID.$(bld_trg).$(bld_trg_arch)) \
3054 $($(target)_$(directory)_UID.$(bld_trg)) \
3055 $($(target)_$(directory)_UID) \
3056 $($(directory)_UID.$(bld_trg).$(bld_trg_arch)) \
3057 $($(directory)_UID.$(bld_trg)) \
3058 $($(directory)_UID) \
3059 $($(target)_UID.$(bld_trg).$(bld_trg_arch)) \
3060 $($(target)_UID.$(bld_trg)) \
3061 $($(target)_UID))
3062local gid := $(firstword \
3063 $($(target)_$(directory)_GID.$(bld_trg).$(bld_trg_arch)) \
3064 $($(target)_$(directory)_GID.$(bld_trg)) \
3065 $($(target)_$(directory)_GID) \
3066 $($(directory)_GID.$(bld_trg).$(bld_trg_arch)) \
3067 $($(directory)_GID.$(bld_trg)) \
3068 $($(directory)_GID) \
3069 $($(target)_GID.$(bld_trg).$(bld_trg_arch)) \
3070 $($(target)_GID.$(bld_trg)) \
3071 $($(target)_GID))
3072local flags := \
3073 $($(target)_IDFLAGS)\
3074 $($(target)_IDFLAGS.$(bld_trg)) \
3075 $($(target)_IDFLAGS.$(bld_trg).$(bld_trg_arch)) \
3076 $($(directory)_IDFLAGS) \
3077 $($(directory)_IDFLAGS.$(bld_trg)) \
3078 $($(directory)_IDFLAGS.$(bld_trg).$(bld_trg_arch)) \
3079 $($(target)_$(directory)_IDFLAGS) \
3080 $($(target)_$(directory)_IDFLAGS.$(bld_trg)) \
3081 $($(target)_$(directory)_IDFLAGS.$(bld_trg).$(bld_trg_arch))
3082
3083local insdst := $(inst)/$(directory)/
3084#$(warning directory=$(directory) inst=$(inst) insdst=$(insdst) mode=$(mode) gid=$(gid) uid=$(uid))
3085
3086# generate the rule (need double evaluation here)
3087$(eval $(def_install_directory_rule))
3088
3089INSTARGET_DIRS_$(target) += $(insdst)
3090endef
3091
3092
3093## process one install target.
3094define def_install
3095# the basics.
3096local bld_type := $(firstword $($(target)_BLD_TYPE) $(KBUILD_TYPE))
3097local bld_trg := $(firstword $($(target)_BLD_TRG) $(KBUILD_TARGET))
3098local bld_trg_arch:= $(firstword $($(target)_BLD_TRG_ARCH) $(KBUILD_TARGET_ARCH))
3099local bld_trg_cpu := $(firstword $($(target)_BLD_TRG_CPU) $(KBUILD_TARGET_CPU))
3100
3101INSTARGET_$(target) := $($(target)_GOALS)
3102INSTARGET_DIRS_$(target) :=
3103
3104local clean_files := $($(target)_CLEAN) $($(target)_CLEAN.$(bld_trg)) $($(target)_CLEAN.$(bld_trg).$(bld_trg_arch)) $($(target)_CLEAN.$(bld_trg_arch)) $($(target)_CLEAN.$(bld_trg_cpu)) $($(target)_CLEAN.$(bld_type))
3105
3106$(foreach directory,$($(target)_DIRS) $($(target)_DIRS.$(bld_trg)) $($(target)_DIRS.$(bld_trg).$(bld_trg_arch)) $($(target)_DIRS.$(bld_trg_arch)) $($(target)_DIRS.$(bld_trg_cpu)) $($(target)_DIRS.$(bld_type)), \
3107 $(evalval def_install_directory))
3108
3109$(foreach src,$($(target)_SOURCES) $($(target)_SOURCES.$(bld_trg)) $($(target)_SOURCES.$(bld_trg).$(bld_trg_arch)) $($(target)_SOURCES.$(bld_trg_arch)) $($(target)_SOURCES.$(bld_trg_cpu)) $($(target)_SOURCES.$(bld_type)), \
3110 $(evalval def_install_src))
3111
3112$(foreach src,$($(target)_SYMLINKS) $($(target)_SYMLINKS.$(bld_trg)) $($(target)_SYMLINKS.$(bld_trg).$(bld_trg_arch)) $($(target)_SYMLINKS.$(bld_trg_arch)) $($(target)_SYMLINKS.$(bld_trg_cpu)) $($(target)_SYMLINKS.$(bld_type)), \
3113 $(evalval def_install_symlink))
3114
3115# the collection target
3116TARGET_$(target) := $(PATH_TARGET)/$(target).ins
3117$(TARGET_$(target)): $(INSTARGET_$(target)) | $(INSTARGET_DIRS_$(target)) $(call DIRDEP,$(PATH_TARGET))
3118 @$(QUIET2)$(APPEND) $@
3119
3120$(target): $(TARGET_$(target))
3121
3122_INSTALLS += $(TARGET_$(target))
3123_INSTALLS_FILES += $(INSTARGET_$(target))
3124_INSTALLS_DIRS += $(INSTARGET_DIRS_$(target))
3125_CLEAN_FILES += $(clean_files)
3126_DIRS += $($(target)_BLDDIRS) $($(target)_BLDDIRS.$(bld_trg)) $($(target)_BLDDIRS.$(bld_trg).$(bld_trg_arch)) $($(target)_BLDDIRS.$(bld_trg_arch)) $($(target)_BLDDIRS.$(bld_trg_cpu)) $($(target)_BLDDIRS.$(bld_type))
3127endef
3128
3129## process all install targets
3130$(foreach target, $(_ALL_INSTALLS), \
3131 $(evalvalctx def_install))
3132
3133ifdef KBUILD_PROFILE_SELF
3134 _KBUILD_TS_NOW := $(nanots )
3135 $(info prof: $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_HEADER_START)) - $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_PREV)) - done install targets)
3136 $(info stat: $(make-stats ))
3137 _KBUILD_TS_PREV := $(_KBUILD_TS_NOW)
3138endif
3139
3140#
3141# TESTING
3142#
3143_TESTING += $(TESTING) $(TESTING.$(KBUILD_TARGET)) $(TESTING.$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)) $(TESTING.$(KBUILD_TARGET_ARCH)) $(TESTING.$(KBUILD_TARGET_CPU))
3144
3145
3146#
3147# PACKING
3148#
3149_PACKING += $(PACKING) $(PACKING.$(KBUILD_TARGET)) $(PACKING.$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)) $(PACKING.$(KBUILD_TARGET_ARCH)) $(PACKING.$(KBUILD_TARGET_CPU))
3150
3151
3152#
3153# DOCS
3154#
3155
3156
3157#
3158# DIRECTORIES
3159#
3160_DIR_ALL := $(sort $(addsuffix /,$(patsubst %/,%,$(_DIRS))) $(dir $(_OUT_FILES) $(_OBJS) $(_INSTALLS_FILES)))
3161$(foreach directory,$(_INSTALLS_DIRS), $(eval _DIR_ALL := $(filter-out $(directory),$(_DIR_ALL))))
3162
3163
3164define def_mkdir_rule
3165$(directory):
3166 %$$(call MSG_MKDIR,$$@)
3167 $$(QUIET)$$(MKDIR) -p -- $$@
3168endef
3169
3170$(foreach directory,$(_DIR_ALL),$(eval $(def_mkdir_rule)))
3171
3172ifdef KBUILD_PROFILE_SELF
3173 _KBUILD_TS_NOW := $(nanots )
3174 $(info prof: $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_HEADER_START)) - $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_PREV)) - done directories)
3175 $(info stat: $(make-stats ))
3176 _KBUILD_TS_PREV := $(_KBUILD_TS_NOW)
3177endif
3178
3179
3180#
3181# NOTHING
3182#
3183do-nothing:
3184ifdef KBUILD_PROFILE_SELF
3185 @$(ECHO) 'prof: $(int-sub $(nanots ), $(_KBUILD_TS_HEADER_START)) - $(int-sub $(nanots ), $(_KBUILD_TS_PREV)) - executing $@'
3186 @$(ECHO) 'stat: $(make-stats )'
3187endif
3188 %$(call MSG_NOTHING)
3189
3190
3191#
3192# CLEAN UP
3193#
3194do-clean:
3195 %$(call MSG_CLEAN)
3196 $(QUIET)$(RM) -f -- $(_OUT_FILES) $(_OBJS) $(_DEPFILES) $(_DEPFILES_INCLUDED) $(_CLEAN_FILES) $(OTHER_CLEAN)
3197 $(QUIET)$(RMDIR) -p --ignore-fail-on-non-empty --ignore-fail-on-not-exist -- $(rsort $(dir $(_OUT_FILES) $(_OBJS) $(_DEPFILES) $(_DEPFILES_INCLUDED) $(_CLEAN_FILES) $(OTHER_CLEAN)))
3198
3199
3200
3201#
3202# PASSES (including directory and makefile walking)
3203#
3204
3205#
3206# First, check whether we need to order the passes explicitly or not.
3207# This depends on whether we're a leaf makefile or not. A leaf will
3208# know all its dependencies, while a recursive one relies on the
3209# order sub-directories and other makefiles are executed it.
3210#
3211
3212## Setup a pass and check for optimizations.
3213# @param $(PASS) Uppercase pass name.
3214define def_pass_setup_and_optimize
3215
3216# The setup. ## @todo This is looks a bit weird...
3217ifndef SUBDIRS_$(PASS)
3218 SUBDIRS_$(PASS) := $(SUBDIRS) $(SUBDIRS.$(KBUILD_TARGET)) $(SUBDIRS.$(KBUILD_TARGET.$(KBUILD_TARGET_ARCH)))
3219endif
3220ifndef SUBDIRS_AFTER_$(PASS)
3221 SUBDIRS_AFTER_$(PASS) := $(SUBDIRS_AFTER) $(SUBDIRS_AFTER.$(KBUILD_TARGET)) $(SUBDIRS_AFTER.$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH))
3222endif
3223ifndef MAKEFILES_BEFORE_$(PASS)
3224 MAKEFILES_BEFORE_$(PASS) := $(MAKEFILES_BEFORE) $(MAKEFILES_BEFORE.$(KBUILD_TARGET)) $(MAKEFILES_BEFORE.$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH))
3225endif
3226ifndef MAKEFILES_AFTER_$(PASS)
3227 MAKEFILES_AFTER_$(PASS) := $(MAKEFILES_AFTER) $(MAKEFILES_AFTER.$(KBUILD_TARGET)) $(MAKEFILES_AFTER.$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH))
3228endif
3229
3230# The check.
3231ifeq ($(_KBUILD_STRICT_PASS_ORDER),nonstrict)
3232 ifneq ($(strip \
3233 $(SUBDIRS_$(PASS)) $(SUBDIRS_$(PASS).$(KBUILD_TARGET)) $(SUBDIRS_$(PASS).$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)) \
3234 $(MAKEFILES_BEFORE_$(PASS)) $(MAKEFILES_BEFORE_$(PASS).$(KBUILD_TARGET)) $(MAKEFILES_BEFORE_$(PASS).$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)) \
3235 $(SUBDIRS_AFTER_$(PASS)) $(SUBDIRS_AFTER_$(PASS).$(KBUILD_TARGET)) $(SUBDIRS_AFTER_$(PASS).$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)) \
3236 $(MAKEFILES_AFTER_$(PASS)) $(MAKEFILES_AFTER_$(PASS).$(KBUILD_TARGET)) $(MAKEFILES_AFTER_$(PASS).$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)) \
3237 ),)
3238 _KBUILD_STRICT_PASS_ORDER := strict
3239 endif
3240endif # _KBUILD_STRICT_PASS_ORDER == nonstrict
3241endef # def_pass_setup_and_optimize
3242
3243## PASS: Setup & optimization.
3244# Check if we can apply the non-strict pass order optimzation (no SUBDIRS_* and MAKEFILES_*),
3245# and set up the pass specific variables as we go along.
3246_KBUILD_STRICT_PASS_ORDER := nonstrict
3247$(foreach PASS, $(PASSES), $(evalval def_pass_setup_and_optimize))
3248#$ (error _KBUILD_STRICT_PASS_ORDER=$(_KBUILD_STRICT_PASS_ORDER))
3249
3250
3251## Subdir
3252# @param $(pass) Lowercase pass name.
3253# @param $(PASS) Uppercase pass name.
3254# @param $(subdir) Subdirectory
3255# @param $(tag) tag to attach to the rule name.
3256define def_pass_subdir
3257pass_$(pass)$(tag):: $(dep)
3258 + $$(QUIET)$$(MAKE) -C $(subdir) -f $$(notdir $$(firstword $$(wildcard $$(addprefix $(subdir)/,$$(DEFAULT_MAKEFILE))))) pass_$(pass)
3259endef
3260
3261## Submakefile
3262# @param $(pass) Lowercase pass name.
3263# @param $(PASS) Uppercase pass name.
3264# @param $(makefile) Makefile.
3265# @param $(tag) tag to attach to the rule name.
3266define def_pass_makefile
3267pass_$(pass)$(tag):: $(dep)
3268 + $$(QUIET)$$(MAKE) -C $(patsubst %/,%,$(dir $(makefile))) -f $(notdir $(makefile)) pass_$(pass)
3269endef
3270
3271## Execute a pass, strict order.
3272# @param $(pass) Lowercase pass name.
3273# @param $(PASS) Uppercase pass name.
3274define def_pass_strict
3275$(eval tag:=_before)
3276$(eval dep:=)
3277$(foreach subdir, $(SUBDIRS_$(PASS)) $(SUBDIRS_$(PASS).$(KBUILD_TARGET)) $(SUBDIRS_$(PASS).$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)) ,$(eval $(def_pass_subdir)))
3278$(foreach makefile,$(MAKEFILES_BEFORE_$(PASS)) $(MAKEFILES_BEFORE_$(PASS).$(KBUILD_TARGET)) $(MAKEFILES_BEFORE_$(PASS).$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)),$(eval $(def_pass_makefile)))
3279
3280$(eval tag:=_after)
3281$(eval dep:=pass_$(pass)_doit)
3282$(foreach subdir, $(SUBDIRS_AFTER_$(PASS)) $(SUBDIRS_AFTER_$(PASS).$(KBUILD_TARGET)) $(SUBDIRS_AFTER_$(PASS).$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)) ,$(eval $(def_pass_subdir)))
3283$(foreach makefile,$(MAKEFILES_AFTER_$(PASS)) $(MAKEFILES_AFTER_$(PASS).$(KBUILD_TARGET)) $(MAKEFILES_AFTER_$(PASS).$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)) ,$(eval $(def_pass_makefile)))
3284
3285ifdef KBUILD_SAFE_PARALLEL
3286.NOTPARALLEL: pass_$(pass) pass_$(pass)_before pass_$(pass)_after pass_$(pass)_this
3287.PHONY: pass_$(pass) pass_$(pass)_before pass_$(pass)_after pass_$(pass)_this pass_$(pass)_doit
3288pass_$(pass)_doit: $(PASS_$(PASS)_trgs) $(foreach var,$(PASS_$(PASS)_vars),$(var))
3289pass_$(pass)_this: pass_$(pass)_before
3290 + $$(QUIET)$$(MAKE) -f $$(MAKEFILE) pass_$(pass)_doit
3291pass_$(pass)_after:: pass_$(pass)_this
3292pass_$(pass): pass_$(pass)_after
3293else # !KBUILD_SAFE_PARALLEL
3294.PHONY: pass_$(pass) pass_$(pass)_before pass_$(pass)_after pass_$(pass)_doit
3295.NOTPARALLEL: pass_$(pass) pass_$(pass)_before pass_$(pass)_after pass_$(pass)_doit
3296pass_$(pass)_doit: pass_$(pass)_before \
3297 $(PASS_$(PASS)_trgs) $(foreach var,$(PASS_$(PASS)_vars),$($(var)))
3298pass_$(pass): \
3299 pass_$(pass)_before \
3300 pass_$(pass)_doit \
3301 pass_$(pass)_after
3302endif # !KBUILD_SAFE_PARALLEL
3303
3304#$ (warning pass=$(pass) PASS=$(PASS): $(PASS_$(PASS)_trgs) $(PASS_$(PASS)_trgs) $(foreach var,$(PASS_$(PASS)_vars),$($(var))))
3305endef # def_pass_strict
3306
3307## Execute a pass, non-strict pass ordering.
3308# @param $(pass) Lowercase pass name.
3309# @param $(PASS) Uppercase pass name.
3310define def_pass_nonstrict
3311.PHONY: pass_$(pass) pass_$(pass)_before pass_$(pass)_after pass_$(pass)_doit
3312pass_$(pass)_doit: $(PASS_$(PASS)_trgs) $(foreach var,$(PASS_$(PASS)_vars),$($(var)))
3313pass_$(pass): pass_$(pass)_doit
3314endef # def_pass_nonstrict
3315
3316## PASS: rules
3317# Generate the rules for the defined passes.
3318$(foreach PASS, $(PASSES), \
3319 $(eval pass := $(PASS_$(PASS)_pass)) \
3320 $(eval $(def_pass_$(_KBUILD_STRICT_PASS_ORDER))))
3321
3322
3323## Pass order, strict.
3324# @param $(pass) Current pass name.
3325# @param $(prev_pass) The previous pass name.
3326define def_pass_order_strict
3327ifdef KBUILD_SAFE_PARALLEL
3328.PHONY: pass_$(pass)_order
3329.NOTPARALLEL: pass_$(pass)_order
3330pass_$(pass)_order: $(pass_prev)
3331 %$$(call MSG_PASS,$$(if $$(PASS_$(PASS)),$$(PASS_$(PASS)),$(pass)))
3332 + $$(QUIET)$$(MAKE) -f $$(MAKEFILE) pass_$(pass)
3333else # !KBUILD_SAFE_PARALLEL
3334.NOTPARALLEL: pass_$(pass)_order pass_$(pass)_banner
3335.PHONY: pass_$(pass)_order pass_$(pass)_banner
3336pass_$(pass)_banner:
3337 %$$(call MSG_PASS,$$(if $$(PASS_$(PASS)),$$(PASS_$(PASS)),$(pass)))
3338pass_$(pass)_order: \
3339 $(pass_prev) \
3340 pass_$(pass)_banner \
3341 pass_$(pass)
3342endif # !KBUILD_SAFE_PARALLEL
3343$(eval pass_prev := pass_$(pass)_order)
3344endef # def_pass_order_strict
3345
3346## Pass order, non-strict.
3347# @param $(pass) Current pass name.
3348# @param $(prev_pass) The previous pass name.
3349define def_pass_order_nonstrict
3350.PHONY: pass_$(pass)_order pass_$(pass)_banner
3351pass_$(pass)_banner:
3352 %$$(call MSG_PASS,$$(if $$(PASS_$(PASS)),$$(PASS_$(PASS)),$(pass)))
3353pass_$(pass)_order: \
3354 $(pass_prev) \
3355 pass_$(pass)_banner \
3356 pass_$(pass)
3357$(eval pass_prev := pass_$(pass)_order)
3358endef # def_pass_order_nonstrict
3359
3360## PASS: order
3361# Use dependencies to ensure correct pass order.
3362pass_prev :=
3363$(foreach PASS,$(DEFAULT_PASSES),\
3364 $(eval pass := $(PASS_$(PASS)_pass)) \
3365 $(eval $(def_pass_order_$(_KBUILD_STRICT_PASS_ORDER))))
3366
3367ifdef KBUILD_PROFILE_SELF
3368 _KBUILD_TS_NOW := $(nanots )
3369 $(info prof: $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_HEADER_START)) - $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_PREV)) - done passes)
3370 $(info stat: $(make-stats ))
3371 _KBUILD_TS_PREV := $(_KBUILD_TS_NOW)
3372endif
3373
3374
3375#
3376# THE MAIN RULES
3377#
3378all_recursive: $(pass_prev)
3379
3380rebuild: clean
3381 + $(MAKE) -f $(firstword $(MAKEFILE_LIST)) all_recursive
3382
3383# @todo make this a non-default pass!
3384uninstall:
3385 $(RM) -f -- $(_INSTALLS_FILES)
3386
3387install: pass_installs
3388
3389# misc shortcuts.
3390targets: bldprogs libraries dlls programs sysmods others installs
3391objects: $(_OBJS)
3392bldprogs: $(_BLDPROGS)
3393libraries: $(_LIBS) $(_IMPORT_LIBS) $(_OTHER_LIBRARIES)
3394dlls: $(_DLLS)
3395programs: $(_PROGRAMS)
3396sysmods: $(_SYSMODS)
3397others: $(_OTHERS)
3398installs: $(_INSTALLS) $(_INSTALLS_DIRS) $(_INSTALLS_FILES)
3399
3400
3401
3402#
3403# kBuild debugging stuff.
3404#
3405## @todo this doesn't work. Move to a debug unit and expand it.
3406show_targets:
3407 @$(foreach target, $(_ALL_TARGETS),\
3408 @$(ECHO) "target: $(target)" $(NLTAB)\
3409 @$(ECHO) " PATH_$(target)=$(PATH_$(target))" $(NLTAB)\
3410 @$(ECHO) " TARGET_$(target)=$(TARGET_$(target))" $(NLTAB)\
3411 @$(ECHO) " INSTARGET_$(target)=$(INSTARGET_$(target))" $(NLTAB)\
3412$(foreach prop,$(PROPS_SINGLE) $(PROPS_ACCUMULATE_L) $(PROPS_ACCUMULATE_R) OBJS_ CLEAN, \
3413 $(eval _tmp:=$(firstword $($(target)_BLD_TRG) $(KBUILD_TARGET))) \
3414 $(if $($(target)_$(prop).$(_tmp)),\
3415 @$(ECHO) " $(target)_$(prop).$(_tmp)=$($(target)_$(prop).$(_tmp))" $(NLTAB)) \
3416 $(if $($(target)_$(prop)), $(NLTAB)@$(ECHO) " $(target)_$(prop)=$($(target)_$(prop))" $(NLTAB)) \
3417)\
3418$(foreach prop,$(PROPS_DEFERRED), \
3419 $(eval _tmp:=$(firstword $($(target)_BLD_TRG) $(KBUILD_TARGET))) \
3420 $(if $(value $(target)_$(prop).$(_tmp)),\
3421 @$(ECHO) ' $(target)_$(prop).$(_tmp)=$(value $(TARGET)_$(prop).$(_tmp))' $(NLTAB)) \
3422 $(if $(value $(target)_$(prop)), $(NLTAB)@$(ECHO) ' $(target)_$(prop)=$(value $(target)_$(prop))' $(NLTAB)) \
3423))
3424
3425
3426
3427#
3428# Include dependency files.
3429#
3430ifneq ($(_DEPFILES),)
3431 includedep $(_DEPFILES)
3432endif
3433
3434
3435ifdef KBUILD_PROFILE_SELF
3436 _KBUILD_TS_FOOTER_END := $(nanots )
3437 $(info prof: $(int-sub $(_KBUILD_TS_FOOTER_END), $(_KBUILD_TS_HEADER_START)) - $(int-sub $(_KBUILD_TS_FOOTER_END), $(_KBUILD_TS_PREV)) - end of footer.kmk)
3438 $(info prof: footer.kmk: $(int-sub $(_KBUILD_TS_FOOTER_END), $(_KBUILD_TS_FOOTER_START)))
3439 $(info stat: $(make-stats ))
3440 _KBUILD_TS_PREV := $(_KBUILD_TS_FOOTER_END)
3441endif
3442
3443# end-of-file-content
3444__footer_kmk__ := target
3445endif # __footer_kmk__
3446
Note: See TracBrowser for help on using the repository browser.