Changeset 2521 for trunk/kBuild/footer-pass2-compiling-targets.kmk
- Timestamp:
- Jul 26, 2011, 8:18:19 PM (14 years ago)
- File:
-
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk/kBuild/footer-pass2-compiling-targets.kmk
r2520 r2521 1 1 # $Id$ 2 2 ## @file 3 # kBuild - F ile included at top of makefile.4 # 5 6 # 7 # Copyright (c) 2004-201 0knut st. osmundsen <bird-kBuild-spamx@anduin.net>3 # kBuild - Footer - Target lists - Pass 2 - Compiling Targets. 4 # 5 6 # 7 # Copyright (c) 2004-2011 knut st. osmundsen <bird-kBuild-spamx@anduin.net> 8 8 # 9 9 # This file is part of kBuild. … … 30 30 # program, whatever should not be covered the GPL. 31 31 # 32 #33 34 ifndef __footer_kmk__35 # start-of-file-content36 ifdef KBUILD_PROFILE_SELF37 $(evalcall def_profile_self, start of footer.kmk)38 _KBUILD_TS_FOOTER_START := $(_KBUILD_TS_PREV)39 endif40 41 #42 # Variables.43 # (Some of these need initialization before including definitions using them.)44 #45 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))58 59 # all targets.60 _ALL_TARGETS = \61 $(_ALL_FETCHES) \62 $(_ALL_PATCHES) \63 $(_ALL_BLDPROGS) \64 $(_ALL_LIBRARIES) \65 $(_ALL_IMPORT_LIBS) \66 $(_ALL_DLLS) \67 $(_ALL_PROGRAMS) \68 $(_ALL_SYSMODS) \69 $(_ALL_MISCBINS) \70 $(_ALL_INSTALLS) \71 $(_ALL_OTHERS)72 73 # all $(KBUILD_TARGET) targets.74 _ALL_TARGET_TARGETS = \75 $(_ALL_FETCHES) \76 $(_ALL_PATCHES) \77 $(_ALL_LIBRARIES) \78 $(_ALL_IMPORT_LIBS) \79 $(_ALL_DLLS) \80 $(_ALL_PROGRAMS) \81 $(_ALL_SYSMODS) \82 $(_ALL_MISCBINS) \83 $(_ALL_INSTALLS) \84 $(_ALL_OTHERS)85 86 # all $(KBUILD_HOST) targets.87 _ALL_HOST_TARGETS = \88 $(_ALL_BLDPROGS)89 90 # all targets making use of srcname.91 _ALL_SRCNAME_TARGETS = \92 $(_ALL_FETCHES) \93 $(_ALL_PATCHES)94 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))97 98 # included dependency files.99 _DEPFILES_INCLUDED :=100 101 102 # All kind of output files except for _OBJS and _DEPFILES.103 # Compiling or linking definition outputting other things that $@ and any104 # required dependency file must add those output files to this variable.105 _OUT_FILES :=106 107 # Files which only requires cleaning up.108 _CLEAN_FILES :=109 110 # all of a type111 _OBJS :=112 _FETCHES :=113 _DOWNLOADS:=114 _UNPACKS :=115 _PATCHES :=116 _UNFETCHES:=117 _BLDPROGS :=118 _LIBS :=119 _DLLS :=120 _PROGRAMS :=121 _SYSMODS :=122 _MISCBINS :=123 _STAGE_FILES :=124 _STAGE_DIRS :=125 _INSTALLS :=126 _INSTALLS_FILES :=127 _INSTALLS_DIRS :=128 _OTHERS :=129 _PACKING :=130 _DIRS := $(PATH_TARGET)/ $(PATH_TARGET) $(BLDDIRS)131 _IMPORT_LIBS :=132 133 # Implicit targets added while processing other targets (usually by units).134 _ALL_INSTALLS_IMPLICIT :=135 136 # misc137 pass_prev :=138 139 140 141 #142 # Footer macros143 #144 145 ## Figure out the tool for a target.146 # @param $1 normalized target.147 # @param $2 tooltype.148 # @param bld_trg build target.149 # @param bld_trg_arch build target architecture.150 # @param bld_type build target type.151 if 0152 _TARGET_TOOL = $(strip $(firstword \153 $($(1)_$(2)TOOL.$(bld_trg).$(bld_trg_arch)) \154 $($(1)_$(2)TOOL.$(bld_trg)) \155 $($(1)_$(2)TOOL) \156 $($(1)_TOOL.$(bld_trg).$(bld_trg_arch)) \157 $($(1)_TOOL.$(bld_trg)) \158 $($(1)_TOOL) \159 $($(2)TOOL.$(bld_trg).$(bld_trg_arch)) \160 $($(2)TOOL.$(bld_trg)) \161 $($(2)TOOL) \162 $(TOOL.$(bld_trg).$(bld_trg_arch)) \163 $(TOOL.$(bld_trg)) \164 $(TOOL) \165 ))166 else167 _TARGET_TOOL = $(strip $(firstword \168 $($(1)_$(2)TOOL.$(bld_trg).$(bld_trg_arch).$(bld_type)) \169 $($(1)_$(2)TOOL.$(bld_trg).$(bld_trg_arch)) \170 $($(1)_$(2)TOOL.$(bld_trg).$(bld_type)) \171 $($(1)_$(2)TOOL.$(bld_trg_arch)) \172 $($(1)_$(2)TOOL.$(bld_trg)) \173 $($(1)_$(2)TOOL.$(bld_type)) \174 $($(1)_$(2)TOOL) \175 $($(1)_TOOL.$(bld_trg).$(bld_trg_arch).$(bld_type)) \176 $($(1)_TOOL.$(bld_trg).$(bld_trg_arch)) \177 $($(1)_TOOL.$(bld_trg).$(bld_type)) \178 $($(1)_TOOL.$(bld_trg_arch)) \179 $($(1)_TOOL.$(bld_trg)) \180 $($(1)_TOOL.$(bld_type)) \181 $($(1)_TOOL) \182 $($(2)TOOL.$(bld_trg).$(bld_trg_arch).$(bld_type)) \183 $($(2)TOOL.$(bld_trg).$(bld_trg_arch)) \184 $($(2)TOOL.$(bld_trg).$(bld_type)) \185 $($(2)TOOL.$(bld_trg_arch)) \186 $($(2)TOOL.$(bld_trg)) \187 $($(2)TOOL.$(bld_type)) \188 $($(2)TOOL) \189 $(TOOL.$(bld_trg).$(bld_trg_arch).$(bld_type)) \190 $(TOOL.$(bld_trg).$(bld_trg_arch)) \191 $(TOOL.$(bld_trg).$(bld_type)) \192 $(TOOL.$(bld_trg_arch)) \193 $(TOOL.$(bld_trg)) \194 $(TOOL.$(bld_type)) \195 $(TOOL) \196 ))197 endif198 199 ## Figure out the actual name of an installed file.200 # @param $1 The file to install.201 # @param $2 The target name.202 # @param $3 The _INST value (can be empty).203 # @param $4 The installation root directory.204 _INSTALL_FILE = $(patsubst %/,%/$(notdir $(1)),$(if $(3),$(4)/$(3),$(4)/))205 206 207 208 ## Converts a variable from simple to recursive flavor.209 # This is used by def_inherit_template_one_accumulate_l and def_inherit_template_one_accumulate_r.210 # @param $1 The variable name.211 define def_simple_2_recursive212 $1_DEFERRED := $$($1)213 $1 = $$($1_DEFERRED)214 endef215 216 217 ## Inherit one keyword in a non-accumulative manner.218 # @param $(trg) Target object.219 # @param $(prop) The property.220 # @param $(src_key) Source keyword.221 # @param $(trg_key) Target keyword.222 define def_inherit_one_keyword223 ifdef $(trg)_$(prop).$(src_key)224 ifndef $(trg)_$(prop).$(trg_key)225 $(trg)_$(prop).$(trg_key) = $($(trg)_$(prop).$(src_key))226 endif227 endif228 endef229 230 231 # EXPAND_BY = overriding232 233 ## Inherit one keyword in a non-accumulative manner.234 # @param $(trg) Target object.235 # @param $(prop) The property.236 # @param $(src_key) Source keyword.237 # @param $(trg_key) Target keyword.238 define def_inherit_one_keyword_overriding_now_l239 ifdef $(trg)_$(prop).$(src_key)240 ifndef $(trg)_$(prop).$(trg_key)241 $(trg)_$(prop).$(trg_key) := $($(trg)_$(prop).$(src_key))242 endif243 endif244 endef245 246 ## @copydoc def_inherit_one_overriding_now_l247 define def_inherit_one_keyword_overriding_now_r248 ifdef $(trg)_$(prop).$(src_key)249 ifndef $(trg)_$(prop).$(trg_key)250 $(trg)_$(prop).$(trg_key) := $($(trg)_$(prop).$(src_key))251 endif252 endif253 endef254 255 ## Inherit one keyword in a non-accumulative manner, deferred expansion.256 # @param $(trg) Target object.257 # @param $(prop) The property.258 # @param $(src_key) Source keyword.259 # @param $(trg_key) Target keyword.260 # @remark This define relies on double evaluation261 define def_inherit_one_keyword_overriding_deferred262 ifdef $(trg)_$(prop).$(src_key)263 ifndef $(trg)_$(prop).$(trg_key)264 $(trg)_$(prop).$(trg_key) = $$($(trg)_$(prop).$(src_key))265 endif266 endif267 endef268 269 ## @copydoc def_inherit_one_overriding_deferred270 define def_inherit_one_keyword_overriding_deferred_l271 ifdef $(trg)_$(prop).$(src_key)272 ifndef $(trg)_$(prop).$(trg_key)273 $(trg)_$(prop).$(trg_key) = $$($(trg)_$(prop).$(src_key))274 endif275 endif276 endef277 278 ## @copydoc def_inherit_one_overriding_deferred279 define def_inherit_one_keyword_overriding_deferred_r280 ifdef $(trg)_$(prop).$(src_key)281 ifndef $(trg)_$(prop).$(trg_key)282 $(trg)_$(prop).$(trg_key) = $$($(trg)_$(prop).$(src_key))283 endif284 endif285 endef286 287 288 # EXPAND_BY = prepending289 290 ## Inherit one keyword in a prepending manner.291 # @param $(trg) Target object.292 # @param $(prop) The property.293 # @param $(src_key) Source keyword.294 # @param $(trg_key) Target keyword.295 define def_inherit_one_keyword_prepending_now_l296 ifdef $(trg)_$(prop).$(src_key)297 $(trg)_$(prop).$(trg_key) := $($(trg)_$(prop).$(src_key)) $($(trg)_$(prop).$(trg_key))298 endif299 endef300 301 ## @copydoc def_inherit_one_prepending_now_l302 define def_inherit_one_keyword_prepending_now_r303 ifdef $(trg)_$(prop).$(src_key)304 $(trg)_$(prop).$(trg_key) := $($(trg)_$(prop).$(trg_key)) $($(trg)_$(prop).$(src_key))305 endif306 endef307 308 ## Inherit one keyword in a non-accumulative manner, deferred expansion.309 # @param $(trg) Target object.310 # @param $(prop) The property.311 # @param $(src_key) Source keyword.312 # @param $(trg_key) Target keyword.313 # @remark This define relies on double evaluation314 define def_inherit_one_keyword_prepending_deferred315 ifdef $(trg)_$(prop).$(src_key)316 ifndef $(trg)_$(prop).$(trg_key)317 $(trg)_$(prop).$(trg_key) = $$($(trg)_$(prop).$(src_key))318 endif319 endif320 endef321 322 ## Inherit one keyword in a prepending manner, deferred expansion.323 # @param $(trg) Target object.324 # @param $(prop) The property.325 # @param $(src_key) Source keyword.326 # @param $(trg_key) Target keyword.327 define def_inherit_one_keyword_prepending_deferred_l328 ifdef $(trg)_$(prop).$(src_key)329 ifeq ($$(flavor $(trg)_$(prop).$(trg_key)),simple)330 $$(evalcall2 def_simple_2_recursive,$(trg)_$(prop).$(trg_key))331 endif332 $(trg)_$(prop).$(trg_key) <= $$($(trg)_$(prop).$(src_key))333 endif334 endef335 336 ## @copydoc def_inherit_one_prepending_deferred_l337 define def_inherit_one_keyword_prepending_deferred_r338 ifdef $(trg)_$(prop).$(src_key)339 ifeq ($$(flavor $(trg)_$(prop).$(trg_key)),simple)340 $$(evalcall2 def_simple_2_recursive,$(trg)_$(prop).$(trg_key))341 endif342 $(trg)_$(prop).$(trg_key) += $$($(trg)_$(prop).$(src_key))343 endif344 endef345 346 347 # EXPAND_BY = appending348 349 ## Inherit one keyword in an appending manner.350 # @param $(trg) Target object.351 # @param $(prop) The property.352 # @param $(src_key) Source keyword.353 # @param $(trg_key) Target keyword.354 define def_inherit_one_keyword_appending_now_l355 ifdef $(trg)_$(prop).$(src_key)356 $(trg)_$(prop).$(trg_key) := $($(trg)_$(prop).$(trg_key)) $($(trg)_$(prop).$(src_key))357 endif358 endef359 360 ## @copydoc def_inherit_one_appending_now_l361 define def_inherit_one_keyword_appending_now_r362 ifdef $(trg)_$(prop).$(src_key)363 $(trg)_$(prop).$(trg_key) := $($(trg)_$(prop).$(src_key)) $($(trg)_$(prop).$(trg_key))364 endif365 endef366 367 ## Inherit one keyword in a non-accumulative manner, deferred expansion.368 # @param $(trg) Target object.369 # @param $(prop) The property.370 # @param $(src_key) Source keyword.371 # @param $(trg_key) Target keyword.372 # @remark This define relies on double evaluation373 define def_inherit_one_keyword_appending_deferred374 ifdef $(trg)_$(prop).$(src_key)375 ifndef $(trg)_$(prop).$(trg_key)376 $(trg)_$(prop).$(trg_key) = $$($(trg)_$(prop).$(src_key))377 endif378 endif379 endef380 381 ## Inherit one keyword in an appending manner, deferred expansion.382 # @param $(trg) Target object.383 # @param $(prop) The property.384 # @param $(src_key) Source keyword.385 # @param $(trg_key) Target keyword.386 define def_inherit_one_keyword_appending_deferred_l387 ifdef $(trg)_$(prop).$(src_key)388 ifeq ($$(flavor $(trg)_$(prop).$(trg_key)),simple)389 $$(evalcall2 def_simple_2_recursive,$(trg)_$(prop).$(trg_key))390 endif391 $(trg)_$(prop).$(trg_key) += $$($(trg)_$(prop).$(src_key))392 endif393 endef394 395 ## @copydoc def_inherit_one_appending_deferred_l396 define def_inherit_one_keyword_appending_deferred_r397 ifdef $(trg)_$(prop).$(src_key)398 ifeq ($$(flavor $(trg)_$(prop).$(trg_key)),simple)399 $$(evalcall2 def_simple_2_recursive,$(trg)_$(prop).$(trg_key))400 endif401 $(trg)_$(prop).$(trg_key) <= $$($(trg)_$(prop).$(src_key))402 endif403 endef404 405 406 ## Worker for def_inherit that deals with one keyword that makes407 # use of inheritance.408 # @param prefix_keyword key_prefix:keyword. The cool join/split game as usual.409 # @param trg Object to consider for inheriting.410 # @param properties List of the properties with straight expansion.411 # @param properties_now_l List of the properties with immediate expansion, accumulating on the left side.412 # @param properties_now_r List of the properties with immediate expansion, accumulating on the right side.413 # @param properties_deferred List of the properties with deferred expansion (e.g. function), non-accumulative .414 # @param properties_deferred_l List of the properties with deferred expansion (e.g. function), accumulating on the left side.415 # @param properties_deferred_r List of the properties with deferred expansion (e.g. function), accumulating on the right side.416 define def_inherit_keyword417 local prefix := $(word 1,$(subst :, ,$(prefix_keyword)))418 local trg_key := $(word 2,$(subst :, ,$(prefix_keyword)))419 local src_key := $($(prefix)_$(trg_key)_EXTENDS)420 local by := $($(prefix)_$(trg_key)_EXTENDS_BY)421 422 # Inherit the properties.423 $(foreach prop, $(properties), $(eval $(def_inherit_one_keyword)))424 $(foreach prop, $(properties_now_l), $(eval $(def_inherit_one_keyword_$(by)_now_l)))425 $(foreach prop, $(properties_now_r), $(eval $(def_inherit_one_keyword_$(by)_now_r)))426 $(foreach prop, $(properties_deferred), $(eval $(def_inherit_one_keyword_$(by)_deferred)))427 $(foreach prop, $(properties_deferred_l), $(eval $(def_inherit_one_keyword_$(by)_deferred_l)))428 $(foreach prop, $(properties_deferred_r), $(eval $(def_inherit_one_keyword_$(by)_deferred_r)))429 430 endef # def_inherit_keyword431 432 433 ## Inherit one template property in a non-accumulative manner.434 # @param $(prop) Property name435 # @param $(src) Source (parent) object.436 # @param $(trg) Target (child) object.437 define def_inherit_one438 ifdef $(src)_$(prop)439 ifndef $(trg)_$(prop)440 $(trg)_$(prop) = $($(src)_$(prop))441 endif442 endif443 endef444 445 446 # EXPAND_BY = overriding447 448 ## Inherit one template property in a non-accumulative manner.449 # @param $(prop) Property name450 # @param $(src) Source (parent) object.451 # @param $(trg) Target (child) object.452 define def_inherit_one_overriding_now_l453 ifdef $(src)_$(prop)454 ifndef $(trg)_$(prop)455 $(trg)_$(prop) := $($(src)_$(prop))456 endif457 endif458 endef459 460 ## @copydoc def_inherit_one_overriding_now_l461 define def_inherit_one_overriding_now_r462 ifdef $(src)_$(prop)463 ifndef $(trg)_$(prop)464 $(trg)_$(prop) := $($(src)_$(prop))465 endif466 endif467 endef468 469 ## Inherit one template property in a non-accumulative manner, deferred expansion.470 # @param $(prop) Property name471 # @param $(src) Source472 # @param $(trg) Target473 # @remark This define relies on double evaluation474 define def_inherit_one_overriding_deferred475 ifdef $(src)_$(prop)476 ifndef $(trg)_$(prop)477 $(trg)_$(prop) = $$($(src)_$(prop))478 endif479 endif480 endef481 482 ## @copydoc def_inherit_one_overriding_deferred483 define def_inherit_one_overriding_deferred_l484 ifdef $(src)_$(prop)485 ifndef $(trg)_$(prop)486 $(trg)_$(prop) = $$($(src)_$(prop))487 endif488 endif489 endef490 491 ## @copydoc def_inherit_one_overriding_deferred492 define def_inherit_one_overriding_deferred_r493 ifdef $(src)_$(prop)494 ifndef $(trg)_$(prop)495 $(trg)_$(prop) = $$($(src)_$(prop))496 endif497 endif498 endef499 500 501 # EXPAND_BY = prepending502 503 ## Inherit one template property in a prepending manner.504 # @param $(prop) Property name505 # @param $(src) Source (parent) object.506 # @param $(trg) Target (child) object.507 define def_inherit_one_prepending_now_l508 ifdef $(src)_$(prop)509 $(trg)_$(prop) := $($(src)_$(prop)) $($(trg)_$(prop))510 endif511 endef512 513 ## @copydoc def_inherit_one_prepending_now_l514 define def_inherit_one_prepending_now_r515 ifdef $(src)_$(prop)516 $(trg)_$(prop) := $($(trg)_$(prop)) $($(src)_$(prop))517 endif518 endef519 520 ## Inherit one template property in a non-accumulative manner, deferred expansion.521 # @param $(prop) Property name522 # @param $(src) Source523 # @param $(trg) Target524 # @remark This define relies on double evaluation525 define def_inherit_one_prepending_deferred526 ifdef $(src)_$(prop)527 ifndef $(trg)_$(prop)528 $(trg)_$(prop) = $$($(src)_$(prop))529 endif530 endif531 endef532 533 ## Inherit one template property in a prepending manner, deferred expansion.534 # @param $(prop) Property name535 # @param $(src) Source (parent) object.536 # @param $(trg) Target (child) object.537 define def_inherit_one_prepending_deferred_l538 ifdef $(src)_$(prop)539 ifeq ($$(flavor $(trg)_$(prop)),simple)540 $$(evalcall2 def_simple_2_recursive,$(trg)_$(prop))541 endif542 $(trg)_$(prop) <= $$($(src)_$(prop))543 endif544 endef545 546 ## @copydoc def_inherit_one_prepending_deferred_l547 define def_inherit_one_prepending_deferred_r548 ifdef $(src)_$(prop)549 ifeq ($$(flavor $(trg)_$(prop)),simple)550 $$(evalcall2 def_simple_2_recursive,$(trg)_$(prop))551 endif552 $(trg)_$(prop) += $$($(src)_$(prop))553 endif554 endef555 556 557 # EXPAND_BY = appending558 559 ## Inherit one template property in an appending manner.560 # @param $(prop) Property name561 # @param $(src) Source (parent) object.562 # @param $(trg) Target (child) object.563 define def_inherit_one_appending_now_l564 ifdef $(src)_$(prop)565 $(trg)_$(prop) := $($(trg)_$(prop)) $($(src)_$(prop))566 endif567 endef568 569 ## @copydoc def_inherit_one_appending_now_l570 define def_inherit_one_appending_now_r571 ifdef $(src)_$(prop)572 $(trg)_$(prop) := $($(src)_$(prop)) $($(trg)_$(prop))573 endif574 endef575 576 ## Inherit one template property in a non-accumulative manner, deferred expansion.577 # @param $(prop) Property name578 # @param $(src) Source579 # @param $(trg) Target580 # @remark This define relies on double evaluation581 define def_inherit_one_appending_deferred582 ifdef $(src)_$(prop)583 ifndef $(trg)_$(prop)584 $(trg)_$(prop) = $$($(src)_$(prop))585 endif586 endif587 endef588 589 ## Inherit one template property in an appending manner, deferred expansion.590 # @param $(prop) Property name591 # @param $(src) Source (parent) object.592 # @param $(trg) Target (child) object.593 define def_inherit_one_appending_deferred_l594 ifdef $(src)_$(prop)595 ifeq ($$(flavor $(trg)_$(prop)),simple)596 $$(evalcall2 def_simple_2_recursive,$(trg)_$(prop))597 endif598 $(trg)_$(prop) += $$($(src)_$(prop))599 endif600 endef601 602 ## @copydoc def_inherit_one_appending_deferred_l603 define def_inherit_one_appending_deferred_r604 ifdef $(src)_$(prop)605 ifeq ($$(flavor $(trg)_$(prop)),simple)606 $$(evalcall2 def_simple_2_recursive,$(trg)_$(prop))607 endif608 $(trg)_$(prop) <= $$($(src)_$(prop))609 endif610 endef611 612 613 ## combines the specified properties $(1) with the $(_KEYWORDS) list.614 _INHERIT_JOIN_KEYWORDS = $(1) $(foreach keyword,$(_KEYWORDS), $(addsuffix .$(keyword), $(1)))615 616 617 ## Generic inheritance for use with targets templates and tools.618 # @param trg Object to consider for inheriting.619 # @param src_prefix What to prefix the value found in EXTENDS with to get the object.620 # @param load_function Load function for stuff that needs621 # @param properties List of the properties with straight expansion.622 # @param properties_now_l List of the properties with immediate expansion, accumulating on the left side.623 # @param properties_now_r List of the properties with immediate expansion, accumulating on the right side.624 # @param properties_deferred List of the properties with deferred expansion (e.g. function), non-accumulative .625 # @param properties_deferred_l List of the properties with deferred expansion (e.g. function), accumulating on the left side.626 # @param properties_deferred_r List of the properties with deferred expansion (e.g. function), accumulating on the right side.627 define def_inherit628 629 # Load it - loading is a mess, fix.630 ifneq ($(load_function),)631 local loading := $(patsubst $(src_prefix)%,%,$(trg))632 $(evalvalctx $(load_function))633 endif634 635 local src := $(strip $($(trg)_EXTENDS))636 ifneq ($(src),)637 ifndef $(trg)_EXTENDS_STATUS_638 $(trg)_EXTENDS_STATUS_ := 0639 640 # Load the source.641 ifneq ($(load_function),)642 local loading := $(src)643 $(evalvalctx $(load_function))644 endif645 646 # less typing.647 local src := $(src_prefix)$(src)648 649 # Recursivly process the parent (src) if it's inherting from somebody too.650 ifdef $(src)_EXTENDS651 ifneq ($($(src)_EXTENDS_STATUS_),42)652 # 'foreach' will create 'trg' in a new variable context hiding653 # out current variable. 'src' OTOH will be overwritten.654 $(foreach trg, $(src), $(evalval def_inherit))655 local src := $(src_prefix)$(strip $($(trg)_EXTENDS))656 endif657 endif658 659 # Get & check EXTENDS_BY.660 local by = $(strip $($(trg)_EXTENDS_BY))661 ifeq ($(by),)662 local by = overriding663 else ifn1of ($(by), overriding appending prepending)664 $(error kBuild: Invalid EXTENDS_BY value '$(by)' on '$(trg)'!)665 endif666 667 # Inherit the properties.668 $(foreach prop, $(call _INHERIT_JOIN_KEYWORDS,$(properties)), $(eval $(def_inherit_one)))669 $(foreach prop, $(call _INHERIT_JOIN_KEYWORDS,$(properties_now_l)), $(eval $(def_inherit_one_$(by)_now_l)))670 $(foreach prop, $(call _INHERIT_JOIN_KEYWORDS,$(properties_now_r)), $(eval $(def_inherit_one_$(by)_now_r)))671 $(foreach prop, $(call _INHERIT_JOIN_KEYWORDS,$(properties_deferred)), $(eval $(def_inherit_one_$(by)_deferred)))672 $(foreach prop, $(call _INHERIT_JOIN_KEYWORDS,$(properties_deferred_l)), $(eval $(def_inherit_one_$(by)_deferred_l)))673 $(foreach prop, $(call _INHERIT_JOIN_KEYWORDS,$(properties_deferred_r)), $(eval $(def_inherit_one_$(by)_deferred_r)))674 675 # Mark the target as done.676 $(trg)_EXTENDS_STATUS_ := 42677 else678 # Check for inheritance loops.679 ifneq ($($(trg)_EXTENDS_STATUS_),42)680 $(error kBuild: Target inheritance loop! target=$(trg) $(trg)_EXTENDS_STATUS_=$($(trg)_EXTENDS_STATUS_))681 endif682 endif683 endif684 685 # Keyword inheritance.686 $(foreach prefix_keyword, $(join $(_KEYWORDS_PREFIX), $(addprefix :,$(_KEYWORDS_EXTENDS))), $(evalval def_inherit_keyword))687 688 endef # def_inherit689 690 691 #692 # Load global units before doing any inheriting so they can add new properties.693 #694 # This only applies to the guys listed in the global USES since there is695 # no reliable way to deal with things on a target level without first696 # applying templates. So, to avoid having USES mess up all targets,697 # we'll make the global and per-target USES property work differently:698 # The global USES does not apply to targets, just globally.699 #700 701 ## Unit load function.702 # @param loading The unit name703 define def_unit_load_function704 ifndef UNIT_$(loading)705 UNIT_$(loading)_KMK_FILE := $(firstword $(foreach path, $(KBUILD_UNIT_PATHS) $(KBUILD_PATH)/units $(KBUILD_DEFAULT_PATHS), $(wildcard $(path)/$(loading).kmk)))706 ifeq ($(UNIT_$(loading)_KMK_FILE),)707 $(error kBuild: Cannot find include file for the unit '$(loading)'! Searched: $(KBUILD_UNIT_PATHS) $(KBUILD_PATH)/units $(KBUILD_DEFAULT_PATHS))708 endif709 include $(UNIT_$(loading)_KMK_FILE)710 ifndef UNIT_$(loading)711 $(warning kBuild: UNIT_$(loading) was not defined by $(UNIT_$(loading)_KMK_FILE)!)712 endif713 endif714 endef # def_unit_load_function715 716 $(foreach loading, \717 $(USES.$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)) \718 $(USES.$(KBUILD_TARGET_CPU)) \719 $(USES.$(KBUILD_TARGET_ARCH)) \720 $(USES.$(KBUILD_TARGET)) \721 $(USES.$(KBUILD_HOST).$(KBUILD_HOST_ARCH)) \722 $(USES.$(KBUILD_HOST_CPU)) \723 $(USES.$(KBUILD_HOST_ARCH)) \724 $(USES.$(KBUILD_TARGET)) \725 $(USES.$(KBUILD_TYPE)) \726 $(USES),$(evalval def_unit_load_function))727 728 729 #730 # Determin all the templates that is being used and make731 # sure they are present before we try collect keywords.732 #733 _TEMPLATES := $(TEMPLATE)734 define def_templates735 ifdef $(target)_TEMPLATE736 ifneq ("$($(target)_TEMPLATE)","$(strip $($(target)_TEMPLATE))")737 $$(error kBuild: The template name of target '$(target)' contains tabs ($($(target)_TEMPLATE))). Please remove them)738 endif739 _TEMPLATES += $($(target)_TEMPLATE)740 endif741 endef # def_templates742 $(foreach target, $(_ALL_TARGETS), $(eval $(def_templates)))743 _TEMPLATES := $(sort $(_TEMPLATES))744 745 ## Template load function.746 # @param loading The template name. This is prefixed.747 define def_templates_load_function748 ifndef TEMPLATE_$(loading)749 TEMPLATE_$(loading)_KMK_FILE := $(firstword $(foreach path, $(KBUILD_TEMPLATE_PATHS) $(KBUILD_PATH)/templates $(KBUILD_DEFAULT_PATHS), $(wildcard $(path)/$(loading).kmk)))750 ifeq ($(TEMPLATE_$(loading)_KMK_FILE),)751 $(error kBuild: Cannot find include file for the template '$(loading)'! Searched: $(KBUILD_TEMPLATE_PATHS) $(KBUILD_PATH)/templates $(KBUILD_DEFAULT_PATHS))752 endif753 include $(TEMPLATE_$(loading)_KMK_FILE)754 ifndef TEMPLATE_$(loading)755 $(warning kBuild: TEMPLATE_$(loading) was not defined by $(TEMPLATE_$(loading)_KMK_FILE)!)756 endif757 endif758 endef # def_templates_load_function759 $(foreach loading, $(_TEMPLATES), $(evalval def_templates_load_function))760 761 762 #763 # Determin the keywords required for correct inherting and setup keyword inheritance.764 #765 # This means walking all the lists of immediate template and targets and766 # pick up all the BLD_T* keywords. Since templates that are referenced767 # indirectly in the inheritance hierarchy, the result from this exercise768 # might not be 100% accurate... :-/769 #770 _BLD_TYPES := $(KBUILD_TYPE)771 _BLD_TARGETS := $(KBUILD_TARGET) $(KBUILD_HOSTS)772 _BLD_ARCHES := $(KBUILD_TARGET_ARCH) $(KBUILD_HOST_ARCH)773 _BLD_CPUS := $(KBUILD_TARGET_CPU) $(KBUILD_HOST_CPU)774 775 define def_collect_bld_xyz776 ifdef $(src)_BLD_TYPE777 ifn1of ($($(src)_BLD_TYPE), $(KBUILD_BLD_TYPES))778 $(error kBuild: $(src)_BLD_TYPE=$($(src)_BLD_TYPE) not in KBUILD_BLD_TYPES={$(KBUILD_BLD_TYPES)}!)779 endif780 _BLD_TYPES += $($(src)_BLD_TYPE)781 endif782 ifdef $(src)_BLD_TRG783 ifn1of ($($(src)_BLD_TRG), $(KBUILD_OSES))784 $(error kBuild: $(src)_BLD_TRG=$($(src)_BLD_TRG) not in KBUILD_OSES={$(KBUILD_OSES)}!)785 endif786 _BLD_TARGETS += $($(src)_BLD_TRG)787 endif788 ifdef $(src)_BLD_TRG_ARCH789 ifn1of ($($(src)_BLD_TRG_ARCH), $(KBUILD_ARCHES))790 $(error kBuild: $(src)_BLD_TRG_ARCH=$($(src)_BLD_TRG_ARCH) not in KBUILD_ARCHES={$(KBUILD_ARCHES)}!)791 endif792 _BLD_ARCHES += $($(src)_BLD_TRG_ARCH)793 endif794 ifdef $(src)_BLD_TRG_CPU795 if1of ($($(src)_BLD_CPU), $(KBUILD_ARCHES) $(KBUILD_OSES) $(KBUILD_BLD_TYPES))796 $(error kBuild: $(src)_BLD_TRG_CPU=$($(src)_BLD_TRG_CPU) found in KBUILD_ARCHES, KBUILD_OSES or KBUILD_BLD_TYPES!)797 endif798 _BLD_CPUS += $($(src)_BLD_TRG_CPU)799 endif800 endef # def_collect_bld_xyz801 $(foreach src, $(addprefix TEMPLATE_, $(_TEMPLATES)) $(_ALL_TARGETS) \802 ,$(evalval def_collect_bld_xyz))803 804 # Drop duplicate values.805 # WARNING! These list might not include keywords only involved in inheritance.806 _BLD_TYPES := $(sort $(_BLD_TYPES))807 _BLD_TARGETS := $(sort $(_BLD_TARGETS))808 _BLD_ARCHES := $(sort $(_BLD_ARCHES))809 _BLD_CPUS := $(sort $(_BLD_CPUS))810 811 ## Look for keywords which extends others and order them.812 # @param keyword813 # @param prefix814 # @param valid815 define def_keyword_ordering816 # Check for EXTENDS, fix and validate it if found.817 local src := $(strip $($(prefix)_$(keyword)_EXTENDS))818 ifneq ($(src),)819 ifndef $(prefix)_$(keyword)_EXTENDS_STATUS_820 ifn1of ($(src), $(valid))821 $(error kBuild: $(keyword) tries to extend unknown keyword '$(src)'! (known = $(valid)))822 endif823 824 # Recursivly process the parent (src).825 ifneq ($($(prefix)_$(src)_EXTENDS_STATUS_),42)826 $(prefix)_$(keyword)_EXTENDS_STATUS_ := 0827 # 'foreach' will create 'keyword' in a new variable context hiding828 # out current variable. 'src' OTOH will be overwritten.829 $(foreach keyword, $(src), $(evalval def_keyword_ordering))830 local src := $(strip $($(prefix)_$(keyword)_EXTENDS))831 endif832 833 # Check and strip EXTENDS_BY.834 local by = $(strip $($(prefix)_$(keyword)_EXTENDS_BY))835 ifeq ($(by),)836 local by = overriding837 else ifn1of ($(by), overriding appending prepending)838 $(error kBuild: Invalid EXTENDS_BY value '$(by)' on '$(keyword)'!)839 endif840 841 # Update the attributes with stripped842 $(prefix)_$(keyword)_EXTENDS_BY := $(by)843 $(prefix)_$(keyword)_EXTENDS := $(src)844 845 # Add it to the list and mark it as done.846 _KEYWORDS_EXTENDS += $(keyword)847 _KEYWORDS_PREFIX += $(prefix)848 $(prefix)_$(keyword)_EXTENDS_STATUS_ := 42849 else850 # Check for inheritance loops.851 ifneq ($($(trg)_EXTENDS_STATUS_),42)852 $(error kBuild: Keyword inheritance loop! keyword=$(keyword) $(prefix)_$(keyword)_EXTENDS_STATUS_=$($(prefix)_$(keyword)_EXTENDS_STATUS_))853 endif854 endif855 else856 # Add it to the ordered list and mark it as done.857 _KEYWORDS_ORDERED += $(keyword)858 $(prefix)_$(src)_EXTENDS_STATUS_ := 42859 endif860 endef # def_keyword_ordering861 $(eval-opt-var def_keyword_ordering)862 863 # Look for keywords which extends others and their parents, and from this864 # construct two lists.865 _KEYWORDS_ORDERED :=866 _KEYWORDS_EXTENDS :=867 _KEYWORDS_PREFIX :=868 869 prefix := BLD_TYPE870 valid := $(KBUILD_BLD_TYPES)871 $(foreach keyword, $(_BLD_TYPES) , $(evalval def_keyword_ordering))872 873 prefix := BLD_TRG874 valid := $(KBUILD_OSES)875 $(foreach keyword, $(_BLD_TARGETS), $(evalval def_keyword_ordering))876 877 prefix := BLD_ARCH878 valid := $(KBUILD_ARCHES)879 $(foreach keyword, $(_BLD_ARCHES) , $(evalval def_keyword_ordering))880 881 prefix := BLD_CPU882 valid := $(KBUILD_CPUS)883 $(foreach keyword, $(_BLD_CPUS) , $(evalval def_keyword_ordering))884 885 ## @todo Inherit bld_trg.bld_arch for too?886 887 # Construct all the possible keywords.888 _KEYWORDS := $(_KEYWORDS_ORDERED) $(_KEYWORDS_EXTENDS) \889 $(foreach bld_trg,$(_BLD_TARGETS),$(addprefix $(bld_trg).,$(_BLD_ARCHES)))890 891 ifdef KBUILD_PROFILE_SELF892 $(evalcall def_profile_self, done keywords)893 endif894 895 896 #897 # Target inheritance.898 #899 # This has to be done on a per target list basis as to avoid adding900 # incorrect properties that will wast memory, time, and may confuse901 # later strictness checks. This also has to be done *before* templates902 # are applied to the targets. Since we're doing that part rather903 # early on, the target inheritance feature is a bit restricted at904 # the moment. However, this will be addressed in a little(?) while.905 #906 907 src_prefix :=908 load_function :=909 properties_deferred_l :=910 properties_deferred_r :=911 912 # Fetches.913 properties := $(PROPS_FETCHES_SINGLE)914 properties_now_l := $(PROPS_FETCHES_ACCUMULATE_L)915 properties_now_r := $(PROPS_FETCHES_ACCUMULATE_R)916 properties_deferred := $(PROPS_FETCHES_DEFERRED)917 $(foreach trg, $(_ALL_FETCHES),$(evalval def_inherit))918 919 ## Patches. - not implemented yet.920 #properties := $(PROPS_PATCHES_SINGLE)921 #properties_now_l := $(PROPS_PATCHES_ACCUMULATE_L)922 #properties_now_r := $(PROPS_PATCHES_ACCUMULATE_R)923 #properties_deferred := $(PROPS_PATCHES_DEFERRED)924 #$(foreach trg, $(_ALL_PATCHES),$(evalval def_inherit))925 926 # Programs and build programs.927 properties := $(PROPS_PROGRAMS_SINGLE)928 properties_now_l := $(PROPS_PROGRAMS_ACCUMULATE_L)929 properties_now_r := $(PROPS_PROGRAMS_ACCUMULATE_R)930 properties_deferred := $(PROPS_PROGRAMS_DEFERRED)931 $(foreach trg, $(_ALL_BLDPROGS) $(_ALL_PROGRAMS),$(evalval def_inherit))932 933 # Libraries and import libraries.934 properties := $(PROPS_LIBRARIES_SINGLE)935 properties_now_l := $(PROPS_LIBRARIES_ACCUMULATE_L)936 properties_now_r := $(PROPS_LIBRARIES_ACCUMULATE_R)937 properties_deferred := $(PROPS_LIBRARIES_DEFERRED)938 if1of ($(KBUILD_TARGET), nt os2 win)939 $(foreach trg, $(_ALL_LIBRARIES) $(_ALL_IMPORT_LIBS),$(evalval def_inherit))940 else941 $(foreach trg, $(_ALL_LIBRARIES),$(evalval def_inherit))942 endif943 944 # DLLs.945 properties := $(PROPS_DLLS_SINGLE)946 properties_now_l := $(PROPS_DLLS_ACCUMULATE_L)947 properties_now_r := $(PROPS_DLLS_ACCUMULATE_R)948 properties_deferred := $(PROPS_DLLS_DEFERRED)949 if1of ($(KBUILD_TARGET), nt os2 win)950 $(foreach trg, $(_ALL_DLLS),$(evalval def_inherit))951 else952 $(foreach trg, $(_ALL_DLLS) $(_ALL_IMPORT_LIBS),$(evalval def_inherit))953 endif954 955 # System modules.956 properties := $(PROPS_SYSMODS_SINGLE)957 properties_now_l := $(PROPS_SYSMODS_ACCUMULATE_L)958 properties_now_r := $(PROPS_SYSMODS_ACCUMULATE_R)959 properties_deferred := $(PROPS_SYSMODS_DEFERRED)960 $(foreach trg, $(_ALL_SYSMODS),$(evalval def_inherit))961 962 # Misc binaries.963 properties := $(PROPS_MISCBINS_SINGLE)964 properties_now_l := $(PROPS_MISCBINS_ACCUMULATE_L)965 properties_now_r := $(PROPS_MISCBINS_ACCUMULATE_R)966 properties_deferred := $(PROPS_MISCBINS_DEFERRED)967 $(foreach trg, $(_ALL_MISCBINS),$(evalval def_inherit))968 969 # Installs.970 properties := $(PROPS_INSTALLS_SINGLE)971 properties_now_l := $(PROPS_INSTALLS_ACCUMULATE_L)972 properties_now_r := $(PROPS_INSTALLS_ACCUMULATE_R)973 properties_deferred := $(PROPS_INSTALLS_DEFERRED)974 $(foreach trg, $(_ALL_INSTALLS),$(evalval def_inherit))975 976 ifdef KBUILD_PROFILE_SELF977 $(evalcall def_profile_self, done target inheritance)978 endif979 980 981 #982 # Template Inheritance.983 #984 # This is much the same as with target inheritance, except we cannot985 # restrict the properties involved since we haven't got a clue which986 # target platforms/archs are using them. But, we can drop the instance987 # expansion we're doing for targets since there won't be any more988 # changes to either the source nor the target templates beyond this989 # exercise.990 #991 992 src_prefix := TEMPLATE_993 load_function := def_templates_load_function994 properties :=995 properties_now_l :=996 properties_now_r :=997 properties_deferred := $(PROPS_SINGLE) $(PROPS_DEFERRED)998 properties_deferred_l := $(PROPS_ACCUMULATE_L)999 properties_deferred_r := $(PROPS_ACCUMULATE_R)1000 $(foreach trg, $(addprefix TEMPLATE_,$(_TEMPLATES)),$(evalval def_inherit))1001 1002 # done inheriting.1003 src_prefix :=1004 load_function :=1005 properties :=1006 properties_now_l :=1007 properties_now_r :=1008 properties_deferred :=1009 properties_deferred_l :=1010 properties_deferred_r :=1011 1012 ifdef KBUILD_PROFILE_SELF1013 $(evalcall def_profile_self, done template inheritance)1014 endif1015 1016 1017 1018 1019 #1020 # Template/Target Expansion.1021 #1022 # Extend all targets with the values from the template. Doing this up front1023 # allows more generic code and less mess down in the pass 2 target handling.1024 # However it does eat a good deal of memory.1025 #1026 1027 define def_inherit_template_workaround_target1028 local _tmpl := $(firstword $($(target)_TEMPLATE) $(TEMPLATE))1029 local _bld_type := $(firstword $($(target)_BLD_TYPE) $(TEMPLATE_$(_tmpl)_BLD_TYPE) $(KBUILD_TYPE))1030 local _bld_trg := $(firstword $($(target)_BLD_TRG) $(TEMPLATE_$(_tmpl)_BLD_TRG) $(KBUILD_TARGET))1031 local _bld_trg_arch := $(firstword $($(target)_BLD_TRG_ARCH) $(TEMPLATE_$(_tmpl)_BLD_TRG_ARCH) $(KBUILD_TARGET_ARCH))1032 local _bld_trg_cpu := $(firstword $($(target)_BLD_TRG_CPU) $(TEMPLATE_$(_tmpl)_BLD_TRG_CPU) $(KBUILD_TARGET_CPU))1033 $(kb-exp-tmpl 1,$(target),$(_bld_trg),$(_bld_trg_arch),$(_bld_trg_cpu),$(_bld_type))1034 endef # def_inherit_template_workaround_target1035 #$(kb-exp-tmpl 1,$(_ALL_TARGET_TARGETS),$(KBUILD_TARGET),$(KBUILD_TARGET_ARCH),$(KBUILD_TARGET_CPU),$(KBUILD_TYPE))1036 $(foreach target,$(_ALL_TARGET_TARGETS),$(evalval def_inherit_template_workaround_target))1037 1038 define def_inherit_template_workaround_host1039 local _tmpl := $(firstword $($(target)_TEMPLATE) $(TEMPLATE))1040 local _bld_type := $(firstword $($(target)_BLD_TYPE) $(TEMPLATE_$(_tmpl)_BLD_TYPE) $(KBUILD_TYPE))1041 local _bld_trg := $(firstword $($(target)_BLD_TRG) $(TEMPLATE_$(_tmpl)_BLD_TRG) $(KBUILD_HOST))1042 local _bld_trg_arch := $(firstword $($(target)_BLD_TRG_ARCH) $(TEMPLATE_$(_tmpl)_BLD_TRG_ARCH) $(KBUILD_HOST_ARCH))1043 local _bld_trg_cpu := $(firstword $($(target)_BLD_TRG_CPU) $(TEMPLATE_$(_tmpl)_BLD_TRG_CPU) $(KBUILD_HOST_CPU))1044 $(kb-exp-tmpl 1,$(target),$(_bld_trg),$(_bld_trg_arch),$(_bld_trg_cpu),$(_bld_type))1045 endef # def_inherit_template_workaround_target1046 #$(kb-exp-tmpl 1,$(_ALL_HOST_TARGETS),$(KBUILD_HOST),$(KBUILD_HOST_ARCH),$(KBUILD_HOST_CPU),$(KBUILD_TYPE))1047 $(foreach target,$(_ALL_HOST_TARGETS),$(evalval def_inherit_template_workaround_host))1048 1049 ifdef KBUILD_PROFILE_SELF1050 $(evalcall def_profile_self, done template/target expansion)1051 endif1052 1053 1054 #1055 # Include tools, sdks and units.1056 #1057 # The first part of this exercise is to figure out which TOOLS and SDKS1058 # that should be included.1059 #1060 _TOOLS := $(TOOL.$(KBUILD_TARGET)) $(TOOL.$(KBUILD_TARGET_ARCH)) $(TOOL.$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)) \1061 $(TOOL.$(KBUILD_HOST)) $(TOOL.$(KBUILD_HOST_ARCH)) $(TOOL.$(KBUILD_HOST).$(KBUILD_HOST_ARCH)) \1062 $(TOOL)1063 _SDKS := $(SDKS.$(KBUILD_TARGET)) $(SDKS.$(KBUILD_TARGET_ARCH)) $(SDKS.$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)) \1064 $(SDKS.$(KBUILD_HOST)) $(SDKS.$(KBUILD_HOST_ARCH)) $(SDKS.$(KBUILD_HOST).$(KBUILD_HOST_ARCH)) \1065 $(SDKS.$(KBUILD_TYPE)) \1066 $(SDKS)1067 _USES := $(USES.$(KBUILD_TARGET)) $(USES.$(KBUILD_TARGET_ARCH)) $(USES.$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)) \1068 $(USES.$(KBUILD_HOST)) $(USES.$(KBUILD_HOST_ARCH)) $(USES.$(KBUILD_HOST).$(KBUILD_HOST_ARCH)) \1069 $(USES.$(KBUILD_TYPE)) \1070 $(USES)1071 define def_tools_sdks_target_source1072 $(eval _TOOLS += $(foreach prop, $(PROPS_TOOLS), \1073 $($(source)_$(prop).$(_bld_trg)) \1074 $($(target)_$(source)_$(prop).$(_bld_trg)) \1075 $($(source)_$(prop).$(_bld_trg).$(_bld_trg_arch)) \1076 $($(target)_$(source)_$(prop).$(_bld_trg).$(_bld_trg_arch)) \1077 $($(source)_$(prop).$(_bld_trg_arch)) \1078 $($(target)_$(source)_$(prop).$(_bld_trg_arch)) \1079 $($(source)_$(prop)) \1080 $($(target)_$(source)_$(prop))))1081 $(eval _SDKS += \1082 $($(source)_SDKS.$(_bld_trg)) \1083 $($(target)_$(source)_SDKS.$(_bld_trg)) \1084 $($(source)_SDKS.$(_bld_trg).$(_bld_trg_arch)) \1085 $($(target)_$(source)_SDKS.$(_bld_trg).$(_bld_trg_arch)) \1086 $($(source)_SDKS.$(_bld_trg_arch)) \1087 $($(target)_$(source)_SDKS.$(_bld_trg_arch)) \1088 $($(source)_SDKS.$(KBUILD_TYPE)) \1089 $($(target)_$(source)_SDKS.$(KBUILD_TYPE)) \1090 $($(source)_SDKS) \1091 $($(target)_$(source)_SDKS))1092 $(eval _USES += \1093 $($(source)_USES.$(_bld_trg)) \1094 $($(target)_$(source)_USES.$(_bld_trg)) \1095 $($(source)_USES.$(_bld_trg).$(_bld_trg_arch)) \1096 $($(target)_$(source)_USES.$(_bld_trg).$(_bld_trg_arch)) \1097 $($(source)_USES.$(_bld_trg_arch)) \1098 $($(target)_$(source)_USES.$(_bld_trg_arch)) \1099 $($(source)_USES.$(KBUILD_TYPE)) \1100 $($(target)_$(source)_USES.$(KBUILD_TYPE)) \1101 $($(source)_USES) \1102 $($(target)_$(source)_USES))1103 endef # def_tools_sdks_target_source1104 $(eval-opt-var def_tools_sdks_target_source)1105 1106 define def_tools_sdks_target1107 local _bld_type := $(firstword $($(target)_BLD_TYPE) $(KBUILD_TYPE))1108 local _bld_trg := $(firstword $($(target)_BLD_TRG) $(bld_trg))1109 local _bld_trg_arch := $(firstword $($(target)_BLD_TRG_ARCH) $(bld_trg_arch))1110 local _bld_trg_cpu := $(firstword $($(target)_BLD_TRG_CPU) $(bld_trg_cpu))1111 1112 $(eval _TOOLS += $(foreach prop, $(PROPS_TOOLS), \1113 $($(target)_$(prop).$(_bld_trg)) \1114 $($(target)_$(prop).$(_bld_trg_arch)) \1115 $($(target)_$(prop).$(_bld_trg).$(_bld_trg_arch)) \1116 $($(target)_$(prop))))1117 $(eval _SDKS += \1118 $($(target)_SDKS.$(_bld_trg)) \1119 $($(target)_SDKS.$(_bld_trg_arch)) \1120 $($(target)_SDKS.$(_bld_trg).$(_bld_trg_arch)) \1121 $($(target)_SDKS))1122 $(eval _USES += \1123 $($(target)_USES.$(_bld_trg)) \1124 $($(target)_USES.$(_bld_trg_arch)) \1125 $($(target)_USES.$(_bld_trg).$(_bld_trg_arch)) \1126 $($(target)_USES))1127 $(foreach source, \1128 $($(target)_SOURCES.$(_bld_trg)) \1129 $($(target)_SOURCES.$(_bld_trg_arch)) \1130 $($(target)_SOURCES.$(_bld_trg).$(_bld_trg_arch)) \1131 $($(target)_SOURCES.$(_bld_trg_cpu)) \1132 $($(target)_SOURCES.$(_bld_type)) \1133 $($(target)_SOURCES) \1134 , $(evalval def_tools_sdks_target_source))1135 endef # def_tools_sdks_target1136 $(eval-opt-var def_tools_sdks_target)1137 1138 define def_tools_srcname_target1139 local _bld_type := $(firstword $($(target)_BLD_TYPE) $(KBUILD_TYPE))1140 local _bld_trg := $(firstword $($(target)_BLD_TRG) $(bld_trg))1141 local _bld_trg_arch := $(firstword $($(target)_BLD_TRG_ARCH) $(bld_trg_arch))1142 local _bld_trg_cpu := $(firstword $($(target)_BLD_TRG_CPU) $(bld_trg_cpu))1143 1144 $(foreach source, $(notdir\1145 $($(target)_SOURCES.$(_bld_trg)) \1146 $($(target)_SOURCES.$(_bld_trg_arch)) \1147 $($(target)_SOURCES.$(_bld_trg).$(_bld_trg_arch)) \1148 $($(target)_SOURCES.$(_bld_trg_cpu)) \1149 $($(target)_SOURCES.$(_bld_type)) \1150 $($(target)_SOURCES) \1151 ), $(evalval def_tools_sdks_target_source))1152 endef # def_tools_srcname_target1153 $(eval-opt-var def_tools_srcname_target)1154 1155 bld_trg := $(KBUILD_TARGET)1156 bld_trg_arch := $(KBUILD_TARGET_ARCH)1157 bld_trg_cpu := $(KBUILD_TARGET_CPU)1158 $(foreach target, $(_ALL_TARGET_TARGETS), $(evalval def_tools_sdks_target))1159 $(foreach target, $(_ALL_SRCNAME_TARGETS), $(evalval def_tools_srcname_target))1160 1161 bld_trg := $(KBUILD_HOST)1162 bld_trg_arch := $(KBUILD_HOST_ARCH)1163 bld_trg_cpu := $(KBUILD_HOST_CPU)1164 $(foreach target, $(_ALL_HOST_TARGETS), $(evalval def_tools_sdks_target))1165 1166 _TOOLS := $(sort $(_TOOLS))1167 _SDKS := $(sort $(_SDKS))1168 1169 ## Tool load function.1170 # @param loading The tool name1171 define def_tools_load_function1172 ifndef TOOL_$(loading)1173 TOOL_$(loading)_KMK_FILE := $(firstword $(foreach path, $(KBUILD_TOOL_PATHS) $(KBUILD_PATH)/tools $(KBUILD_DEFAULT_PATHS), $(wildcard $(path)/$(loading).kmk)))1174 ifeq ($(TOOL_$(loading)_KMK_FILE),)1175 $(error kBuild: Cannot find include file for the tool '$(loading)'! Searched: $(KBUILD_TOOL_PATHS) $(KBUILD_PATH)/tools $(KBUILD_DEFAULT_PATHS))1176 endif1177 include $(TOOL_$(loading)_KMK_FILE)1178 ifndef TOOL_$(loading)1179 $(warning kBuild: TOOL_$(loading) was not defined by $(TOOL_$(loading)_KMK_FILE)!)1180 endif1181 endif1182 endef # def_tools_include1183 1184 ## SDK load function.1185 # @param loading The tool name1186 define def_sdk_load_function1187 ifndef SDK_$(loading)1188 SDK_$(loading)_KMK_FILE := $(firstword $(foreach path, $(KBUILD_SDK_PATHS) $(KBUILD_PATH)/sdks $(KBUILD_DEFAULT_PATHS), $(wildcard $(path)/$(loading).kmk)))1189 ifeq ($(SDK_$(loading)_KMK_FILE),)1190 $(error kBuild: Cannot find include file for the SDK '$(loading)'! Searched: $(KBUILD_SDK_PATHS) $(KBUILD_PATH)/sdks $(KBUILD_DEFAULT_PATHS))1191 endif1192 include $(SDK_$(loading)_KMK_FILE)1193 ifndef SDK_$(loading)1194 $(warning kBuild: SDK_$(loading) was not defined by $(SDK_$(loading)_KMK_FILE)!)1195 endif1196 endif1197 endef # def_sdk_load_function1198 1199 1200 properties :=1201 properties_now_l :=1202 properties_now_r :=1203 properties_deferred := $(PROPS_SINGLE) $(PROPS_DEFERRED)1204 properties_deferred_l := $(PROPS_ACCUMULATE_L)1205 properties_deferred_r := $(PROPS_ACCUMULATE_R)1206 1207 src_prefix := SDK_1208 load_function := def_sdk_load_function1209 $(foreach trg, $(addprefix SDK_,$(_SDKS)), $(evalval def_inherit))1210 1211 properties_deferred := $(PROPS_SINGLE) $(PROPS_DEFERRED) $(PROPS_TOOLS_ONLY)1212 src_prefix := TOOL_1213 load_function := def_tools_load_function1214 $(foreach trg, $(addprefix TOOL_,$(_TOOLS)), $(evalval def_inherit))1215 1216 # done inheriting.1217 src_prefix :=1218 load_function :=1219 properties :=1220 properties_now_l :=1221 properties_now_r :=1222 properties_deferred :=1223 properties_deferred_l :=1224 properties_deferred_r :=1225 1226 # No inheriting for the uses, they're just global 'code'.1227 $(foreach loading, $(_USES), $(evalval def_unit_load_function))1228 1229 1230 ifdef KBUILD_PROFILE_SELF1231 $(evalcall def_profile_self, done tools + sdks + units)1232 endif1233 1234 1235 1236 #1237 #1238 # Target lists - Pass 11239 #1240 # This pass is for defining variables that might be referenced in1241 # properties of other targets.1242 #1243 #1244 1245 # Don't do anything for fetch targets (yet).1246 1247 ##1248 # Link prolog for Pass 1.1249 #1250 # @param $(target) Normalized target name.1251 # @param $(EXT) EXE,DLL,SYS,LIB.1252 # @param $(EXTPRE) HOST or nothing.1253 # @param $(definst) The default _INST value.1254 # @param $(tool_prefix) LD or AR.1255 # @param $(bld_trg_base_var) TARGET or PLATFORM.1256 define def_pass1_link_common1257 1258 local bld_type := $(firstword $($(target)_BLD_TYPE) $(KBUILD_TYPE))1259 local bld_trg := $(firstword $($(target)_BLD_TRG) $(BUILD_$(bld_trg_base_var)))1260 local bld_trg_arch:= $(firstword $($(target)_BLD_TRG_ARCH) $(BUILD_$(bld_trg_base_var)_ARCH))1261 local bld_trg_cpu := $(firstword $($(target)_BLD_TRG_CPU) $(BUILD_$(bld_trg_base_var)_CPU))1262 1263 local tool := $(call _TARGET_TOOL,$(target),$(tool_prefix))1264 local name := $(firstword\1265 $($(target)_NAME.$(bld_trg).$(bld_trg_arch).$(bld_type))\1266 $($(target)_NAME.$(bld_trg).$(bld_trg_arch))\1267 $($(target)_NAME.$(bld_trg).$(bld_type))\1268 $($(target)_NAME.$(bld_trg_arch))\1269 $($(target)_NAME.$(bld_trg))\1270 $($(target)_NAME.$(bld_type))\1271 $($(target)_NAME)\1272 $(target))1273 local outbase := $(call TARGET_BASE,$(name),$(target))1274 $(target)_0_OUTDIR:= $(patsubst %/,%,$(dir $(outbase)))1275 $(call KB_FN_ASSIGN_DEPRECATED,PATH_$(target),$($(target)_0_OUTDIR), $(target)_0_OUTDIR)1276 1277 ## @todo fix the fun at the last line (AR != LIB => mess).1278 local suff := $(firstword \1279 $($(target)_$(EXT)SUFF.$(bld_trg).$(bld_trg_arch))\1280 $($(target)_$(EXT)SUFF.$(bld_trg))\1281 $($(target)_$(EXT)SUFF)\1282 $(TOOL_$(tool)_$(tool_prefix)$(EXT)SUFF.$(bld_trg).$(bld_trg_arch))\1283 $(TOOL_$(tool)_$(tool_prefix)$(EXT)SUFF.$(bld_trg))\1284 $(TOOL_$(tool)_$(tool_prefix)$(EXT)SUFF)\1285 $(if $(eq $(tool_prefix),AR),$(SUFF_LIB),$($(EXTPRE)SUFF_$(EXT))) )1286 local out := $(outbase)$(suff)1287 1288 # Object directory target variable.1289 $(target)_1_TARGET := $(out)1290 $(call KB_FN_ASSIGN_DEPRECATED,TARGET_$(target),$($(target)_1_TARGET), $(target)_1_TARGET)1291 1292 # Staging and install directory target variables.1293 local insttype := $(firstword \1294 $($(target)_INSTTYPE) \1295 $($(target)_INSTTYPE.$(bld_trg)) \1296 $($(target)_INSTTYPE.$(bld_trg).$(bld_trg_arch)) \1297 $($(target)_INSTTYPE.$(bld_trg).$(bld_trg_arch).$(bld_type)) \1298 $($(target)_INSTTYPE.$(bld_trg_arch)) \1299 $($(target)_INSTTYPE.$(bld_trg_cpu)) \1300 $($(target)_INSTTYPE.$(bld_type)) \1301 )1302 ifeq ($(insttype),)1303 ifneq ($(firstword \1304 $($(target)_NOINST) \1305 $($(target)_NOINST.$(bld_trg)) \1306 $($(target)_NOINST.$(bld_trg).$(bld_trg_arch)) \1307 $($(target)_NOINST.$(bld_trg).$(bld_trg_arch).$(bld_type)) \1308 $($(target)_NOINST.$(bld_trg_arch)) \1309 $($(target)_NOINST.$(bld_trg_cpu)) \1310 $($(target)_NOINST.$(bld_type)) ),)1311 local insttype := none1312 else1313 local insttype := both1314 endif1315 endif1316 ifn1of ($(insttype), none both stage)1317 $(error kBuild: Unknown value '$(insttype)' for '$(target)_INSTTYPE'. Valid values are 'none', 'both' and 'stage'.)1318 endif1319 $(target)_1_INSTTYPE := $(insttype)1320 1321 if1of ($(insttype), stage both)1322 local stage := $(strip $(firstdefined \1323 $(target)_STAGE.$(bld_trg).$(bld_trg_arch).$(bld_type) \1324 $(target)_INST.$(bld_trg).$(bld_trg_arch).$(bld_type) \1325 $(target)_STAGE.$(bld_trg).$(bld_trg_arch) \1326 $(target)_INST.$(bld_trg).$(bld_trg_arch) \1327 $(target)_STAGE.$(bld_trg).$(bld_type) \1328 $(target)_INST.$(bld_trg).$(bld_type) \1329 $(target)_STAGE.$(bld_trg_arch) \1330 $(target)_INST.$(bld_trg_arch) \1331 $(target)_STAGE.$(bld_trg) \1332 $(target)_INST.$(bld_trg) \1333 $(target)_STAGE.$(bld_type) \1334 $(target)_INST.$(bld_type) \1335 $(target)_STAGE \1336 $(target)_INST \1337 definst \1338 ,value))1339 $(target)_1_STAGE := $(stage)1340 if "$(substr $(stage),-1,1)" == "/" # Multicast support requires addprefix/suffix.1341 $(target)_1_STAGE_TARGET := $(addprefix $(PATH_STAGE)/,$(addsuffix $(notdir $(out)),$(stage)))1342 else if "$(stage)" == ""1343 $(target)_1_STAGE_TARGET := $(PATH_STAGE)/$(notdir $(out))1344 else1345 $(target)_1_STAGE_TARGET := $(addprefix $(PATH_STAGE)/,$(stage))1346 endif1347 else1348 $(target)_1_STAGE :=1349 $(target)_1_STAGE_TARGET :=1350 endif1351 INSTARGET_$(target) := $($(target)_1_STAGE_TARGET)1352 1353 if1of ($(insttype), both)1354 local inst := $(strip $(firstdefined \1355 $(target)_INST.$(bld_trg).$(bld_trg_arch).$(bld_type) \1356 $(target)_INST.$(bld_trg).$(bld_trg_arch) \1357 $(target)_INST.$(bld_trg).$(bld_type) \1358 $(target)_INST.$(bld_trg_arch) \1359 $(target)_INST.$(bld_trg) \1360 $(target)_INST.$(bld_type) \1361 $(target)_INST \1362 definst \1363 ,value))1364 $(target)_1_INST := $(inst)1365 if "$(substr $(inst),-1,1)" == "/" # Multicast support requires addprefix/suffix.1366 $(target)_1_INST_TARGET := $(addprefix $(PATH_INS)/,$(addsuffix $(notdir $(out)),$(inst)))1367 else if "$(inst)" == ""1368 $(target)_1_INST_TARGET := $(PATH_INS)/$(notdir $(out))1369 else1370 $(target)_1_INST_TARGET := $(addprefix $(PATH_INS)/,$(inst))1371 endif1372 else1373 $(target)_1_INST :=1374 $(target)_1_INST_TARGET :=1375 endif1376 1377 endef # def_pass1_link_common1378 $(eval-opt-var def_pass1_link_common)1379 1380 1381 #1382 # BLDPROGS (Pass 1)1383 #1384 define def_pass1_bldprog1385 # set NOINST if not forced installation before doing the usual stuff.1386 ifndef $(target)_INST1387 $(target)_INSTTYPE := none1388 endif1389 $(evalval def_pass1_link_common)1390 endef1391 1392 EXT := EXE1393 EXTPRE := HOST1394 definst := $(INST_BIN)1395 tool_prefix := LD1396 bld_trg_base_var := PLATFORM1397 $(foreach target, $(_ALL_BLDPROGS), \1398 $(evalval def_pass1_bldprog))1399 1400 1401 #1402 # LIBRARIES (Pass 1)1403 #1404 EXT := LIB1405 EXTPRE :=1406 definst := $(INST_LIB)1407 tool_prefix := AR1408 bld_trg_base_var := TARGET1409 $(foreach target, $(_ALL_LIBRARIES), \1410 $(evalval def_pass1_link_common))1411 1412 1413 #1414 # DLLS (Pass 1)1415 #1416 EXT := DLL1417 EXTPRE :=1418 definst := $(INST_DLL)1419 tool_prefix := LD1420 bld_trg_base_var := TARGET1421 $(foreach target, $(_ALL_DLLS), \1422 $(evalval def_pass1_link_common))1423 1424 1425 #1426 # IMPORT LIBRARIES (Pass 1)1427 #1428 # - On OS/2 and windows these are libraries.1429 # - On other platforms they are fake DLLs.1430 #1431 if1of ($(KBUILD_TARGET), nt os2 win win64 win32)1432 EXT := LIB1433 EXTPRE :=1434 definst := $(INST_LIB)1435 tool_prefix := AR1436 bld_trg_base_var := TARGET1437 $(foreach target, $(_ALL_IMPORT_LIBS), \1438 $(evalval def_pass1_link_common))1439 else1440 EXT := DLL1441 EXTPRE :=1442 definst := $(INST_DLL)1443 tool_prefix := LD1444 bld_trg_base_var := TARGET1445 $(foreach target, $(_ALL_IMPORT_LIBS), \1446 $(evalval def_pass1_link_common))1447 endif1448 1449 1450 #1451 # PROGRAMS (Pass 1)1452 #1453 EXT := EXE1454 EXTPRE :=1455 definst := $(INST_BIN)1456 tool_prefix := LD1457 bld_trg_base_var := TARGET1458 $(foreach target, $(_ALL_PROGRAMS), \1459 $(evalval def_pass1_link_common))1460 1461 1462 #1463 # SYSMODS (Pass 1)1464 #1465 EXT := SYS1466 EXTPRE :=1467 definst := $(INST_SYS)1468 tool_prefix := LD1469 bld_trg_base_var := TARGET1470 $(foreach target, $(_ALL_SYSMODS), \1471 $(evalval def_pass1_link_common))1472 1473 1474 #1475 # MISCBINS (Pass 1)1476 #1477 EXT := BIN1478 EXTPRE :=1479 definst := $(INST_BIN)1480 tool_prefix := LD1481 bld_trg_base_var := TARGET1482 $(foreach target, $(_ALL_MISCBINS), \1483 $(evalval def_pass1_link_common))1484 1485 1486 #1487 # INSTALLS (Pass 1)1488 # Note! INSTARGET_* for INSTALLS aren't available until later.1489 #1490 define def_pass1_install1491 local bld_type := $(firstword $($(target)_BLD_TYPE) $(KBUILD_TYPE))1492 local bld_trg := $(firstword $($(target)_BLD_TRG) $(KBUILD_TARGET))1493 local bld_trg_arch := $(firstword $($(target)_BLD_TRG_ARCH) $(KBUILD_TARGET_ARCH))1494 local bld_trg_cpu := $(firstword $($(target)_BLD_TRG_CPU) $(KBUILD_TARGET_CPU))1495 # _1_TARGET1496 $(target)_1_TARGET := $(PATH_TARGET)/$(target).ins1497 $(call KB_FN_ASSIGN_DEPRECATED,TARGET_$(target),$($(target)_1_TARGET), $(target)_1_TARGET)1498 1499 # Determine and set 1_INSTTYPE.1500 local insttype := $(firstword \1501 $($(target)_INSTTYPE) \1502 $($(target)_INSTTYPE.$(bld_trg)) \1503 $($(target)_INSTTYPE.$(bld_trg).$(bld_trg_arch)) \1504 $($(target)_INSTTYPE.$(bld_trg).$(bld_trg_arch).$(bld_type)) \1505 $($(target)_INSTTYPE.$(bld_trg_arch)) \1506 $($(target)_INSTTYPE.$(bld_trg_cpu)) \1507 $($(target)_INSTTYPE.$(bld_type)) \1508 )1509 ifeq ($(insttype),)1510 ifneq ($(firstword \1511 $($(target)_NOINST) \1512 $($(target)_NOINST.$(bld_trg)) \1513 $($(target)_NOINST.$(bld_trg).$(bld_trg_arch)) \1514 $($(target)_NOINST.$(bld_trg).$(bld_trg_arch).$(bld_type)) \1515 $($(target)_NOINST.$(bld_trg_arch)) \1516 $($(target)_NOINST.$(bld_trg_cpu)) \1517 $($(target)_NOINST.$(bld_type)) ),)1518 local insttype := none1519 else1520 local insttype := both1521 endif1522 endif1523 ifn1of ($(insttype), none both stage)1524 $(error kBuild: Unknown value '$(insttype)' for '$(target)_INSTTYPE'. Valid values are 'none', 'both' and 'stage'.)1525 endif1526 $(target)_1_INSTTYPE := $(insttype)1527 1528 # Determine the actual INST and STAGE sub-dirs to use for this target.1529 if1of ($(insttype), stage both)1530 local stage := $(strip $(firstdefined \1531 $(target)_STAGE.$(bld_trg).$(bld_trg_arch).$(bld_type) \1532 $(target)_INST.$(bld_trg).$(bld_trg_arch).$(bld_type) \1533 $(target)_STAGE.$(bld_trg).$(bld_trg_arch) \1534 $(target)_INST.$(bld_trg).$(bld_trg_arch) \1535 $(target)_STAGE.$(bld_trg).$(bld_type) \1536 $(target)_INST.$(bld_trg).$(bld_type) \1537 $(target)_STAGE.$(bld_trg_arch) \1538 $(target)_INST.$(bld_trg_arch) \1539 $(target)_STAGE.$(bld_trg) \1540 $(target)_INST.$(bld_trg) \1541 $(target)_STAGE.$(bld_type) \1542 $(target)_INST.$(bld_type) \1543 $(target)_STAGE \1544 $(target)_INST \1545 definst \1546 ,value))1547 if $(words $(stage)) > 11548 $(warning kBuild: The STAGE/INST property of install '$(target)' specifies multiple location, that is not supported.)1549 local stage := $(word 1, $(stage))1550 endif1551 $(target)_1_STAGE := $(stage)1552 else1553 $(target)_1_STAGE = $(error _1_STAGE not used)1554 endif1555 1556 if1of ($(insttype), both)1557 local inst := $(strip $(firstdefined \1558 $(target)_INST.$(bld_trg).$(bld_trg_arch).$(bld_type) \1559 $(target)_INST.$(bld_trg).$(bld_trg_arch) \1560 $(target)_INST.$(bld_trg).$(bld_type) \1561 $(target)_INST.$(bld_trg_arch) \1562 $(target)_INST.$(bld_trg) \1563 $(target)_INST.$(bld_type) \1564 $(target)_INST \1565 definst \1566 ,value))1567 if $(words $(inst)) > 11568 $(warning kBuild: The INST property of install '$(target)' specifies multiple location, that is not supported.)1569 local inst := $(word 1, $(inst))1570 endif1571 ifneq ($(root $(stage)),)1572 $(error kBuild: The effective INST property of install '$(target)' should not start with a root specification)1573 endif1574 $(target)_1_INST := $(inst)1575 else1576 $(target)_1_INST = $(error _1_INST not used)1577 endif1578 1579 # Block properties that we put off setting until pass 2 for INSTALLS.1580 $(target)_1_STAGE_TARGET = $(error The '_1_STAGE_TARGET' property is not present on install targets. Use '_2_STAGE_TARGETS' instead (set by pass 2!).)1581 $(target)_1_INST_TARGET = $(error The '_1_INST_TARGET' property is not present on install targets. Use '_2_INST_TARGETS' instead (set by pass 2!).)1582 INSTARGET_$(target) = $(error The 'INSTARGET_' is deprecated and besides, it is being accessed to early. Consider '_2_STAGE_TARGETS' or '_2_INST_TARGETS'.)1583 1584 # INSTARGET_ later.1585 # PATH_*1586 local outbase := $(call TARGET_BASE,$(target),$(target))1587 $(target)_0_OUTDIR := $(patsubst %/,%,$(dir $(outbase)))1588 $(call KB_FN_ASSIGN_DEPRECATED,PATH_$(target),$($(target)_0_OUTDIR), $(target)_0_OUTDIR)1589 endef # def_pass1_install1590 $(eval-opt-var def_pass1_install)1591 1592 $(foreach target, $(_ALL_INSTALLS), \1593 $(evalval def_pass1_install))1594 1595 ifdef KBUILD_PROFILE_SELF1596 $(evalcall def_profile_self, done pass 1)1597 endif1598 1599 1600 1601 1602 #1603 #1604 # Target lists - Pass 21605 #1606 #1607 1608 1609 ## @page pg_fetches Fetching Tools, Sources and Similar.1610 #1611 # The targets listed in the the FETCHES target list have the following attributes:1612 # SOURCES1613 # INST1614 # FETCHTOOL1615 # FETCHFLAGS1616 # FETCHDIR1617 # UNPACKTOOL1618 # UNPACKFLAGS1619 #1620 # As usual the target name is an alias for 'creating' the target. Other1621 # aliases are:1622 # pass_fetches1623 # fetch1624 # unfetch1625 # download1626 # unpack1627 #1628 # @remark1629 #1630 # This is a little bit complex because we must guarantee that if a source file1631 # changes only sligtly we must refetch it and to a proper unpacking of it. It1632 # is also a desire that fetched archives and unpacked files can be deleted to1633 # save space.1634 #1635 # Thus, we must be able to cleanup what we've unpacked should any of the1636 # sources be removed. We do this by maintaining a file listing the files1637 # and directories that was unpacked. This operation is named 'unfetch'.1638 #1639 # We make use of the SIZE and MD5 attributes for each of the sources to1640 # create a digest that is stored in the primary target file. Subsequent1641 # runswill compare their digest with it to decide if a refetch is required.1642 # When a refetch is found necessary, an 'unfetch' is performed first to1643 # clean out old files and directores. Note even changes in source order1644 # will cause a refetch due to the way the digest is constructed and1645 # evaluated.1646 #1647 # By not depending directly on the archives (nor on any unpacked files)1648 # but on a goal made up from the archive name, size and md5, we allow1649 # the user to delete the archives. Naturally, this means we'll have to1650 # check and fetch missing archives before attempting to unpack them.1651 #1652 # @remark1653 #1654 # This feature will *NOT* work correctly with vanilla GNU make becuase1655 # it makes use of includedep to avoid too many unnecessary files.1656 #1657 # @todo1658 # 0. Move the fetches out into a unit.1659 # 1. Download corruption / continuation.1660 # 2. It's quite possible that there is one too many indirect dependency now...1661 #1662 1663 ## generates the fetch rule1664 define def_fetch_src_fetch_rule1665 # Indirect goal for downloading something.1666 .PRECIOUS: $(out)1667 $(out) + $($(target)_$(srcname)_FETCH_2_OUTPUT) +| $($(target)_$(srcname)_FETCH_2_OUTPUT_MAYBE) : \1668 | $($(target)_$(srcname)_FETCH_2_DEPORD)1669 %$$(call MSG_FETCH_DL,$(target),$(source),$(out))1670 @## @todo do fancy stuff like download continuation.1671 $$(QUIET)$$(RM) -f -- $(out)1672 $(cmds)1673 $$(QUIET)$(if $(md5),$$(MD5SUM_EXT) -b -C $(md5) $(out))1674 1675 1676 1677 # Intermediate goal for making sure the md5 and size matches. it will (re) fetch the archive if necessary.1678 $(out).checked_$(md5)_$(size): $($(target)_$(srcname)_FETCH_2_DEPEND) | $($(target)_$(srcname)_FETCH_2_DEPORD)1679 %$$(call MSG_FETCH_CHK,$(target),$(source),$(out))1680 $$(QUIET)$$(RM) -f -- $$@1681 @# (re)fetch the file if it doesn't exist or if it doesn't matches the md5.1682 @## @todo do fancy stuff like download continuation.1683 $$(QUIET)( test -f $(out) && $(if $(md5),$$(MD5SUM_EXT) -b -C $(md5) $(out), true) ) \1684 || ( $$(RM_EXT) -f $(out) \1685 && $$(MAKE) $(out) -f $(MAKEFILE) --no-print-directory )1686 $$(QUIET2)$$(APPEND) $$@1687 1688 _TARGET_$(target)_FETCHED += $(out) $(out).checked_$(md5)_$(size)1689 1690 # Just a little precaution.1691 .NOTPARALLEL: $(out) $(out).checked_$(md5)_$(size)1692 1693 endef # def_fetch_src_fetch_rule1694 $(eval-opt-var def_fetch_src_fetch_rule)1695 1696 ## generates the unpack rule1697 define def_fetch_src_unpack_rule1698 # This is the unpack rule. it has an order-only dependency on the download check.1699 $(out) + $($(target)_$(srcname)_UNPACK_2_OUTPUT) +| $($(target)_$(srcname)_UNPACK_2_OUTPUT_MAYBE) : \1700 $($(target)_$(srcname)_UNPACK_2_DEPEND) \1701 | $($(target)_$(srcname)_UNPACK_2_DEPORD) \1702 $(archive).checked_$(md5)_$(size) \1703 $(dir $(out))1704 %$$(call MSG_FETCH_UP,$(target),$(archive),$(inst))1705 $$(QUIET)$$(RM) -f -- $(out)1706 $$(QUIET)$$(MKDIR) -p -- $(dir $(out))1707 @# if the source archive doesn't exist fetch it (may have been deleted to save space).1708 $$(QUIET)test -f $(archive) \1709 || ( $$(RM_EXT) -f $(archive).checked_$(md5)_$(size) \1710 && $$(MAKE) $(archive).checked_$(md5)_$(size) -f $(MAKEFILE) --no-print-directory )1711 $(cmds)1712 $$(QUIET2)$$(APPEND) $(out) $(notdir $(archive).checked_$(md5)_$(size))1713 $$(QUIET2)$$(APPEND) $(out) $(notdir $(out))1714 1715 $(eval _TARGET_$(target)_UNPACKED += $(out))1716 _TARGET_$(target)_DIGEST := $(_TARGET_$(target)_DIGEST)-$(srcname)_$(md5)_$(size)1717 1718 .NOTPARALLEL: $(out)1719 1720 endef # def_fetch_src_unpack_rule1721 $(eval-opt-var def_fetch_src_unpack_rule)1722 1723 ## Processes a fetch source1724 #1725 define def_fetch_src1726 #$ (warning dbg: def_fetch_src: source='$(source)' target='$(target)')1727 1728 # common1729 local srcname := $(notdir $(source))1730 local inst := $(firstword \1731 $($(target)_$(source)_INST)\1732 $($(target)_$(srcname)_INST)\1733 $($(source)_INST)\1734 $($(srcname)_INST)\1735 $($(target)_INST)\1736 )1737 ifneq ($(patsubst %/,ok,$(inst)),ok)1738 $(error kBuild: Bad or missing INST property for source '$(source)' in target '$(target)': $(inst))1739 endif1740 ## @todo Install-revamp: FIXME1741 INSTARGET_$(target)_$(srcname) := $(inst)1742 local fetchdir := $(firstword \1743 $($(target)_$(source)_FETCHDIR)\1744 $($(target)_$(srcname)_FETCHDIR)\1745 $($(source)_FETCHDIR)\1746 $($(srcname)_FETCHDIR)\1747 $($(target)_FETCHDIR)\1748 $(FETCHDIR)\1749 $(PATH_TARGET)\1750 )1751 local deps := \1752 $($(target)_$(source)_DEPS)\1753 $($(target)_$(srcname)_DEPS)\1754 $($(source)_DEPS)\1755 $($(srcname)_DEPS)\1756 $($(target)_DEPS)1757 local orderdeps := \1758 $($(target)_$(source)_ORDERDEPS)\1759 $($(target)_$(srcname)_ORDERDEPS)\1760 $($(source)_ORDERDEPS)\1761 $($(srcname)_ORDERDEPS)\1762 $($(target)_ORDERDEPS)1763 local md5 := $(firstword \1764 $($(target)_$(source)_MD5)\1765 $($(target)_$(srcname)_MD5)\1766 $($(source)_MD5)\1767 $($(srcname)_MD5)\1768 $($(target)_MD5)\1769 )1770 local size := $(firstword \1771 $($(target)_$(source)_SIZE)\1772 $($(target)_$(srcname)_SIZE)\1773 $($(source)_SIZE)\1774 $($(srcname)_SIZE)\1775 $($(target)_SIZE)\1776 )1777 clean_files += \1778 $($(target)_$(source)_CLEAN)\1779 $($(target)_$(srcname)_CLEAN)\1780 $($(source)_CLEAN)\1781 $($(srcname)_CLEAN)1782 local dep := # not legal for fetch and unpack tools1783 1784 1785 #1786 # The fetching.1787 #1788 local out := $(fetchdir)/$(srcname)1789 local archive := $(out)1790 $(target)_$(srcname)_1_TARGET = $(TARGET_$(target)_$(srcname))1791 $(call KB_FN_ASSIGN_DEPRECATED,TARGET_$(target)_$(srcname),$(TARGET_$(target)_$(srcname)),TARGET_$(target)_$(srcname))1792 1793 local dirdep := $(call DIRDEP,$(fetchdir))1794 local tool := $(firstword \1795 $($(target)_$(source)_FETCHTOOL)\1796 $($(target)_$(srcname)_FETCHTOOL)\1797 $($(target)_$(source)_TOOL)\1798 $($(target)_$(srcname)_TOOL)\1799 $($(source)_FETCHTOOL)\1800 $($(srcname)_FETCHTOOL)\1801 $($(source)_TOOL)\1802 $($(srcname)_TOOL)\1803 $($(target)_FETCHTOOL)\1804 $($(target)_TOOL)\1805 )1806 local flags :=\1807 $(TOOL_$(tool)_FETCHFLAGS)\1808 $(FETCHFLAGS)\1809 $($(target)_FETCHFLAGS)\1810 $($(srcname)_FETCHFLAGS)\1811 $($(source)_FETCHFLAGS)\1812 $($(target)_$(srcname)_FETCHFLAGS)\1813 $($(target)_$(source)_FETCHFLAGS)1814 1815 #$ (warning dbg: target=$(target) source=$(source) $(srcname)=$(srcname) tool=$(tool) out=$(out) flags=$(flags) dirdep=$(dirdep) fetchdir=$(fetchdir) md5=$(md5) size=$(size))1816 1817 ifndef TOOL_$(tool)_FETCH_CMDS1818 $(warning kBuild: tools: \1819 1 $($(target)_$(source)_FETCHTOOL)\1820 2 $($(target)_$(srcname)_FETCHTOOL)\1821 3 $($(target)_$(source)_TOOL)\1822 4 $($(target)_$(srcname)_TOOL)\1823 5 $($(source)_FETCHTOOL)\1824 6 $($(srcname)_FETCHTOOL)\1825 7 $($(source)_TOOL)\1826 8 $($(srcname)_TOOL)\1827 9 $($(target)_FETCHTOOL)\1828 10 $($(target)_TOOL) )1829 $(error kBuild: TOOL_$(tool)_FETCH_CMDS is not defined. source=$(source) target=$(target) )1830 endif1831 1832 # call the tool1833 local cmds := $(TOOL_$(tool)_FETCH_CMDS)1834 $(target)_$(srcname)_FETCH_2_OUTPUT := $(TOOL_$(tool)_FETCH_OUTPUT)1835 $(target)_$(srcname)_FETCH_2_OUTPUT_MAYBE := $(TOOL_$(tool)_FETCH_OUTPUT_MAYBE)1836 $(target)_$(srcname)_FETCH_2_DEPEND := $(TOOL_$(tool)_FETCH_DEPEND) $(deps)1837 $(target)_$(srcname)_FETCH_2_DEPORD := $(TOOL_$(tool)_FETCH_DEPORD) $(dirdep) $(orderdeps)1838 1839 # generate the fetch rule.1840 $(eval $(def_fetch_src_fetch_rule))1841 1842 1843 #1844 # The unpacking / installing.1845 #1846 local out := $(inst)_kBuild_$(target)_$(srcname)_unpacked.lst1847 local dirdep := $(call DIRDEP,$(inst))1848 local tool := $(firstword \1849 $($(target)_$(source)_UNPACKTOOL)\1850 $($(target)_$(srcname)_UNPACKTOOL)\1851 $($(target)_$(source)_TOOL)\1852 $($(target)_$(srcname)_TOOL)\1853 $($(source)_UNPACKTOOL)\1854 $($(srcname)_UNPACKTOOL)\1855 $($(source)_TOOL)\1856 $($(srcname)_TOOL)\1857 $($(target)_UNPACKTOOL)\1858 $($(target)_TOOL) \1859 )1860 ifeq ($(tool),)1861 local tool := $(toupper $(subst .,,$(suffix $(subst tar.,TAR,$(srcname)))))1862 $(evalval def_tools_include)1863 endif1864 local flags :=\1865 $(TOOL_$(tool)_UNPACKFLAGS)\1866 $(UNPACKFLAGS)\1867 $($(target)_UNPACKFLAGS)\1868 $($(srcname)_UNPACKFLAGS)\1869 $($(source)_UNPACKFLAGS)\1870 $($(target)_$(srcname)_UNPACKFLAGS)\1871 $($(target)_$(source)_UNPACKFLAGS)1872 1873 #$ (warning dbg: target=$(target) source=$(source) $(srcname)=$(srcname) tool=$(tool) out=$(out) flags=$(flags) dirdep=$(dirdep) inst=$(inst) md5=$(md5) size=$(size))1874 ifndef TOOL_$(tool)_UNPACK_CMDS1875 $(warning kBuild: tools: \1876 1 $($(target)_$(source)_UNPACKTOOL)\1877 2 $($(target)_$(srcname)_UNPACKTOOL)\1878 3 $($(target)_$(source)_TOOL)\1879 4 $($(target)_$(srcname)_TOOL)\1880 5 $($(source)_UNPACKTOOL)\1881 6 $($(srcname)_UNPACKTOOL)\1882 7 $($(source)_TOOL)\1883 8 $($(srcname)_TOOL)\1884 9 $($(target)_UNPACKTOOL)\1885 10 $($(target)_TOOL) \1886 11 $(toupper $(subst tar.,TAR,$(ext $(srcname)))) \1887 )1888 $(error kBuild: TOOL_$(tool)_UNPACK_CMDS is not defined. source=$(source) target=$(target) )1889 endif1890 1891 # call the tool1892 local cmds := $(TOOL_$(tool)_UNPACK_CMDS)1893 $(target)_$(srcname)_UNPACK_2_OUTPUT := $(TOOL_$(tool)_UNPACK_OUTPUT)1894 $(target)_$(srcname)_UNPACK_2_OUTPUT_MAYBE := $(TOOL_$(tool)_UNPACK_OUTPUT_MAYBE)1895 $(target)_$(srcname)_UNPACK_2_DEPEND := $(TOOL_$(tool)_UNPACK_DEPEND) $(deps)1896 $(target)_$(srcname)_UNPACK_2_DEPORD := $(TOOL_$(tool)_UNPACK_DEPORD) $(dirdep) $(orderdeps)1897 1898 # generate the fetch rule.1899 $(eval $(def_fetch_src_unpack_rule))1900 1901 _DIRS += $(inst) $(fetchdir)1902 1903 endef # def_fetch_src1904 $(eval-opt-var def_fetch_src)1905 1906 1907 ##1908 # Define the target level rules for a fetch.1909 # @param target1910 # @param out1911 # @param inst1912 # @param _TARGET_$(target)_UNPACKED1913 # @param _TARGET_$(target)_DIGEST1914 # @param bld_trg1915 # @param bld_trg_arch1916 define def_fetch_rules1917 1918 $(out).lst: $(_TARGET_$(target)_UNPACKED) | $(call DIRDEP,$(inst))1919 %$$(call MSG_FETCH_OK,$(target))1920 $$(QUIET)$$(RM) -f -- $$@ $$@.tmp1921 $$(QUIET2)$$(APPEND) $$@.tmp '$(notdir $(out))'1922 $$(QUIET)$(if $(_TARGET_$(target)_UNPACKED),$$(CAT_EXT) $(_TARGET_$(target)_UNPACKED) >> $$@.tmp)1923 $$(QUIET)$$(MV) -f -- $$@.tmp $$@1924 1925 $(out)_unfetched:1926 %$$(call MSG_UNFETCH,$(target))1927 $$(QUIET)$$(RM) -f -- $$(addprefix $(inst),$$(shell $$(CAT_EXT) $(out).lst 2> /dev/null | $$(SED) -e '/\/$$$$/d'))1928 $$(QUIET)$$(RMDIR) -p --ignore-fail-on-non-empty --ignore-fail-on-not-exist -- $$(dir $$@) \1929 $$(addprefix $(inst),$$(sort $$(dir $$(shell $$(CAT_EXT) $(out).lst 2> /dev/null))))1930 $$(QUIET)$$(RM) -f -- $(out).lst $(out)1931 $$(QUIET)$$(RMDIR) -p --ignore-fail-on-non-empty --ignore-fail-on-not-exist -- $$(dir $$@)1932 1933 $(out): $(comp-vars _TARGET_$(target)_DIGEST_PREV,_TARGET_$(target)_DIGEST,FORCE) | $(call DIRDEP,$(inst))1934 $$(QUIET)$$(RM) -f -- $$@1935 %$$(if $$(_TARGET_$(target)_DIGEST),$$(if $$(eq $$(file-size $(out).lst),-1)\1936 ,$$(call MSG_REFETCH,$(target)),$$(call MSG_FETCH,$(target))),$$(call MSG_UNFETCH,$(target)))1937 $$(QUIET)$(TEST_EXT) -f $(out).lst -- $$(MAKE) -f $(MAKEFILE) --no-print-directory $(out)_unfetched1938 $$(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 $$@))1939 $$(QUIET2)$$(if $$(_TARGET_$(target)_DIGEST),$$(APPEND) $$@ "_TARGET_$(target)_DIGEST_PREV := $(_TARGET_$(target)_DIGEST)")1940 1941 .NOTPARALLEL: $(out).lst $(out)_unfetched $(out)1942 1943 endef1944 1945 1946 ##1947 # Deal with one fetch target.1948 # @param target1949 # @param bld_trg1950 # @param bld_trg_arch1951 define def_fetch1952 # common1953 ## @todo Install-revamp: FIXME1954 INSTARGET_$(target) := $($(target)_INST)1955 ifneq ($(patsubst %/,ok,$(INSTARGET_$(target))),ok)1956 $(error kBuild: Bad or missing INST property for target '$(target)'. \1957 $(target)_INST='$($(target)_INST)' ($(origin $(target)_INST)))1958 endif1959 _TARGET_$(target)_FETCHED :=1960 _TARGET_$(target)_UNPACKED :=1961 _TARGET_$(target)_DIGEST :=1962 local clean_files := $($(target)_CLEAN) $($(target)_CLEAN.$(bld_trg)) $($(target)_CLEAN.$(bld_trg).$(bld_trg_arch)) $($(target)_CLEAN.$(bld_trg_arch)) $($(target)_CLEAN.$(KBUILD_TYPE))1963 1964 # The 'sources'.1965 #$ (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)))1966 $(foreach source,$($(target)_SOURCES) $($(target)_SOURCES.$(KBUILD_TYPE)) $($(target)_SOURCES.$(bld_trg)) $($(target)_SOURCES.$(bld_trg_arch)) $($(target)_SOURCES.$(bld_trg).$(bld_trg_arch)),\1967 $(evalval def_fetch_src))1968 1969 # The target.1970 local inst := $(INSTARGET_$(target))1971 local out := $(inst)_kBuild_fetch_$(target)1972 1973 $(eval includedep $(out))1974 1975 $(eval $(def_fetch_rules))1976 1977 # Define the aliases here (doesn't work if defined in def_fetch_rules, just like includedep).1978 $(target): $(out)1979 $(target)_unfetch: $(out)_unfetched1980 1981 _FETCHES += $(out)1982 _DOWNLOADS += $(_TARGET_$(target)_FETCHED)1983 _UNPACKS += $(_TARGET_$(target)_UNPACKED)1984 _UNFETCHES += $(out)_unfetched1985 _DIRS += $(inst)1986 _CLEAN_FILES += $(clean_files)1987 1988 endef1989 $(eval-opt-var def_fetch)1990 1991 # Walk the FETCH target lists.1992 bld_trg := $(KBUILD_TARGET)1993 bld_trg_arch := $(KBUILD_TARGET_ARCH)1994 $(foreach target, $(_ALL_FETCHES), \1995 $(evalvalctx def_fetch))1996 1997 # some aliases.1998 download: $(_DOWNLOADS)1999 unpack: $(_UNPACKS)2000 fetch: $(_FETCHES)2001 unfetch: $(_UNFETCHES)2002 2003 ifdef KBUILD_PROFILE_SELF2004 $(evalcall def_profile_self, done fetching targets)2005 endif2006 2007 2008 2009 ##2010 ## Patching.2011 ##2012 ##2013 #define def_patch_src2014 #2015 #endef2016 #2017 #2018 ## Deal with one patch target.2019 #define def_patch2020 #2021 #$(foreach source,$($(target)_SOURCES) $($(target)_SOURCES.$(KBUILD_TYPE)) $($(target)_SOURCES.$(KBUILD_TARGET)) $($(target)_SOURCES.$(KBUILD_TARGET_ARCH)) $($(target)_SOURCES.$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)),\2022 # $(evalval def_patch_src))2023 #2024 #_PATCHES +=2025 #endef2026 #2027 #$(foreach target, $(_ALL_PATCHES), \2028 # $(evalval def_patch))2029 32 # 2030 33 … … 2992 995 endif 2993 996 2994 2995 #2996 # OTHERS2997 #2998 _OTHERS = $(OTHERS) $(OTHERS.$(KBUILD_TARGET)) $(OTHERS.$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH))2999 3000 3001 #3002 # INSTALLS3003 #3004 3005 ##3006 # Generate the staging rules.3007 #3008 define def_install_src_rule_staging3009 $(stagedst) : $(srcsrc) | $(dir $(stagedst))3010 %$$(call MSG_INST_FILE,$(srcsrc),$(stagedst))3011 $$(QUIET)$(stagecmd)3012 endef3013 $(eval-opt-var def_install_src_rule_staging)3014 3015 define def_install_src_rule_installing3016 $(instdst) : $(srcsrc) | $(dir $(instdst))3017 %$$(call MSG_INST_FILE,$(srcsrc),$(instdst))3018 $$(QUIET)$(instcmd)3019 endef3020 $(eval-opt-var def_install_src_rule_installing)3021 3022 ##3023 # Install one file.3024 #3025 define def_install_src3026 3027 # deal with '=>' in the source file name.3028 ifeq ($(src),=>)3029 $(error kBuild: Install target '$(target)' has a bad source specifier containing '=>' without any file names)3030 endif3031 ifeq ($(substr $(src),1,2),=>)3032 $(warning kBuild: Install target '$(target)' has a bad source specifier: $(src))3033 endif3034 ifeq ($(substr $(src),-2),=>)3035 $(warning kBuild: Install target '$(target)' has a bad source specifier: $(src))3036 endif3037 local srcdst := $(subst =>, ,$(src))3038 local srcsrc := $(firstword $(srcdst))3039 local srcdstdir := $(dir $(word 2,$(srcdst)))3040 local srcdst := $(word $(words $(srcdst)),$(srcdst))3041 3042 # instfun, mode, uid and gid.3043 ifdef $(srcsrc)_INSTFUN3044 local instfun := $(srcsrc)_INSTFUN3045 else3046 local instfun := $(top_instfun)3047 endif3048 local mode := $(firstword \3049 $($(target)_$(srcsrc)$(source_type_prefix)_MODE.$(bld_trg).$(bld_trg_arch)) \3050 $($(target)_$(srcsrc)$(source_type_prefix)_MODE.$(bld_trg)) \3051 $($(target)_$(srcsrc)$(source_type_prefix)_MODE) \3052 $($(target)_$(srcdst)$(source_type_prefix)_MODE.$(bld_trg).$(bld_trg_arch)) \3053 $($(target)_$(srcdst)$(source_type_prefix)_MODE.$(bld_trg)) \3054 $($(target)_$(srcdst)$(source_type_prefix)_MODE) \3055 $($(srcsrc)$(source_type_prefix)_MODE.$(bld_trg).$(bld_trg_arch)) \3056 $($(srcsrc)$(source_type_prefix)_MODE.$(bld_trg)) \3057 $($(srcsrc)$(source_type_prefix)_MODE) \3058 $($(srcdst)$(source_type_prefix)_MODE.$(bld_trg).$(bld_trg_arch)) \3059 $($(srcdst)$(source_type_prefix)_MODE.$(bld_trg)) \3060 $($(srcdst)$(source_type_prefix)_MODE) \3061 $(source_type_mode))3062 local uid := $(firstword \3063 $($(target)_$(srcsrc)_UID.$(bld_trg).$(bld_trg_arch)) \3064 $($(target)_$(srcsrc)_UID.$(bld_trg)) \3065 $($(target)_$(srcsrc)_UID) \3066 $($(target)_$(srcdst)_UID.$(bld_trg).$(bld_trg_arch)) \3067 $($(target)_$(srcdst)_UID.$(bld_trg)) \3068 $($(target)_$(srcdst)_UID) \3069 $($(srcsrc)_UID.$(bld_trg).$(bld_trg_arch)) \3070 $($(srcsrc)_UID.$(bld_trg)) \3071 $($(srcsrc)_UID) \3072 $($(srcdst)_UID.$(bld_trg).$(bld_trg_arch)) \3073 $($(srcdst)_UID.$(bld_trg)) \3074 $($(srcdst)_UID) \3075 $(top_uid))3076 local gid := $(firstword \3077 $($(target)_$(srcsrc)_GID.$(bld_trg).$(bld_trg_arch)) \3078 $($(target)_$(srcsrc)_GID.$(bld_trg)) \3079 $($(target)_$(srcsrc)_GID) \3080 $($(target)_$(srcdst)_GID.$(bld_trg).$(bld_trg_arch)) \3081 $($(target)_$(srcdst)_GID.$(bld_trg)) \3082 $($(target)_$(srcdst)_GID) \3083 $($(srcsrc)_GID.$(bld_trg).$(bld_trg_arch)) \3084 $($(srcsrc)_GID.$(bld_trg)) \3085 $($(srcsrc)_GID) \3086 $($(srcdst)_GID.$(bld_trg).$(bld_trg_arch)) \3087 $($(srcdst)_GID.$(bld_trg)) \3088 $($(srcdst)_GID) \3089 $(top_gid))3090 local flags := \3091 $(top_ifflags) \3092 $($(srcdst)$(source_type_prefix)_IFFLAGS) \3093 $($(srcdst)$(source_type_prefix)_IFFLAGS.$(bld_trg)) \3094 $($(srcdst)$(source_type_prefix)_IFFLAGS.$(bld_trg).$(bld_trg_arch)) \3095 $($(srcsrc)$(source_type_prefix)_IFFLAGS) \3096 $($(srcsrc)$(source_type_prefix)_IFFLAGS.$(bld_trg)) \3097 $($(srcsrc)$(source_type_prefix)_IFFLAGS.$(bld_trg).$(bld_trg_arch)) \3098 $($(target)_$(srcdst)$(source_type_prefix)_IFFLAGS) \3099 $($(target)_$(srcdst)$(source_type_prefix)_IFFLAGS.$(bld_trg)) \3100 $($(target)_$(srcdst)$(source_type_prefix)_IFFLAGS.$(bld_trg).$(bld_trg_arch)) \3101 $($(target)_$(srcsrc)$(source_type_prefix)_IFFLAGS) \3102 $($(target)_$(srcsrc)$(source_type_prefix)_IFFLAGS.$(bld_trg)) \3103 $($(target)_$(srcsrc)$(source_type_prefix)_IFFLAGS.$(bld_trg).$(bld_trg_arch))3104 clean_files += \3105 $($(srcdst)_CLEAN) \3106 $($(srcdst)_CLEAN.$(bld_trg)) \3107 $($(srcdst)_CLEAN.$(bld_trg).$(bld_trg_arch)) \3108 $($(srcsrc)_CLEAN) \3109 $($(srcsrc)_CLEAN.$(bld_trg)) \3110 $($(srcsrc)_CLEAN.$(bld_trg).$(bld_trg_arch)) \3111 $($(target)_$(srcdst)_CLEAN) \3112 $($(target)_$(srcdst)_CLEAN.$(bld_trg)) \3113 $($(target)_$(srcdst)_CLEAN.$(bld_trg).$(bld_trg_arch)) \3114 $($(target)_$(srcsrc)_CLEAN) \3115 $($(target)_$(srcsrc)_CLEAN.$(bld_trg)) \3116 $($(target)_$(srcsrc)_CLEAN.$(bld_trg).$(bld_trg_arch))3117 3118 3119 # Adjust the source if we got a default PATH. (This must be done this late!)3120 ifdef $(target)_DEFPATH3121 local defpath := $($(target)_DEFPATH)3122 else ifdef $(target)_PATH3123 local defpath := $($(target)_PATH)3124 else3125 local defpath :=3126 endif3127 ifneq ($(defpath),)3128 local srcsrc := $(abspathex $(srcsrc),$(defpath))3129 endif3130 3131 # Generate the staging rule (requires double evaluation).3132 local stage := $(strip $(firstdefined $(srcsrc)_STAGE $(srcsrc)_INST $(target)_1_STAGE,value))3133 if "$(substr $(stage),-1)" != "/" && "$(stage)" != ""3134 $(warning kBuild: File $(srcsrc) in install target $(target) has a STAGE/INST property without a trailing slash: '$(stage)')3135 local stage := $(stage)/3136 endif3137 local stage := $(stage)$(dir $(srcdstdir))3138 ifeq ($(root $(stage)),)3139 local stagedst := $(call $(instfun),$(srcdst),$(target),$(stage),$(PATH_STAGE))3140 else3141 local stage := $(abspath $(stage))/3142 ifeq ($(pos $(PATH_OBJ),$(stage)),1)3143 local stage := $(substr $(stage), $(expr $(length-var PATH_OBJ) + 2))3144 local stagedst := $(call $(instfun),$(srcdst),$(target),$(stage),$(PATH_OBJ))3145 else3146 $(error kBuild: File $(srcsrc) in install target $(target) has a STAGE/INST property with an absolute path outside PATH_OBJ: '$(stage)')3147 endif3148 endif3149 ifdef $(srcsrc)_INSTALLER3150 local stagecmd := $(call $(srcsrc)_INSTALLER,$(srcsrc),$(stagedst),$(target),$(flags),stage)3151 else ifdef $(target)_INSTALLER3152 local stagecmd := $(call $(target)_INSTALLER,$(srcsrc),$(stagedst),$(target),$(flags),stage)3153 else3154 local stagecmd := $$(INSTALL_STAGING)\3155 $(if $(uid),-o $(uid))\3156 $(if $(gid),-g $(gid))\3157 $(if $(mode),-m $(mode))\3158 $(flags) -- \3159 $(srcsrc) $(stagedst)3160 endif3161 $(eval $(def_install_src_rule_staging))3162 $(target)_2_STAGE_TARGETS += $(stagedst)3163 3164 # Generate the install rule3165 ifeq ($(insttype),both)3166 local inst := $(strip $(firstdefined $(srcsrc)_INST $(target)_1_INST,value))3167 if "$(substr $(inst),-1)" != "/" && "$(inst)" != ""3168 $(warning kBuild: File $(srcsrc) in install target $(target) has a INST property without a trailing slash: '$(inst)')3169 local inst := $(inst)/3170 endif3171 local inst := $(inst)$(dir $(srcdstdir))3172 ifneq ($(root $(inst)),)3173 $(error kBuild: File $(srcsrc) in install target $(target) has a INST property with an absolute path: '$(inst)')3174 endif3175 local instdst := $(call $(instfun),$(srcdst),$(target),$(inst),$(PATH_INS))3176 3177 ifdef $(srcsrc)_INSTALLER3178 local instcmd := $(call $(srcsrc)_INSTALLER,$(srcsrc),$(instdst),$(target),$(flags),install)3179 else ifdef $(target)_INSTALLER3180 local instcmd := $(call $(target)_INSTALLER,$(srcsrc),$(instdst),$(target),$(flags),install)3181 else3182 local instcmd := $$(INSTALL)\3183 $(if $(uid),-o $(uid))\3184 $(if $(gid),-g $(gid))\3185 $(if $(mode),-m $(mode))\3186 $(flags) -- \3187 $(srcsrc) $(instdst)3188 endif3189 $(eval $(def_install_src_rule_installing))3190 $(target)_2_INST_TARGETS += $(instdst)3191 endif3192 3193 #$(warning instfun=$(instfun) srcdst=$(srcdst) target=$(target) inst=$(inst) => instdst=$(instdst); stage=$(stage) => stagedst=$(stagedst))3194 endef # def_install_src3195 $(eval-opt-var def_install_src)3196 3197 3198 ##3199 # Generate the symlink rules.3200 #3201 define def_install_symlink_rule_staging3202 $(stagedst) : | $(dir $(stagedst))3203 %$$(call MSG_INST_SYM,$(stagedst),$(symdst))3204 $$(QUIET)$$(RM) -f -- $$@3205 $$(QUIET)$$(LN_SYMLINK) $(symdst) $(stagedst)3206 endef3207 $(eval-opt-var def_install_symlink_rule_staging)3208 3209 define def_install_symlink_rule_installing3210 $(instdst) : | $(dir $(instdst))3211 %$$(call MSG_INST_SYM,$(instdst),$(symdst))3212 $$(QUIET)$$(RM) -f -- $$@3213 $$(QUIET)$$(LN_SYMLINK) $(symdst) $(instdst)3214 endef3215 $(eval-opt-var def_install_symlink_rule_installing)3216 3217 3218 ##3219 # Create one symlink.3220 #3221 define def_install_symlink3222 3223 # deal with '=>' in the source file name.3224 local symdst := $(subst =>, ,$(src))3225 local symlnk := $(firstword $(symdst))3226 local symdst := $(word $(words $(symdst)),$(symdst))3227 3228 # Figure which install function to use below.3229 ifdef $(symlnk)_INSTFUN3230 local instfun := $(symlnk)_INSTFUN3231 else3232 local instfun := $(top_instfun)3233 endif3234 3235 # Calc stage destination and generate the rule (requires double evaluation).3236 local stage := $(strip $(firstdefined $(symlnk)_STAGE $(symlnk)_INST $(target)_1_STAGE,value))3237 if "$(substr $(stage),-1)" != "/" && "$(stage)" != ""3238 $(warning kBuild: Symlink $(symlnk) in install target $(target) has a STAGE/INST property without a trailing slash: '$(stage)')3239 local stage := $(stage)/3240 endif3241 local stage := $(stage)$(dir $(srcdstdir))3242 ifeq ($(root $(stage)),)3243 local stagedst := $(call $(instfun),$(symlnk),$(target),$(stage),$(PATH_STAGE))3244 else3245 local stage := $(abspath $(stage))/3246 ifeq ($(pos $(PATH_OBJ),$(stage)),1)3247 local stage := $(substr $(stage), $(expr $(length-var PATH_OBJ) + 2))3248 local stagedst := $(call $(instfun),$(symlnk),$(target),$(stage),$(PATH_OBJ))3249 else3250 $(error kBuild: Symlink $(symlnk) in install target $(target) has a STAGE/INST property with an absolute path outside PATH_OBJ: '$(stage)')3251 endif3252 endif3253 3254 $(eval $(def_install_symlink_rule_staging))3255 $(target)_2_STAGE_TARGETS += $(stagedst)3256 3257 # Calcuate the install destiation and generate the rule (if necessary).3258 ifeq ($(instmode),both)3259 local inst := $(strip $(firstdefined $(symlnk)_INST $(target)_1_INST,value))3260 if "$(substr $(inst),-1)" != "/" && "$(inst)" != ""3261 $(warning kBuild: Symlink $(symlnk) in install target $(target) has a INST property without a trailing slash: '$(inst)')3262 local inst := $(inst)/3263 endif3264 ifneq ($(root $(inst)),)3265 $(error kBuild: Symlink $(symlnk) in install target $(target) has a INST property with an absolute path: '$(inst)')3266 endif3267 local inst := $(inst)$(dir $(srcdstdir))3268 local instdst := $(call $(instfun),$(symlnk),$(target),$(inst),$(PATH_INS))3269 $(eval $(def_install_symlink_rule_installing))3270 $(target)_2_INST_TARGETS += $(instdst)3271 endif3272 3273 #$(warning symlnk=$(symlnk) symdst=$(symdst) instdst=$(instdst) stagedst=$(stagedst) instfun=$(instfun) inst=$(inst) stage='$(stage)')3274 endef # def_install_symlink3275 $(optmize def_install_symlink)3276 3277 3278 ##3279 # Generate an directory installtion rule.3280 # Note. Used both for staging and real install rules.3281 #3282 define def_install_directory_rule3283 # the install rule3284 $(insdst):3285 %$$(call MSG_INST_DIR,$(insdst))3286 $$(QUIET)$$(INSTALL) -d \3287 $(if $(uid),-o $(uid))\3288 $(if $(gid),-g $(gid))\3289 $(if $(mode),-m $(mode))\3290 $(flags) -- \3291 $(insdst)3292 3293 .NOTPARALLEL: $(insdst)3294 endef # def_install_directory_rule3295 $(eval-opt-var def_install_directory_rule)3296 3297 ##3298 # Create one directory.3299 #3300 define def_install_directory3301 3302 # gather common properties.3303 local mode := $(firstword \3304 $($(target)_$(directory)_MODE.$(bld_trg).$(bld_trg_arch)) \3305 $($(target)_$(directory)_MODE.$(bld_trg)) \3306 $($(target)_$(directory)_MODE) \3307 $($(directory)_MODE.$(bld_trg).$(bld_trg_arch)) \3308 $($(directory)_MODE.$(bld_trg)) \3309 $($(directory)_MODE) \3310 $(top_mode) )3311 local uid := $(firstword \3312 $($(target)_$(directory)_UID.$(bld_trg).$(bld_trg_arch)) \3313 $($(target)_$(directory)_UID.$(bld_trg)) \3314 $($(target)_$(directory)_UID) \3315 $($(directory)_UID.$(bld_trg).$(bld_trg_arch)) \3316 $($(directory)_UID.$(bld_trg)) \3317 $($(directory)_UID) \3318 $(top_uid) )3319 local gid := $(firstword \3320 $($(target)_$(directory)_GID.$(bld_trg).$(bld_trg_arch)) \3321 $($(target)_$(directory)_GID.$(bld_trg)) \3322 $($(target)_$(directory)_GID) \3323 $($(directory)_GID.$(bld_trg).$(bld_trg_arch)) \3324 $($(directory)_GID.$(bld_trg)) \3325 $($(directory)_GID) \3326 $(top_gid) )3327 local flags := \3328 $(top_idflags) \3329 $($(directory)_IDFLAGS) \3330 $($(directory)_IDFLAGS.$(bld_trg)) \3331 $($(directory)_IDFLAGS.$(bld_trg).$(bld_trg_arch)) \3332 $($(target)_$(directory)_IDFLAGS) \3333 $($(target)_$(directory)_IDFLAGS.$(bld_trg)) \3334 $($(target)_$(directory)_IDFLAGS.$(bld_trg).$(bld_trg_arch)) \3335 3336 # The staging rule (requires double evaluation).3337 local stage := $(strip $(firstdefined $(directory)_STAGE $(directory)_INST $(target)_1_STAGE,value))3338 if "$(substr $(stage),-1)" != "/" && "$(stage)" != ""3339 $(warning kBuild: Directory $(directory) in install target $(target) has a STAGE/INST property without a trailing slash: '$(stage)')3340 local stage := $(stage)/3341 endif3342 ifeq ($(root $(stage)),)3343 local insdst := $(PATH_STAGE)/$(stage)$(directory)/3344 else3345 local stage := $(abspath $(stage))/3346 ifeq ($(pos $(PATH_OBJ),$(stage)),1)3347 local insdst := $(stage)$(directory)/3348 else3349 $(error kBuild: Directory $(directory) in install target $(target) has a STAGE/INST property with an absolute path outside PATH_OBJ: '$(stage)')3350 endif3351 endif3352 3353 $(target)_2_STAGE_DIR_TARGETS += $(insdst)3354 $(eval $(def_install_directory_rule))3355 3356 # The install rule.3357 ifeq ($(insttype),both)3358 local inst := $(strip $(firstdefined $(directory)_INST $(target)_1_INST,value))3359 ifneq ($(substr $(inst),-1),/)3360 $(warning kBuild: Directory $(directory) in install target $(target) has a INST property without a trailing slash: '$(inst)')3361 local inst := $(inst)/3362 endif3363 ifneq ($(root $(stage)),)3364 $(error kBuild: Directory $(directory) in install target $(target) has a INST property with an absolute path: '$(inst)')3365 endif3366 local insdst := $(PATH_INS)/$(inst)$(directory)/3367 $(target)_2_INST_DIR_TARGETS += $(insdst)3368 $(eval $(def_install_directory_rule))3369 endif3370 3371 #$(warning directory=$(directory) inst=$(inst) stage=$(stage) mode=$(mode) gid=$(gid) uid=$(uid))3372 endef # def_install_directory3373 $(eval-opt-var def_install_directory)3374 3375 3376 ##3377 # Process one install target.3378 #3379 define def_install3380 # the basics.3381 local bld_type := $(firstword $($(target)_BLD_TYPE) $(KBUILD_TYPE))3382 local bld_trg := $(firstword $($(target)_BLD_TRG) $(KBUILD_TARGET))3383 local bld_trg_arch := $(firstword $($(target)_BLD_TRG_ARCH) $(KBUILD_TARGET_ARCH))3384 local bld_trg_cpu := $(firstword $($(target)_BLD_TRG_CPU) $(KBUILD_TARGET_CPU))3385 local insttype := $($(target)_1_INSTTYPE)3386 3387 ifneq ($(insttype),none)3388 $(target)_2_STAGE_TARGETS := $($(target)_GOALS) $($(target)_STAGE_ONLY_GOALS)3389 else3390 $(target)_2_STAGE_TARGETS :=3391 endif3392 $(target)_2_STAGE_DIR_TARGETS :=3393 3394 ifeq ($(insttype),both)3395 $(target)_2_INST_TARGETS := $($(target)_GOALS) $($(target)_INST_ONLY_GOALS)3396 else3397 $(target)_2_INST_TARGETS :=3398 endif3399 $(target)_2_INST_DIR_TARGETS :=3400 3401 3402 local outbase := $(call TARGET_BASE,$(target),$(target))3403 $(target)_0_OUTDIR := $(patsubst %/,%,$(dir $(outbase)))3404 $(call KB_FN_ASSIGN_DEPRECATED,PATH_$(target),$($(target)_0_OUTDIR), $(target)_0_OUTDIR)3405 3406 ifneq ($(insttype),none)3407 # cache top level target properties.3408 local top_mode := $(firstword \3409 $($(target)_MODE.$(bld_trg).$(bld_trg_arch)) \3410 $($(target)_MODE.$(bld_trg)) \3411 $($(target)_MODE) )3412 local top_exec_mode := $(firstword \3413 $($(target)_EXEC_MODE.$(bld_trg).$(bld_trg_arch)) \3414 $($(target)_EXEC_MODE.$(bld_trg)) \3415 $($(target)_EXEC_MODE) )3416 local top_uid := $(firstword \3417 $($(target)_UID.$(bld_trg).$(bld_trg_arch)) \3418 $($(target)_UID.$(bld_trg)) \3419 $($(target)_UID) )3420 local top_gid := $(firstword \3421 $($(target)_GID.$(bld_trg).$(bld_trg_arch)) \3422 $($(target)_GID.$(bld_trg)) \3423 $($(target)_GID) )3424 local top_ifflags := \3425 $($(target)_IFFLAGS) \3426 $($(target)_IFFLAGS.$(bld_trg)) \3427 $($(target)_IFFLAGS.$(bld_trg).$(bld_trg_arch))3428 local top_idflags := \3429 $($(target)_IDFLAGS) \3430 $($(target)_IDFLAGS.$(bld_trg)) \3431 $($(target)_IDFLAGS.$(bld_trg).$(bld_trg_arch))3432 ifdef $(target)_INSTFUN3433 local top_instfun := $(target)_INSTFUN3434 else3435 local top_instfun := _INSTALL_FILE3436 endif3437 3438 $(foreach directory, \3439 $($(target)_DIRS) \3440 $($(target)_DIRS.$(bld_trg)) \3441 $($(target)_DIRS.$(bld_trg).$(bld_trg_arch)) \3442 $($(target)_DIRS.$(bld_trg_arch)) \3443 $($(target)_DIRS.$(bld_trg_cpu)) \3444 $($(target)_DIRS.$(bld_type)), \3445 $(evalval def_install_directory))3446 3447 local clean_files := \3448 $($(target)_CLEAN) \3449 $($(target)_CLEAN.$(bld_trg)) \3450 $($(target)_CLEAN.$(bld_trg).$(bld_trg_arch)) \3451 $($(target)_CLEAN.$(bld_trg_arch)) \3452 $($(target)_CLEAN.$(bld_trg_cpu)) \3453 $($(target)_CLEAN.$(bld_type))3454 3455 local source_type_prefix :=3456 local source_type_mode := $(firstword $(top_mode) a+r,u+w)3457 $(foreach src,\3458 $($(target)_SOURCES) \3459 $($(target)_SOURCES.$(bld_trg)) \3460 $($(target)_SOURCES.$(bld_trg).$(bld_trg_arch)) \3461 $($(target)_SOURCES.$(bld_trg_arch)) \3462 $($(target)_SOURCES.$(bld_trg_cpu)) \3463 $($(target)_SOURCES.$(bld_type)), \3464 $(evalval def_install_src))3465 3466 local source_type_prefix := EXEC_3467 local source_type_mode := $(firstword $(top_exec_mode) a+xr,u+w)3468 $(foreach src,\3469 $($(target)_EXEC_SOURCES) \3470 $($(target)_EXEC_SOURCES.$(bld_trg)) \3471 $($(target)_EXEC_SOURCES.$(bld_trg).$(bld_trg_arch)) \3472 $($(target)_EXEC_SOURCES.$(bld_trg_arch)) \3473 $($(target)_EXEC_SOURCES.$(bld_trg_cpu)) \3474 $($(target)_EXEC_SOURCES.$(bld_type)), \3475 $(evalval def_install_src))3476 3477 $(foreach src,\3478 $($(target)_SYMLINKS) \3479 $($(target)_SYMLINKS.$(bld_trg)) \3480 $($(target)_SYMLINKS.$(bld_trg).$(bld_trg_arch)) \3481 $($(target)_SYMLINKS.$(bld_trg_arch)) \3482 $($(target)_SYMLINKS.$(bld_trg_cpu)) \3483 $($(target)_SYMLINKS.$(bld_type)), \3484 $(evalval def_install_symlink))3485 else # none3486 local clean_files :=3487 endif3488 3489 # The collection targets (staging only).3490 local clean_files += $($(target)_1_TARGET)3491 $($(target)_1_TARGET): $$($(target)_2_STAGE_TARGETS) | $$($(target)_2_STAGE_DIR_TARGETS) $$(dir $$@)3492 @$(QUIET2)$(APPEND) $@3493 3494 $(target): $$($(target)_1_TARGET)3495 3496 # Update Global lists.3497 _INSTALLS += $($(target)_1_TARGET)3498 _STAGE_FILES += $($(target)_2_STAGE_TARGETS)3499 _STAGE_DIRS += $($(target)_2_STAGE_DIR_TARGETS)3500 _INSTALLS_FILES += $($(target)_2_INST_TARGETS)3501 _INSTALLS_DIRS += $($(target)_2_INST_DIR_TARGETS)3502 _CLEAN_FILES += $(clean_files)3503 _DIRS += \3504 $($(target)_0_OUTDIR) \3505 $($(target)_BLDDIRS) \3506 $($(target)_BLDDIRS.$(bld_trg)) \3507 $($(target)_BLDDIRS.$(bld_trg).$(bld_trg_arch)) \3508 $($(target)_BLDDIRS.$(bld_trg_arch)) \3509 $($(target)_BLDDIRS.$(bld_trg_cpu)) \3510 $($(target)_BLDDIRS.$(bld_type))3511 3512 # Deprecated properties.3513 INSTARGET_$(target) := $($(target)_2_STAGE_TARGETS)3514 INSTARGET_DIRS_$(target) := $($(target)_2_STAGE_DIR_TARGETS)3515 3516 endef # def_install3517 $(eval-opt-var def_install)3518 3519 ## Do pass 1 on the implicit targets and add them to the list.3520 $(foreach target, $(_ALL_INSTALLS_IMPLICIT), \3521 $(evalval def_pass1_install))3522 _ALL_INSTALLS += $(_ALL_INSTALLS_IMPLICIT)3523 3524 ## Do pass 2 on all install targets.3525 $(foreach target, $(_ALL_INSTALLS), \3526 $(evalvalctx def_install))3527 3528 ifdef KBUILD_PROFILE_SELF3529 $(evalcall def_profile_self, done install targets)3530 endif3531 3532 #3533 # Some introspection targets that can be useful for package maintainers.3534 #3535 .PHONY: kbuild-show-install-files kbuild-show-install-dirs3536 kbuild-show-install-files::3537 $(addprefix $(NL)$(TAB)$(QUIET)$(ECHO) , $(subst $(PATH_INS)/,,$(_INSTALLS_FILES)))3538 3539 kbuild-show-install-dirs::3540 $(addprefix $(NL)$(TAB)$(QUIET)$(ECHO) , $(subst $(PATH_INS)/,,$(_INSTALLS_DIRS)))3541 3542 kbuild-show-stage-files::3543 $(addprefix $(NL)$(TAB)$(QUIET)$(ECHO) , $(subst $(PATH_STAGE)/,,$(_STAGE_FILES)))3544 3545 kbuild-show-stage-dirs::3546 $(addprefix $(NL)$(TAB)$(QUIET)$(ECHO) , $(subst $(PATH_STAGE)/,,$(_STAGE_DIRS)))3547 3548 3549 #3550 # TESTING3551 #3552 _TESTING += $(TESTING) \3553 $(TESTING.$(KBUILD_TARGET)) \3554 $(TESTING.$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)) \3555 $(TESTING.$(KBUILD_TARGET_ARCH)) \3556 $(TESTING.$(KBUILD_TARGET_CPU))3557 3558 3559 #3560 # PACKING3561 #3562 _PACKING += $(PACKING) \3563 $(PACKING.$(KBUILD_TARGET)) \3564 $(PACKING.$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)) \3565 $(PACKING.$(KBUILD_TARGET_ARCH)) \3566 $(PACKING.$(KBUILD_TARGET_CPU))3567 3568 3569 #3570 # DOCS3571 #3572 3573 3574 #3575 # DIRECTORIES3576 #3577 _DIR_ALL := $(sort $(addsuffix /,$(patsubst %/,%,$(_DIRS))) $(dir $(_OUT_FILES) $(_OBJS) $(_INSTALLS_FILES) $(_STAGE_FILES)))3578 $(foreach directory,$(_INSTALLS_DIRS) $(_STAGE_DIRS), $(eval _DIR_ALL := $(filter-out $(directory),$(_DIR_ALL))))3579 3580 3581 define def_mkdir_rule3582 $(directory):3583 %$$(call MSG_MKDIR,$$@)3584 $$(QUIET)$$(MKDIR) -p -- $$@3585 endef3586 3587 $(foreach directory,$(_DIR_ALL),$(eval $(def_mkdir_rule)))3588 3589 ifdef KBUILD_PROFILE_SELF3590 $(evalcall def_profile_self, done directories)3591 endif3592 3593 3594 #3595 # NOTHING3596 #3597 do-nothing:3598 %$(call MSG_NOTHING)3599 ifdef KBUILD_PROFILE_SELF3600 @$(ECHO) 'prof: $(call _KBUILD_FMT_ELAPSED_EX, $(nanots ), $(_KBUILD_TS_HEADER_START)) - $(call _KBUILD_FMT_ELAPSED_EX, $(nanots ), $(_KBUILD_TS_PREV)) - executing $@'3601 ifeq ($(KBUILD_PROFILE_SELF),2)3602 @$(ECHO) 'stat: $(make-stats )'3603 endif3604 endif3605 3606 3607 #3608 # CLEAN UP3609 #3610 do-clean:3611 %$(call MSG_CLEAN)3612 $(QUIET)$(RM) -f -- \3613 $(_OUT_FILES) \3614 $(_OBJS) \3615 $(_DEPFILES) \3616 $(_DEPFILES_INCLUDED) \3617 $(_CLEAN_FILES) \3618 $(OTHER_CLEAN) \3619 $(_STAGE_FILES)3620 $(QUIET)$(RMDIR) -p --ignore-fail-on-non-empty --ignore-fail-on-not-exist -- \3621 $(rsort $(dir $(_OUT_FILES) \3622 $(_OBJS) \3623 $(_DEPFILES) \3624 $(_DEPFILES_INCLUDED) \3625 $(_CLEAN_FILES) \3626 $(OTHER_CLEAN))\3627 $(_STAGE_DIRS) )3628 3629 3630 3631 #3632 # PASSES (including directory and makefile walking)3633 #3634 3635 #3636 # First, check whether we need to order the passes explicitly or not.3637 # This depends on whether we're a leaf makefile or not. A leaf will3638 # know all its dependencies, while a recursive one relies on the3639 # order sub-directories and other makefiles are executed it.3640 #3641 3642 ## Setup a pass and check for optimizations.3643 # @param $(PASS) Uppercase pass name.3644 define def_pass_setup_and_optimize3645 3646 # The setup. ## @todo This is looks a bit weird...3647 ifndef SUBDIRS_$(PASS)3648 SUBDIRS_$(PASS) := $(SUBDIRS) $(SUBDIRS.$(KBUILD_TARGET)) $(SUBDIRS.$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH))3649 endif3650 ifndef SUBDIRS_AFTER_$(PASS)3651 SUBDIRS_AFTER_$(PASS) := $(SUBDIRS_AFTER) $(SUBDIRS_AFTER.$(KBUILD_TARGET)) $(SUBDIRS_AFTER.$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH))3652 endif3653 ifndef MAKEFILES_BEFORE_$(PASS)3654 MAKEFILES_BEFORE_$(PASS) := $(MAKEFILES_BEFORE) $(MAKEFILES_BEFORE.$(KBUILD_TARGET)) $(MAKEFILES_BEFORE.$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH))3655 endif3656 ifndef MAKEFILES_AFTER_$(PASS)3657 MAKEFILES_AFTER_$(PASS) := $(MAKEFILES_AFTER) $(MAKEFILES_AFTER.$(KBUILD_TARGET)) $(MAKEFILES_AFTER.$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH))3658 endif3659 3660 # The check.3661 ifeq ($(_KBUILD_STRICT_PASS_ORDER),nonstrict)3662 ifneq ($(strip \3663 $(SUBDIRS_$(PASS)) $(SUBDIRS_$(PASS).$(KBUILD_TARGET)) $(SUBDIRS_$(PASS).$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)) \3664 $(MAKEFILES_BEFORE_$(PASS)) $(MAKEFILES_BEFORE_$(PASS).$(KBUILD_TARGET)) $(MAKEFILES_BEFORE_$(PASS).$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)) \3665 $(SUBDIRS_AFTER_$(PASS)) $(SUBDIRS_AFTER_$(PASS).$(KBUILD_TARGET)) $(SUBDIRS_AFTER_$(PASS).$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)) \3666 $(MAKEFILES_AFTER_$(PASS)) $(MAKEFILES_AFTER_$(PASS).$(KBUILD_TARGET)) $(MAKEFILES_AFTER_$(PASS).$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)) \3667 ),)3668 _KBUILD_STRICT_PASS_ORDER := strict3669 endif3670 endif # _KBUILD_STRICT_PASS_ORDER == nonstrict3671 endef # def_pass_setup_and_optimize3672 $(eval-opt-var def_pass_setup_and_optimize)3673 3674 ## PASS: Setup & optimization.3675 # Check if we can apply the non-strict pass order optimzation (no SUBDIRS_* and MAKEFILES_*),3676 # and set up the pass specific variables as we go along.3677 _KBUILD_STRICT_PASS_ORDER := nonstrict3678 $(foreach PASS, $(PASSES), $(evalval def_pass_setup_and_optimize))3679 #$ (error _KBUILD_STRICT_PASS_ORDER=$(_KBUILD_STRICT_PASS_ORDER))3680 3681 ifeq ($(_KBUILD_STRICT_PASS_ORDER),strict)3682 if !defined(KBUILD_SAFE_PARALLEL) || "$(KMK_OPT_JOBS)" == "1"3683 _KBUILD_STRICT_PASS_ORDER := strict_unsafe3684 endif3685 endif3686 3687 3688 ## Subdir3689 # @param $(pass) Lowercase pass name.3690 # @param $(PASS) Uppercase pass name.3691 # @param $(subdir) Subdirectory3692 # @param $(tag) tag to attach to the rule name.3693 define def_pass_subdir3694 pass_$(pass)$(tag):: $(dep)3695 + $$(QUIET)$$(MAKE) -C $(subdir) -f $$(notdir $$(firstword $$(wildcard $$(addprefix $(subdir)/,$$(DEFAULT_MAKEFILE))))) pass_$(pass)3696 endef3697 3698 ## Submakefile3699 # @param $(pass) Lowercase pass name.3700 # @param $(PASS) Uppercase pass name.3701 # @param $(makefile) Makefile.3702 # @param $(tag) tag to attach to the rule name.3703 define def_pass_makefile3704 pass_$(pass)$(tag):: $(dep)3705 + $$(QUIET)$$(MAKE) -C $(patsubst %/,%,$(dir $(makefile))) -f $(notdir $(makefile)) pass_$(pass)3706 endef3707 3708 ## Execute a pass, strict order.3709 # @param $(pass) Lowercase pass name.3710 # @param $(PASS) Uppercase pass name.3711 define def_pass_strict3712 $(eval tag:=_before)3713 $(eval dep:= )3714 $(foreach subdir, $(SUBDIRS_$(PASS)) $(SUBDIRS_$(PASS).$(KBUILD_TARGET)) $(SUBDIRS_$(PASS).$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)) ,$(eval $(def_pass_subdir)))3715 $(foreach makefile,$(MAKEFILES_BEFORE_$(PASS)) $(MAKEFILES_BEFORE_$(PASS).$(KBUILD_TARGET)) $(MAKEFILES_BEFORE_$(PASS).$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)),$(eval $(def_pass_makefile)))3716 3717 $(eval tag:=_after)3718 $(eval dep:=pass_$(pass)_doit)3719 $(foreach subdir, $(SUBDIRS_AFTER_$(PASS)) $(SUBDIRS_AFTER_$(PASS).$(KBUILD_TARGET)) $(SUBDIRS_AFTER_$(PASS).$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)) ,$(eval $(def_pass_subdir)))3720 $(foreach makefile,$(MAKEFILES_AFTER_$(PASS)) $(MAKEFILES_AFTER_$(PASS).$(KBUILD_TARGET)) $(MAKEFILES_AFTER_$(PASS).$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)) ,$(eval $(def_pass_makefile)))3721 3722 .NOTPARALLEL: pass_$(pass) pass_$(pass)_before pass_$(pass)_after pass_$(pass)_this3723 .PHONY: pass_$(pass) pass_$(pass)_before pass_$(pass)_after pass_$(pass)_this pass_$(pass)_doit3724 pass_$(pass)_doit: $(PASS_$(PASS)_trgs) $(foreach var,$(PASS_$(PASS)_vars),$($(var)))3725 pass_$(pass)_this: pass_$(pass)_before3726 + $$(QUIET)$$(MAKE) -f $$(MAKEFILE) pass_$(pass)_doit3727 pass_$(pass)_after:: pass_$(pass)_this3728 pass_$(pass): pass_$(pass)_after3729 #$ (warning pass=$(pass) PASS=$(PASS): $(PASS_$(PASS)_trgs) $(PASS_$(PASS)_trgs) $(foreach var,$(PASS_$(PASS)_vars),$($(var))))3730 endef # def_pass_strict3731 $(eval-opt-var def_pass_strict)3732 3733 ## Execute a pass, strict order.3734 # @param $(pass) Lowercase pass name.3735 # @param $(PASS) Uppercase pass name.3736 define def_pass_strict_unsafe3737 $(eval tag:=_before)3738 $(eval dep:= )3739 $(foreach subdir, $(SUBDIRS_$(PASS)) $(SUBDIRS_$(PASS).$(KBUILD_TARGET)) $(SUBDIRS_$(PASS).$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)) ,$(eval $(def_pass_subdir)))3740 $(foreach makefile,$(MAKEFILES_BEFORE_$(PASS)) $(MAKEFILES_BEFORE_$(PASS).$(KBUILD_TARGET)) $(MAKEFILES_BEFORE_$(PASS).$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)),$(eval $(def_pass_makefile)))3741 3742 $(eval tag:=_after)3743 $(eval dep:=pass_$(pass)_doit)3744 $(foreach subdir, $(SUBDIRS_AFTER_$(PASS)) $(SUBDIRS_AFTER_$(PASS).$(KBUILD_TARGET)) $(SUBDIRS_AFTER_$(PASS).$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)) ,$(eval $(def_pass_subdir)))3745 $(foreach makefile,$(MAKEFILES_AFTER_$(PASS)) $(MAKEFILES_AFTER_$(PASS).$(KBUILD_TARGET)) $(MAKEFILES_AFTER_$(PASS).$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)) ,$(eval $(def_pass_makefile)))3746 3747 .PHONY: pass_$(pass) pass_$(pass)_before pass_$(pass)_after pass_$(pass)_doit3748 .NOTPARALLEL: pass_$(pass) pass_$(pass)_before pass_$(pass)_after pass_$(pass)_doit3749 pass_$(pass)_doit: pass_$(pass)_before \3750 $(PASS_$(PASS)_trgs) $(foreach var,$(PASS_$(PASS)_vars),$($(var)))3751 pass_$(pass): \3752 pass_$(pass)_before \3753 pass_$(pass)_doit \3754 pass_$(pass)_after3755 #$ (warning pass=$(pass) PASS=$(PASS): $(PASS_$(PASS)_trgs) $(PASS_$(PASS)_trgs) $(foreach var,$(PASS_$(PASS)_vars),$($(var))))3756 endef # def_pass_strict_unsafe3757 $(eval-opt-var def_pass_strict_unsafe)3758 3759 ## Execute a pass, non-strict pass ordering.3760 # @param $(pass) Lowercase pass name.3761 # @param $(PASS) Uppercase pass name.3762 define def_pass_nonstrict3763 .PHONY: pass_$(pass) pass_$(pass)_before pass_$(pass)_after pass_$(pass)_doit3764 pass_$(pass)_doit: $(PASS_$(PASS)_trgs) $(foreach var,$(PASS_$(PASS)_vars),$$$$($(var)))3765 pass_$(pass): pass_$(pass)_doit3766 endef # def_pass_nonstrict3767 3768 ## PASS: rules3769 # Generate the rules for the defined passes.3770 $(foreach PASS, $(PASSES), \3771 $(eval pass := $(PASS_$(PASS)_pass)) \3772 $(eval $(def_pass_$(_KBUILD_STRICT_PASS_ORDER))))3773 3774 3775 ## Pass order, strict.3776 # @param $(pass) Current pass name.3777 # @param $(prev_pass) The previous pass name.3778 define def_pass_order_strict3779 .PHONY: pass_$(pass)_order3780 .NOTPARALLEL: pass_$(pass)_order3781 pass_$(pass)_order: $(pass_prev)3782 %$$(call MSG_PASS,$$(if $$(PASS_$(PASS)),$$(PASS_$(PASS)),$(pass)))3783 + $$(QUIET)$$(MAKE) -f $$(MAKEFILE) pass_$(pass)3784 $(eval pass_prev := pass_$(pass)_order)3785 endef # def_pass_order_strict3786 $(eval-opt-var def_pass_order_strict)3787 3788 ## Pass order, strict unsafe.3789 # @param $(pass) Current pass name.3790 # @param $(prev_pass) The previous pass name.3791 define def_pass_order_strict_unsafe3792 .NOTPARALLEL: pass_$(pass)_order pass_$(pass)_banner3793 .PHONY: pass_$(pass)_order pass_$(pass)_banner3794 pass_$(pass)_banner: $(pass_prev)3795 %$$(call MSG_PASS,$$(if $$(PASS_$(PASS)),$$(PASS_$(PASS)),$(pass)))3796 pass_$(pass)_order: $(pass_prev) \3797 pass_$(pass)_banner \3798 pass_$(pass)3799 $(eval pass_prev := pass_$(pass)_order)3800 endef # def_pass_order_strict_unsafe3801 $(eval-opt-var def_pass_order_strict_unsafe)3802 3803 ## Pass order, non-strict.3804 # @param $(pass) Current pass name.3805 # @param $(prev_pass) The previous pass name.3806 define def_pass_order_nonstrict3807 .PHONY: pass_$(pass)_order pass_$(pass)_banner3808 pass_$(pass)_banner:3809 %$$(call MSG_PASS,$$(if $$(PASS_$(PASS)),$$(PASS_$(PASS)),$(pass)))3810 pass_$(pass)_order: \3811 $(pass_prev) \3812 pass_$(pass)_banner \3813 pass_$(pass)3814 $(eval pass_prev := pass_$(pass)_order)3815 endef # def_pass_order_nonstrict3816 $(eval-opt-var def_pass_order_nonstrict)3817 3818 ## PASS: order3819 # Use dependencies to ensure correct pass order.3820 pass_prev :=3821 $(foreach PASS,$(DEFAULT_PASSES),\3822 $(eval pass := $(PASS_$(PASS)_pass)) \3823 $(eval $(def_pass_order_$(_KBUILD_STRICT_PASS_ORDER))))3824 3825 ifdef KBUILD_PROFILE_SELF3826 $(evalcall def_profile_self, done passes)3827 endif3828 3829 # Some common pass aliases3830 ifndef KBUILD_NO_PASS_ALIASES3831 .PHONY: clean3832 clean: pass_clean3833 3834 .PHONY: nothing3835 nothing: pass_nothing3836 3837 .PHONY: staging3838 staging: pass_staging3839 3840 .PHONY: packing3841 packing: pass_packing3842 3843 ifndef KBUILD_NO_TESTING_PASS_ALIASES3844 .PHONY: check3845 check:: pass_testing3846 3847 .PHONY: test3848 test:: pass_testing3849 endif # KBUILD_NO_TESTING_PASS_ALIASES3850 endif # KBUILD_NO_PASS_ALIASES3851 3852 3853 #3854 # THE MAIN RULES3855 #3856 all_recursive: $(pass_prev)3857 3858 rebuild: clean3859 + $(MAKE) -f $(firstword $(MAKEFILE_LIST)) all_recursive3860 3861 # @todo make this a non-default pass!3862 uninstall::3863 $(RM) -f -- $(_INSTALLS_FILES)3864 3865 install:: pass_installs3866 3867 # misc shortcuts (use secondary expansion here to save strcache[file] space).3868 targets: bldprogs libraries dlls programs sysmods miscbins others installs3869 objects: $$(_OBJS)3870 bldprogs: $$(_BLDPROGS)3871 libraries: $$(_LIBS) $$(_IMPORT_LIBS) $$(_OTHER_LIBRARIES)3872 dlls: $$(_DLLS)3873 programs: $$(_PROGRAMS)3874 sysmods: $$(_SYSMODS)3875 miscbins: $$(_MISCBINS)3876 others: $$(_OTHERS)3877 stagings: $$(_INSTALLS) $$(_STAGE_DIRS) $$(_STAGE_FILES)3878 installs: $$(_INSTALLS_DIRS) $$(_INSTALLS_FILES)3879 3880 3881 3882 #3883 # kBuild debugging stuff.3884 #3885 ## @todo this doesn't work. Move to a debug unit and expand it.3886 show_targets:3887 @$(foreach target, $(_ALL_TARGETS),\3888 @$(ECHO) "target: $(target)" $(NLTAB)\3889 @$(ECHO) " $(target)_0_OUTDIR=$($(target)_0_OUTDIR)" $(NLTAB)\3890 @$(ECHO) " $(target)_1_TARGET=$($(target)_1_TARGET)" $(NLTAB)\3891 @$(ECHO) " INSTARGET_$(target)=$(INSTARGET_$(target))" $(NLTAB)\3892 $(foreach prop,$(PROPS_SINGLE) $(PROPS_ACCUMULATE_L) $(PROPS_ACCUMULATE_R) 2_OBJS CLEAN, \3893 $(eval _tmp:=$(firstword $($(target)_BLD_TRG) $(KBUILD_TARGET))) \3894 $(if $($(target)_$(prop).$(_tmp)),\3895 @$(ECHO) " $(target)_$(prop).$(_tmp)=$($(target)_$(prop).$(_tmp))" $(NLTAB)) \3896 $(if $($(target)_$(prop)), $(NLTAB)@$(ECHO) " $(target)_$(prop)=$($(target)_$(prop))" $(NLTAB)) \3897 )\3898 $(foreach prop,$(PROPS_DEFERRED), \3899 $(eval _tmp:=$(firstword $($(target)_BLD_TRG) $(KBUILD_TARGET))) \3900 $(if $(value $(target)_$(prop).$(_tmp)),\3901 @$(ECHO) ' $(target)_$(prop).$(_tmp)=$(value $(TARGET)_$(prop).$(_tmp))' $(NLTAB)) \3902 $(if $(value $(target)_$(prop)), $(NLTAB)@$(ECHO) ' $(target)_$(prop)=$(value $(target)_$(prop))' $(NLTAB)) \3903 ))3904 3905 3906 3907 #3908 # Include dependency files.3909 #3910 ifdef _DEPFILES3911 # TODO: first works the second doesn't, provided _KB_INCLUDE_DEPS is undefined:3912 # if "$(_KB_INCLUDE_DEPS)" == "1"3913 # if $(_KB_INCLUDE_DEPS) == "1"3914 3915 ifdef KB_HAVE_INCLUDEDEP_QUEUE3916 includedep-queue $(_DEPFILES)3917 else3918 $(foreach dep, $(_DEPFILES), $(eval includedep $(dep)))3919 endif3920 endif3921 3922 3923 ifdef KBUILD_PROFILE_SELF3924 $(evalcall def_profile_self, end of footer.kmk)3925 _KBUILD_TS_FOOTER_END := $(_KBUILD_TS_PREV)3926 3927 ifneq ($(KBUILD_PROFILE_SELF),0)3928 $(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)) )3929 $(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)) )3930 $(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)) )3931 $(info prof: DEPFILES_INCLUDED=$(words $(_DEPFILES_INCLUDED)) DEPFILES=$(words $(_DEPFILES)) MAKEFILES=$(words $(MAKEFILE_LIST)) )3932 endif3933 endif3934 3935 3936 # end-of-file-content3937 __footer_kmk__ := target3938 endif # !defined(__footer_kmk__)3939
Note:
See TracChangeset
for help on using the changeset viewer.