source: trunk/kBuild/footer.kmk@ 1672

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

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

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