3 # kBuild - File included at bottom of a makefile.
7 # Copyright (c) 2004-2017 knut st. osmundsen <bird-kBuild-spam-xviiv@anduin.net>
9 # This file is part of kBuild.
11 # kBuild is free software; you can redistribute it and/or modify
12 # it under the terms of the GNU General Public License as published by
13 # the Free Software Foundation; either version source of the License, or
14 # (at your option) any later version.
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.
21 # You should have received a copy of the GNU General Public License
22 # along with kBuild; if not, write to the Free Software
23 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
26 # As a special exception you are granted permission to include this file, via
27 # the kmk include directive, as you wish without this in itself causing the
28 # resulting makefile, program or whatever to be covered by the GPL license.
29 # This exception does not however invalidate any other reasons why the makefile,
30 # program, whatever should not be covered the GPL.
35 # start-of-file-content
36 ifdef KBUILD_PROFILE_SELF
37 $(evalcall def_profile_self
, start of footer.kmk
)
38 _KBUILD_TS_FOOTER_START
:= $(_KBUILD_TS_PREV
)
43 # (Some of these need initialization before including definitions using them.)
46 # All targets of each types.
47 _ALL_BLDPROGS
:= $(BLDPROGS
) $(BLDPROGS.
$(KBUILD_HOST
)) $(BLDPROGS.
$(KBUILD_HOST
).
$(KBUILD_HOST_ARCH
)) $(BLDPROGS.
$(KBUILD_HOST_ARCH
)) $(BLDPROGS.
$(KBUILD_HOST_CPU
)) $(BLDPROGS.
$(KBUILD_TYPE
))
48 _ALL_LIBRARIES
:= $(LIBRARIES
) $(LIBRARIES.
$(KBUILD_TARGET
)) $(LIBRARIES.
$(KBUILD_TARGET
).
$(KBUILD_TARGET_ARCH
)) $(LIBRARIES.
$(KBUILD_TARGET_ARCH
)) $(LIBRARIES.
$(KBUILD_TARGET_CPU
)) $(LIBRARIES.
$(KBUILD_TYPE
))
49 _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
))
50 _ALL_DLLS
:= $(DLLS
) $(DLLS.
$(KBUILD_TARGET
)) $(DLLS.
$(KBUILD_TARGET
).
$(KBUILD_TARGET_ARCH
)) $(DLLS.
$(KBUILD_TARGET_ARCH
)) $(DLLS.
$(KBUILD_TARGET_CPU
)) $(DLLS.
$(KBUILD_TYPE
))
51 _ALL_PROGRAMS
:= $(PROGRAMS
) $(PROGRAMS.
$(KBUILD_TARGET
)) $(PROGRAMS.
$(KBUILD_TARGET
).
$(KBUILD_TARGET_ARCH
)) $(PROGRAMS.
$(KBUILD_TARGET_ARCH
)) $(PROGRAMS.
$(KBUILD_TARGET_CPU
)) $(PROGRAMS.
$(KBUILD_TYPE
))
52 _ALL_SYSMODS
:= $(SYSMODS
) $(SYSMODS.
$(KBUILD_TARGET
)) $(SYSMODS.
$(KBUILD_TARGET
).
$(KBUILD_TARGET_ARCH
)) $(SYSMODS.
$(KBUILD_TARGET_ARCH
)) $(SYSMODS.
$(KBUILD_TARGET_CPU
)) $(SYSMODS.
$(KBUILD_TYPE
))
53 _ALL_MISCBINS
:= $(MISCBINS
) $(MISCBINS.
$(KBUILD_TARGET
)) $(MISCBINS.
$(KBUILD_TARGET
).
$(KBUILD_TARGET_ARCH
)) $(MISCBINS.
$(KBUILD_TARGET_ARCH
)) $(MISCBINS.
$(KBUILD_TARGET_CPU
)) $(MISCBINS.
$(KBUILD_TYPE
))
54 _ALL_OTHERS
:= $(OTHERS
) $(OTHERS.
$(KBUILD_TARGET
)) $(OTHERS.
$(KBUILD_TARGET
).
$(KBUILD_TARGET_ARCH
)) $(OTHERS.
$(KBUILD_TARGET_ARCH
)) $(OTHERS.
$(KBUILD_TARGET_CPU
)) $(OTHERS.
$(KBUILD_TYPE
))
55 _ALL_INSTALLS
:= $(INSTALLS
) $(INSTALLS.
$(KBUILD_TARGET
)) $(INSTALLS.
$(KBUILD_TARGET
).
$(KBUILD_TARGET_ARCH
)) $(INSTALLS.
$(KBUILD_TARGET_ARCH
)) $(INSTALLS.
$(KBUILD_TARGET_CPU
)) $(INSTALLS.
$(KBUILD_TYPE
))
56 _ALL_FETCHES
:= $(FETCHES
) $(FETCHES.
$(KBUILD_TARGET
)) $(FETCHES.
$(KBUILD_TARGET
).
$(KBUILD_TARGET_ARCH
)) $(FETCHES.
$(KBUILD_TARGET_ARCH
)) $(FETCHES.
$(KBUILD_TARGET_CPU
)) $(FETCHES.
$(KBUILD_TYPE
))
57 _ALL_PATCHES
:= $(PATCHES
) $(PATCHES.
$(KBUILD_TARGET
)) $(PATCHES.
$(KBUILD_TARGET
).
$(KBUILD_TARGET_ARCH
)) $(PATCHES.
$(KBUILD_TARGET_ARCH
)) $(PATCHES.
$(KBUILD_TARGET_CPU
)) $(PATCHES.
$(KBUILD_TYPE
))
73 # all $(KBUILD_TARGET) targets.
74 _ALL_TARGET_TARGETS
= \
86 # all $(KBUILD_HOST) targets.
90 # all targets making use of srcname.
91 _ALL_SRCNAME_TARGETS
= \
95 # Dependency files. (currently not on target level, only this global stuff)
96 _DEPFILES
:= $(DEPFILES
) $(DEPFILES.
$(KBUILD_TARGET
)) $(DEPFILES.
$(KBUILD_TARGET
).
$(KBUILD_TARGET_ARCH
)) $(DEPFILES.
$(KBUILD_TARGET_ARCH
)) $(DEPFILES.
$(KBUILD_TARGET_CPU
)) $(DEPFILES.
$(KBUILD_TYPE
))
99 # All kind of output files except for _OBJS and _DEPFILES.
100 # Compiling or linking definition outputting other things that $@ and any
101 # required dependency file must add those output files to this variable.
104 # Files which only requires cleaning up.
125 _DEBUG_STAGE_FILES
:=
127 _DEBUG_INSTALL_FILES
:=
128 _DEBUG_INSTALL_DIRS
:=
131 _DIRS
:= $(PATH_TARGET
)/ $(PATH_TARGET
) $(BLDDIRS
)
134 # Implicit targets added while processing other targets (usually by units).
135 _ALL_INSTALLS_IMPLICIT
:=
146 ## Figure out the tool for a target.
147 # @param $1 normalized target.
148 # @param $2 tooltype.
149 # @param bld_trg build target.
150 # @param bld_trg_arch build target architecture.
151 # @param bld_type build target type.
153 _TARGET_TOOL
= $(strip $(firstword \
154 $($(1)_
$(2)TOOL.
$(bld_trg
).
$(bld_trg_arch
)) \
155 $($(1)_
$(2)TOOL.
$(bld_trg
)) \
157 $($(1)_TOOL.
$(bld_trg
).
$(bld_trg_arch
)) \
158 $($(1)_TOOL.
$(bld_trg
)) \
160 $($(2)TOOL.
$(bld_trg
).
$(bld_trg_arch
)) \
161 $($(2)TOOL.
$(bld_trg
)) \
163 $(TOOL.
$(bld_trg
).
$(bld_trg_arch
)) \
168 _TARGET_TOOL
= $(strip $(firstword \
169 $($(1)_
$(2)TOOL.
$(bld_trg
).
$(bld_trg_arch
).
$(bld_type
)) \
170 $($(1)_
$(2)TOOL.
$(bld_trg
).
$(bld_trg_arch
)) \
171 $($(1)_
$(2)TOOL.
$(bld_trg
).
$(bld_type
)) \
172 $($(1)_
$(2)TOOL.
$(bld_trg_arch
)) \
173 $($(1)_
$(2)TOOL.
$(bld_trg
)) \
174 $($(1)_
$(2)TOOL.
$(bld_type
)) \
176 $($(1)_TOOL.
$(bld_trg
).
$(bld_trg_arch
).
$(bld_type
)) \
177 $($(1)_TOOL.
$(bld_trg
).
$(bld_trg_arch
)) \
178 $($(1)_TOOL.
$(bld_trg
).
$(bld_type
)) \
179 $($(1)_TOOL.
$(bld_trg_arch
)) \
180 $($(1)_TOOL.
$(bld_trg
)) \
181 $($(1)_TOOL.
$(bld_type
)) \
183 $($(2)TOOL.
$(bld_trg
).
$(bld_trg_arch
).
$(bld_type
)) \
184 $($(2)TOOL.
$(bld_trg
).
$(bld_trg_arch
)) \
185 $($(2)TOOL.
$(bld_trg
).
$(bld_type
)) \
186 $($(2)TOOL.
$(bld_trg_arch
)) \
187 $($(2)TOOL.
$(bld_trg
)) \
188 $($(2)TOOL.
$(bld_type
)) \
190 $(TOOL.
$(bld_trg
).
$(bld_trg_arch
).
$(bld_type
)) \
191 $(TOOL.
$(bld_trg
).
$(bld_trg_arch
)) \
192 $(TOOL.
$(bld_trg
).
$(bld_type
)) \
193 $(TOOL.
$(bld_trg_arch
)) \
195 $(TOOL.
$(bld_type
)) \
200 ## Figure out the actual name of an installed file.
201 # @param $1 The file to install.
202 # @param $2 The target name.
203 # @param $3 The _INST value (can be empty).
204 # @param $4 The installation root directory.
205 _INSTALL_FILE
= $(patsubst %/,%/$(notdir $(1)),$(if
$(3),$(4)/$(3),$(4)/))
209 # Function for getting the first defined propert value.
211 # @param 1 The property name.
212 # @param 2 The default property name, empty if none.
213 # @param 3 What to return if all variables are empty. (optional)
214 # @note Implicit parameters: target, bld_trg, bld_trg_arch, bld_trg_cpu, bld_type.
215 # @returns Expanded property value.
217 define def_fn_prop_get_first_defined
218 local .RETURN
:= $(firstdefined \
219 $(target
)_
$(1).
$(bld_trg
).
$(bld_trg_arch
).
$(bld_type
) \
220 $(target
)_
$(1).
$(bld_trg
).
$(bld_trg_arch
) \
221 $(target
)_
$(1).
$(bld_trg
).
$(bld_type
) \
222 $(target
)_
$(1).
$(bld_trg_cpu
) \
223 $(target
)_
$(1).
$(bld_trg_arch
) \
224 $(target
)_
$(1).
$(bld_trg
) \
225 $(target
)_
$(1).
$(bld_type
) \
230 local .RETURN
:= $(firstdefined \
231 $(2).
$(bld_trg
).
$(bld_trg_arch
).
$(bld_type
) \
232 $(2).
$(bld_trg
).
$(bld_trg_arch
) \
233 $(2).
$(bld_trg
).
$(bld_type
) \
234 $(2).
$(bld_trg_cpu
) \
235 $(2).
$(bld_trg_arch
) \
242 local .RETURN
:= $(firstdefined \
243 kBuildGlobalDefaults_
$(1).
$(bld_trg
).
$(bld_trg_arch
).
$(bld_type
) \
244 kBuildGlobalDefaults_
$(1).
$(bld_trg
).
$(bld_trg_arch
) \
245 kBuildGlobalDefaults_
$(1).
$(bld_trg
).
$(bld_type
) \
246 kBuildGlobalDefaults_
$(1).
$(bld_trg_cpu
) \
247 kBuildGlobalDefaults_
$(1).
$(bld_trg_arch
) \
248 kBuildGlobalDefaults_
$(1).
$(bld_trg
) \
249 kBuildGlobalDefaults_
$(1).
$(bld_type
) \
250 kBuildGlobalDefaults_
$(1) \
255 local .RETURN
:= $(strip $($(.RETURN
)))
256 endef # def_fn_prop_get_first_defined
259 # Function for getting the first property value (ignoring empty defines).
261 # @param 1 The property name.
262 # @param 2 The default property name, empty if none.
263 # @param 3 What to return if all variables are empty. (optional)
264 # @note Implicit parameters: target, bld_trg, bld_trg_arch, bld_trg_cpu, bld_type.
265 # @returns First word.
267 define def_fn_prop_get_first_word
268 local .RETURN
:= $(firstword \
269 $($(target
)_
$(1).
$(bld_trg
).
$(bld_trg_arch
).
$(bld_type
)) \
270 $($(target
)_
$(1).
$(bld_trg
).
$(bld_trg_arch
)) \
271 $($(target
)_
$(1).
$(bld_trg
).
$(bld_type
)) \
272 $($(target
)_
$(1).
$(bld_trg_cpu
)) \
273 $($(target
)_
$(1).
$(bld_trg_arch
)) \
274 $($(target
)_
$(1).
$(bld_trg
)) \
275 $($(target
)_
$(1).
$(bld_type
)) \
280 local .RETURN
:= $(firstword \
281 $($(2).
$(bld_trg
).
$(bld_trg_arch
).
$(bld_type
)) \
282 $($(2).
$(bld_trg
).
$(bld_trg_arch
)) \
283 $($(2).
$(bld_trg
).
$(bld_type
)) \
284 $($(2).
$(bld_trg_cpu
)) \
285 $($(2).
$(bld_trg_arch
)) \
287 $($(2).
$(bld_type
)) \
292 local .RETURN
:= $(firstword \
293 $(kBuildGlobalDefaults_
$(1).
$(bld_trg
).
$(bld_trg_arch
).
$(bld_type
)) \
294 $(kBuildGlobalDefaults_
$(1).
$(bld_trg
).
$(bld_trg_arch
)) \
295 $(kBuildGlobalDefaults_
$(1).
$(bld_trg
).
$(bld_type
)) \
296 $(kBuildGlobalDefaults_
$(1).
$(bld_trg_cpu
)) \
297 $(kBuildGlobalDefaults_
$(1).
$(bld_trg_arch
)) \
298 $(kBuildGlobalDefaults_
$(1).
$(bld_trg
)) \
299 $(kBuildGlobalDefaults_
$(1).
$(bld_type
)) \
300 $(kBuildGlobalDefaults_
$(1)) \
305 endef # def_fn_prop_get_first_word
309 # Function for collecting properties, priority ones last.
311 # @param 1 The property name.
312 # @param 2 The default property name, empty if none.
313 # @note Implicit parameters: target, bld_trg, bld_trg_arch, bld_trg_cpu, bld_type.
314 # @returns All properties.
316 define def_fn_prop_get_all_priority_last
319 $($(target
)_
$(1).
$(bld_type
)) \
320 $($(target
)_
$(1).
$(bld_trg
)) \
321 $($(target
)_
$(1).
$(bld_trg_arch
)) \
322 $($(target
)_
$(1).
$(bld_trg_cpu
)) \
323 $($(target
)_
$(1).
$(bld_trg
).
$(bld_type
)) \
324 $($(target
)_
$(1).
$(bld_trg
).
$(bld_trg_arch
)) \
325 $($(target
)_
$(1).
$(bld_trg
).
$(bld_trg_arch
).
$(bld_type
))
326 endef # def_fn_prop_get_all_priority_last
330 # Function for collecting properties with prefixing, priority ones last.
332 # @param 1 The property name.
333 # @param 2 Something like $(NLTAB).
334 # @note Implicit parameters: target, bld_trg, bld_trg_arch, bld_trg_cpu, bld_type.
335 # @returns All properties.
337 define def_fn_prop_get_all_prefixed_priority_last
339 $(if
$($(target
)_
$(1)),$(2),)$($(target
)_
$(1)) \
340 $(if
$($(target
)_
$(1).
$(bld_type
)),$(2),)$($(target
)_
$(1).
$(bld_type
)) \
341 $(if
$($(target
)_
$(1).
$(bld_trg
)),$(2),)$($(target
)_
$(1).
$(bld_trg
)) \
342 $(if
$($(target
)_
$(1).
$(bld_trg_arch
)),$(2),)$($(target
)_
$(1).
$(bld_trg_arch
)) \
343 $(if
$($(target
)_
$(1).
$(bld_trg_cpu
)),$(2),)$($(target
)_
$(1).
$(bld_trg_cpu
)) \
344 $(if
$($(target
)_
$(1).
$(bld_trg
).
$(bld_type
)),$(2),)$($(target
)_
$(1).
$(bld_trg
).
$(bld_type
)) \
345 $(if
$($(target
)_
$(1).
$(bld_trg
).
$(bld_trg_arch
)),$(2),)$($(target
)_
$(1).
$(bld_trg
).
$(bld_trg_arch
)) \
346 $(if
$($(target
)_
$(1).
$(bld_trg
).
$(bld_trg_arch
).
$(bld_type
)),$(2),)$($(target
)_
$(1).
$(bld_trg
).
$(bld_trg_arch
).
$(bld_type
))
347 endef # def_fn_prop_get_all_prefixed_priority_last
353 include $(KBUILD_PATH
)/footer-inherit-uses-tools.kmk
354 include $(KBUILD_PATH
)/footer-pass1.kmk
355 include $(KBUILD_PATH
)/footer-pass2-fetches.kmk
356 include $(KBUILD_PATH
)/footer-pass2-patches.kmk
357 include $(KBUILD_PATH
)/footer-pass2-compiling-targets.kmk
358 include $(KBUILD_PATH
)/footer-pass2-installs.kmk
359 include $(KBUILD_PATH
)/footer-misc.kmk
360 include $(KBUILD_PATH
)/footer-passes.kmk
366 all_recursive
: $(pass_prev
)
369 + $(MAKE
) -f
$(firstword $(MAKEFILE_LIST
)) all_recursive
371 # @todo make this a non-default pass!
373 $(RM
) -f
-- $(_INSTALLS_FILES
)
375 install:: pass_installs
377 # misc shortcuts (use secondary expansion here to save strcache[file] space).
378 targets
: bldprogs libraries dlls programs sysmods miscbins others installs
380 bldprogs
: $$(_BLDPROGS
)
381 libraries
: $$(_LIBS
) $$(_IMPORT_LIBS
) $$(_OTHER_LIBRARIES
)
383 programs
: $$(_PROGRAMS
)
384 sysmods
: $$(_SYSMODS
)
385 miscbins
: $$(_MISCBINS
)
387 stagings
: $$(_INSTALLS
) $$(_STAGE_DIRS
) $$(_STAGE_FILES
)
388 installs
: $$(_INSTALLS_DIRS
) $$(_INSTALLS_FILES
)
390 install-debug
: $$(_DEBUG_INSTALL_DIRS
) $$(_DEBUG_INSTALL_FILES
)
395 # kBuild debugging stuff.
397 ## @todo this doesn't work. Move to a debug unit and expand it.
399 @
$(foreach target
, $(_ALL_TARGETS
),\
400 @
$(ECHO
) "target: $(target)" $(NLTAB
)\
401 @
$(ECHO
) " $(target)_0_OUTDIR=$($(target)_0_OUTDIR)" $(NLTAB
)\
402 @
$(ECHO
) " $(target)_1_TARGET=$($(target)_1_TARGET)" $(NLTAB
)\
403 @
$(ECHO
) " INSTARGET_$(target)=$(INSTARGET_$(target))" $(NLTAB
)\
404 $(foreach prop
,$(PROPS_SINGLE
) $(PROPS_ACCUMULATE_L
) $(PROPS_ACCUMULATE_R
) 2_OBJS CLEAN
, \
405 $(eval _tmp
:=$(firstword $($(target
)_BLD_TRG
) $(KBUILD_TARGET
))) \
406 $(if
$($(target
)_
$(prop
).
$(_tmp
)),\
407 @
$(ECHO
) " $(target)_$(prop).$(_tmp)=$($(target)_$(prop).$(_tmp))" $(NLTAB
)) \
408 $(if
$($(target
)_
$(prop
)), $(NLTAB
)@
$(ECHO
) " $(target)_$(prop)=$($(target)_$(prop))" $(NLTAB
)) \
410 $(foreach prop
,$(PROPS_DEFERRED
), \
411 $(eval _tmp
:=$(firstword $($(target
)_BLD_TRG
) $(KBUILD_TARGET
))) \
412 $(if
$(value
$(target
)_
$(prop
).
$(_tmp
)),\
413 @
$(ECHO
) ' $(target)_$(prop).$(_tmp)=$(value $(TARGET)_$(prop).$(_tmp))' $(NLTAB
)) \
414 $(if
$(value
$(target
)_
$(prop
)), $(NLTAB
)@
$(ECHO
) ' $(target)_$(prop)=$(value $(target)_$(prop))' $(NLTAB
)) \
420 # Include dependency files.
423 # TODO: first works the second doesn't, provided _KB_INCLUDE_DEPS is undefined:
424 # if "$(_KB_INCLUDE_DEPS)" == "1"
425 # if $(_KB_INCLUDE_DEPS) == "1"
427 ifdef KB_HAVE_INCLUDEDEP_QUEUE
428 includedep-queue
$(_DEPFILES
)
430 $(foreach dep
, $(_DEPFILES
), $(eval includedep
$(dep
)))
435 ifdef KBUILD_PROFILE_SELF
436 $(evalcall def_profile_self
, end of footer.kmk
)
437 _KBUILD_TS_FOOTER_END
:= $(_KBUILD_TS_PREV
)
439 ifneq ($(KBUILD_PROFILE_SELF
),0)
440 $(info prof
: ALL
=$(words $(_ALL_TARGETS
)) BLDPROGS
=$(words $(_ALL_BLDPROGS
)) LIBRARIES
=$(words $(_ALL_LIBRARIES
)) IMPORT_LIBS
=$(words $(IMPORT_LIBS
)) DLLS
=$(words $(DLLS
)) PROGRAMS
=$(words $(_ALL_PROGRAMS
)) )
441 $(info prof
: SYSMODS
=$(words $(_ALL_SYSMODS
)) MISCBINS
=$(words $(_ALL_MISCBINS
)) OTHERS
=$(words $(_ALL_OTHERS
)) INSTALLS
=$(words $(_ALL_INSTALLS
)) FETCHES
=$(words $(_ALL_FETCHES
)) PACKING
=$(words $(_PACKING
)) TESTING
=$(words $(TESTING
)) )
442 $(info prof
: DIRS
=$(words $(_DIR_ALL
)) TOOLS
=$(words $(_TOOLS
)) SDKS
=$(words $(_SDKS
)) USES
=$(words $(_USES
)) OUT_FILES
=$(words $(_OUT_FILES
)) OBJS
=$(words $(_OBJS
)) CLEAN_FILES
=$(words $(CLEAN_FILES
) $(OTHER_CLEAN
)) )
443 $(info prof
: DEPFILES_INCLUDED
=$(words $(_DEPFILES_INCLUDED
)) DEPFILES
=$(words $(_DEPFILES
)) MAKEFILES
=$(words $(MAKEFILE_LIST
)) )
448 # end-of-file-content
449 __footer_kmk__
:= target
450 endif # !defined(__footer_kmk__)