source: trunk/kBuild/footer.kmk@ 1621

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

Introduce the concept of units to prevent footer.kmk from growing beyond proportions. Features that are rarely used are put into units and dragged in via the USES property when needed. The first example of this is how lex (.l files) is handled.

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