summaryrefslogtreecommitdiffstats
path: root/kBuild/footer-pass2-installs.kmk
diff options
context:
space:
mode:
Diffstat (limited to 'kBuild/footer-pass2-installs.kmk')
-rw-r--r--kBuild/footer-pass2-installs.kmk641
1 files changed, 641 insertions, 0 deletions
diff --git a/kBuild/footer-pass2-installs.kmk b/kBuild/footer-pass2-installs.kmk
new file mode 100644
index 0000000..27ec7da
--- /dev/null
+++ b/kBuild/footer-pass2-installs.kmk
@@ -0,0 +1,641 @@
+# $Id: footer-pass2-installs.kmk 3373 2020-06-10 11:01:43Z bird $
+## @file
+# kBuild - Footer - Target lists - Pass 2 - Installs.
+#
+
+#
+# Copyright (c) 2004-2017 knut st. osmundsen <bird-kBuild-spam-xviiv@anduin.net>
+#
+# This file is part of kBuild.
+#
+# kBuild is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version source of the License, or
+# (at your option) any later version.
+#
+# kBuild is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with kBuild; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+#
+# As a special exception you are granted permission to include this file, via
+# the kmk include directive, as you wish without this in itself causing the
+# resulting makefile, program or whatever to be covered by the GPL license.
+# This exception does not however invalidate any other reasons why the makefile,
+# program, whatever should not be covered the GPL.
+#
+#
+
+
+#
+# INSTALLS
+#
+
+##
+# Generate the staging rules.
+#
+define def_install_src_rule_staging
+$$(call KB_FN_ASSERT_ABSPATH, stagedst)
+$$(call KB_FN_ASSERT_ABSPATH, srcsrc)
+$(stagedst) : $(srcsrc) $(top_deps) | $(dir $(stagedst)) $(top_orderdeps)
+ %$$(call MSG_INST_FILE,$(srcsrc),$(stagedst))
+ $(top_pre_file_cmds)
+ $$(QUIET)$(stagecmd)
+ $(top_post_file_cmds)
+endef
+$(eval-opt-var def_install_src_rule_staging)
+
+define def_install_src_rule_installing
+$$(call KB_FN_ASSERT_ABSPATH, instdst)
+$$(call KB_FN_ASSERT_ABSPATH, srcsrc)
+$(instdst) : $(srcsrc) $(top_deps) | $(dir $(instdst)) $(top_orderdeps)
+ %$$(call MSG_INST_FILE,$(srcsrc),$(instdst))
+ $(top_pre_file_cmds)
+ $$(QUIET)$(instcmd)
+ $(top_post_file_cmds)
+endef
+$(eval-opt-var def_install_src_rule_installing)
+
+##
+# Install one file.
+#
+define def_install_src
+
+# deal with '=>' in the source file name.
+ifeq ($(src),=>)
+ $(error kBuild: Install target '$(target)' has a bad source specifier containing '=>' without any file names)
+endif
+ifeq ($(substr $(src),1,2),=>)
+ $(warning kBuild: Install target '$(target)' has a bad source specifier: $(src))
+endif
+ifeq ($(substr $(src),-2),=>)
+ $(warning kBuild: Install target '$(target)' has a bad source specifier: $(src))
+endif
+local srcdst := $(subst =>, ,$(src))
+local srcsrc := $(firstword $(srcdst))
+local srcdstdir := $(dir $(word 2,$(srcdst)))
+ifeq ($(srcdstdir),./)
+ local srcdstdir:=
+endif
+local srcdst := $(word $(words $(srcdst)),$(srcdst))
+
+# instfun, mode, uid and gid.
+ifdef $(srcsrc)_INSTFUN
+ local instfun := $(srcsrc)_INSTFUN
+else
+ local instfun := $(top_instfun)
+endif
+local mode := $(firstword \
+ $($(target)_$(srcsrc)$(source_type_prefix)_MODE.$(bld_trg).$(bld_trg_arch)) \
+ $($(target)_$(srcsrc)$(source_type_prefix)_MODE.$(bld_trg)) \
+ $($(target)_$(srcsrc)$(source_type_prefix)_MODE) \
+ $($(target)_$(srcdst)$(source_type_prefix)_MODE.$(bld_trg).$(bld_trg_arch)) \
+ $($(target)_$(srcdst)$(source_type_prefix)_MODE.$(bld_trg)) \
+ $($(target)_$(srcdst)$(source_type_prefix)_MODE) \
+ $($(srcsrc)$(source_type_prefix)_MODE.$(bld_trg).$(bld_trg_arch)) \
+ $($(srcsrc)$(source_type_prefix)_MODE.$(bld_trg)) \
+ $($(srcsrc)$(source_type_prefix)_MODE) \
+ $($(srcdst)$(source_type_prefix)_MODE.$(bld_trg).$(bld_trg_arch)) \
+ $($(srcdst)$(source_type_prefix)_MODE.$(bld_trg)) \
+ $($(srcdst)$(source_type_prefix)_MODE) \
+ $(source_type_mode))
+local uid := $(firstword \
+ $($(target)_$(srcsrc)_UID.$(bld_trg).$(bld_trg_arch)) \
+ $($(target)_$(srcsrc)_UID.$(bld_trg)) \
+ $($(target)_$(srcsrc)_UID) \
+ $($(target)_$(srcdst)_UID.$(bld_trg).$(bld_trg_arch)) \
+ $($(target)_$(srcdst)_UID.$(bld_trg)) \
+ $($(target)_$(srcdst)_UID) \
+ $($(srcsrc)_UID.$(bld_trg).$(bld_trg_arch)) \
+ $($(srcsrc)_UID.$(bld_trg)) \
+ $($(srcsrc)_UID) \
+ $($(srcdst)_UID.$(bld_trg).$(bld_trg_arch)) \
+ $($(srcdst)_UID.$(bld_trg)) \
+ $($(srcdst)_UID) \
+ $(top_uid))
+local gid := $(firstword \
+ $($(target)_$(srcsrc)_GID.$(bld_trg).$(bld_trg_arch)) \
+ $($(target)_$(srcsrc)_GID.$(bld_trg)) \
+ $($(target)_$(srcsrc)_GID) \
+ $($(target)_$(srcdst)_GID.$(bld_trg).$(bld_trg_arch)) \
+ $($(target)_$(srcdst)_GID.$(bld_trg)) \
+ $($(target)_$(srcdst)_GID) \
+ $($(srcsrc)_GID.$(bld_trg).$(bld_trg_arch)) \
+ $($(srcsrc)_GID.$(bld_trg)) \
+ $($(srcsrc)_GID) \
+ $($(srcdst)_GID.$(bld_trg).$(bld_trg_arch)) \
+ $($(srcdst)_GID.$(bld_trg)) \
+ $($(srcdst)_GID) \
+ $(top_gid))
+local flags := \
+ $(top_ifflags) \
+ $($(srcdst)$(source_type_prefix)_IFFLAGS) \
+ $($(srcdst)$(source_type_prefix)_IFFLAGS.$(bld_trg)) \
+ $($(srcdst)$(source_type_prefix)_IFFLAGS.$(bld_trg).$(bld_trg_arch)) \
+ $($(srcsrc)$(source_type_prefix)_IFFLAGS) \
+ $($(srcsrc)$(source_type_prefix)_IFFLAGS.$(bld_trg)) \
+ $($(srcsrc)$(source_type_prefix)_IFFLAGS.$(bld_trg).$(bld_trg_arch)) \
+ $($(target)_$(srcdst)$(source_type_prefix)_IFFLAGS) \
+ $($(target)_$(srcdst)$(source_type_prefix)_IFFLAGS.$(bld_trg)) \
+ $($(target)_$(srcdst)$(source_type_prefix)_IFFLAGS.$(bld_trg).$(bld_trg_arch)) \
+ $($(target)_$(srcsrc)$(source_type_prefix)_IFFLAGS) \
+ $($(target)_$(srcsrc)$(source_type_prefix)_IFFLAGS.$(bld_trg)) \
+ $($(target)_$(srcsrc)$(source_type_prefix)_IFFLAGS.$(bld_trg).$(bld_trg_arch))
+clean_files += \
+ $($(srcdst)_CLEAN) \
+ $($(srcdst)_CLEAN.$(bld_trg)) \
+ $($(srcdst)_CLEAN.$(bld_trg).$(bld_trg_arch)) \
+ $($(srcsrc)_CLEAN) \
+ $($(srcsrc)_CLEAN.$(bld_trg)) \
+ $($(srcsrc)_CLEAN.$(bld_trg).$(bld_trg_arch)) \
+ $($(target)_$(srcdst)_CLEAN) \
+ $($(target)_$(srcdst)_CLEAN.$(bld_trg)) \
+ $($(target)_$(srcdst)_CLEAN.$(bld_trg).$(bld_trg_arch)) \
+ $($(target)_$(srcsrc)_CLEAN) \
+ $($(target)_$(srcsrc)_CLEAN.$(bld_trg)) \
+ $($(target)_$(srcsrc)_CLEAN.$(bld_trg).$(bld_trg_arch))
+
+
+# Adjust the source if we got a default PATH. (This must be done this late!)
+ifdef $(target)_DEFPATH
+local defpath := $($(target)_DEFPATH)
+else ifdef $(target)_PATH
+local defpath := $($(target)_PATH)
+else
+local defpath :=
+endif
+ifneq ($(defpath),)
+ local srcsrc := $(abspathex $(srcsrc),$(defpath))
+endif
+
+# Generate the staging rule (requires double evaluation).
+local stage := $(strip $(firstdefined $(srcsrc)_STAGE $(srcsrc)_INST $(target)_1_STAGE,value))
+if "$(substr $(stage),-1)" != "/" && "$(stage)" != ""
+ $(warning kBuild: File $(srcsrc) in install target $(target) has a STAGE/INST property without a trailing slash: '$(stage)')
+ local stage := $(stage)/
+endif
+local stage := $(stage)$(dir $(srcdstdir))
+ifeq ($(root $(stage)),)
+ local stagedst := $(call $(instfun),$(srcdst),$(target),$(stage),$(PATH_STAGE))
+else
+ local stage := $(abspath $(stage))/
+ ifeq ($(pos $(PATH_OBJ),$(stage)),1)
+ local stage := $(substr $(stage), $(expr $(length-var PATH_OBJ) + 2))
+ local stagedst := $(call $(instfun),$(srcdst),$(target),$(stage),$(PATH_OBJ))
+ else
+ $(error kBuild: File $(srcsrc) in install target $(target) has a STAGE/INST property with an absolute path outside PATH_OBJ: '$(stage)')
+ endif
+endif
+ifdef $(srcsrc)_INSTALLER
+ local stagecmd := $(call $(srcsrc)_INSTALLER,$(srcsrc),$(stagedst),$(target),$(flags),stage)
+else ifdef $(target)_INSTALLER
+ local stagecmd := $(call $(target)_INSTALLER,$(srcsrc),$(stagedst),$(target),$(flags),stage)
+else
+ local stagecmd := $$(INSTALL_STAGING)\
+ $(if $(uid),-o $(uid))\
+ $(if $(gid),-g $(gid))\
+ $(if $(mode),-m $(mode))\
+ $(flags) -- \
+ $(srcsrc) $(stagedst)
+endif
+$(eval $(def_install_src_rule_staging))
+$(target)_2_STAGE_TARGETS += $(stagedst)
+
+# Generate the install rule
+ifeq ($(insttype),both)
+ local inst := $(strip $(firstdefined $(srcsrc)_INST $(target)_1_INST,value))
+ if "$(substr $(inst),-1)" != "/" && "$(inst)" != ""
+ $(warning kBuild: File $(srcsrc) in install target $(target) has a INST property without a trailing slash: '$(inst)')
+ local inst := $(inst)/
+ endif
+ local inst := $(inst)$(dir $(srcdstdir))
+ ifneq ($(root $(inst)),)
+ $(error kBuild: File $(srcsrc) in install target $(target) has a INST property with an absolute path: '$(inst)')
+ endif
+ local instdst := $(call $(instfun),$(srcdst),$(target),$(inst),$(PATH_INS))
+
+ ifdef $(srcsrc)_INSTALLER
+ local instcmd := $(call $(srcsrc)_INSTALLER,$(srcsrc),$(instdst),$(target),$(flags),install)
+ else ifdef $(target)_INSTALLER
+ local instcmd := $(call $(target)_INSTALLER,$(srcsrc),$(instdst),$(target),$(flags),install)
+ else
+ local instcmd := $$(INSTALL)\
+ $(if $(uid),-o $(uid))\
+ $(if $(gid),-g $(gid))\
+ $(if $(mode),-m $(mode))\
+ $(flags) -- \
+ $(srcsrc) $(instdst)
+ endif
+ $(eval $(def_install_src_rule_installing))
+ $(target)_2_INST_TARGETS += $(instdst)
+endif
+
+#$(warning instfun=$(instfun) srcdst=$(srcdst) target=$(target) inst=$(inst) => instdst=$(instdst); stage=$(stage) => stagedst=$(stagedst))
+endef # def_install_src
+$(eval-opt-var def_install_src)
+
+
+##
+# Generate the symlink rules.
+#
+define def_install_symlink_rule_staging
+$$(call KB_FN_ASSERT_ABSPATH, stagedst)
+$(stagedst) : $(top_deps) | $(dir $(stagedst)) $(top_orderdeps)
+ %$$(call MSG_INST_SYM,$(stagedst),$(symdst))
+ $$(QUIET)$$(RM) -f -- $$@
+ $(top_pre_sym_cmds)
+ $$(QUIET)$$(LN_SYMLINK) $(symdst) $(stagedst)
+ $(top_post_sym_cmds)
+endef
+$(eval-opt-var def_install_symlink_rule_staging)
+
+define def_install_symlink_rule_installing
+$$(call KB_FN_ASSERT_ABSPATH, instdst)
+$(instdst) : $(top_deps) | $(dir $(instdst)) $(top_orderdeps)
+ %$$(call MSG_INST_SYM,$(instdst),$(symdst))
+ $$(QUIET)$$(RM) -f -- $$@
+ $(top_pre_sym_cmds)
+ $$(QUIET)$$(LN_SYMLINK) $(symdst) $(instdst)
+ $(top_post_sym_cmds)
+endef
+$(eval-opt-var def_install_symlink_rule_installing)
+
+
+##
+# Create one symlink.
+#
+define def_install_symlink
+
+# deal with '=>' in the source file name.
+local symdst := $(subst =>, ,$(src))
+local symlnk := $(firstword $(symdst))
+local symdst := $(word $(words $(symdst)),$(symdst))
+local symlnkdir := $(dir $(symlnk))
+ifeq ($(symlnkdir),./)
+ local symlnkdir :=
+endif
+
+# Figure which install function to use below.
+ifdef $(symlnk)_INSTFUN
+ local instfun := $(symlnk)_INSTFUN
+else
+ local instfun := $(top_instfun)
+endif
+
+# Calc stage destination and generate the rule (requires double evaluation).
+local stage := $(strip $(firstdefined $(symlnk)_STAGE $(symlnk)_INST $(target)_1_STAGE,value))
+if "$(substr $(stage),-1)" != "/" && "$(stage)" != ""
+ $(warning kBuild: Symlink $(symlnk) in install target $(target) has a STAGE/INST property without a trailing slash: '$(stage)')
+ local stage := $(stage)/
+endif
+local stage := $(stage)$(symlnkdir)
+ifeq ($(root $(stage)),)
+ local stagedst := $(call $(instfun),$(symlnk),$(target),$(stage),$(PATH_STAGE))
+else
+ local stage := $(abspath $(stage))/
+ ifeq ($(pos $(PATH_OBJ),$(stage)),1)
+ local stage := $(substr $(stage), $(expr $(length-var PATH_OBJ) + 2))
+ local stagedst := $(call $(instfun),$(symlnk),$(target),$(stage),$(PATH_OBJ))
+ else
+ $(error kBuild: Symlink $(symlnk) in install target $(target) has a STAGE/INST property with an absolute path outside PATH_OBJ: '$(stage)')
+ endif
+endif
+
+$(eval $(def_install_symlink_rule_staging))
+$(target)_2_STAGE_TARGETS += $(stagedst)
+
+# Calcuate the install destiation and generate the rule (if necessary).
+ifeq ($(instmode),both)
+ local inst := $(strip $(firstdefined $(symlnk)_INST $(target)_1_INST,value))
+ if "$(substr $(inst),-1)" != "/" && "$(inst)" != ""
+ $(warning kBuild: Symlink $(symlnk) in install target $(target) has a INST property without a trailing slash: '$(inst)')
+ local inst := $(inst)/
+ endif
+ ifneq ($(root $(inst)),)
+ $(error kBuild: Symlink $(symlnk) in install target $(target) has a INST property with an absolute path: '$(inst)')
+ endif
+ local inst := $(inst)$(symlnkdir)
+ local instdst := $(call $(instfun),$(symlnk),$(target),$(inst),$(PATH_INS))
+ $(eval $(def_install_symlink_rule_installing))
+ $(target)_2_INST_TARGETS += $(instdst)
+endif
+
+#$(warning symlnk=$(symlnk) symdst=$(symdst) instdst=$(instdst) stagedst=$(stagedst) instfun=$(instfun) inst=$(inst) stage='$(stage)')
+endef # def_install_symlink
+$(optmize def_install_symlink)
+
+
+##
+# Generate an directory installtion rule.
+# Note. Used both for staging and real install rules.
+#
+define def_install_directory_rule
+$$(call KB_FN_ASSERT_ABSPATH, insdst)
+$(insdst): $(top_deps) | $(top_orderdeps)
+ %$$(call MSG_INST_DIR,$(insdst))
+ $(top_pre_dir_cmds)
+ $$(QUIET)$$(INSTALL) -d \
+ $(if $(uid),-o $(uid))\
+ $(if $(gid),-g $(gid))\
+ $(if $(mode),-m $(mode))\
+ $(flags) -- \
+ $(insdst)
+ $(top_post_dir_cmds)
+
+endef # def_install_directory_rule
+$(eval-opt-var def_install_directory_rule)
+
+##
+# Create one directory.
+#
+define def_install_directory
+
+# gather common properties.
+local mode := $(firstword \
+ $($(target)_$(directory)_MODE.$(bld_trg).$(bld_trg_arch)) \
+ $($(target)_$(directory)_MODE.$(bld_trg)) \
+ $($(target)_$(directory)_MODE) \
+ $($(directory)_MODE.$(bld_trg).$(bld_trg_arch)) \
+ $($(directory)_MODE.$(bld_trg)) \
+ $($(directory)_MODE) \
+ $(top_mode) )
+local uid := $(firstword \
+ $($(target)_$(directory)_UID.$(bld_trg).$(bld_trg_arch)) \
+ $($(target)_$(directory)_UID.$(bld_trg)) \
+ $($(target)_$(directory)_UID) \
+ $($(directory)_UID.$(bld_trg).$(bld_trg_arch)) \
+ $($(directory)_UID.$(bld_trg)) \
+ $($(directory)_UID) \
+ $(top_uid) )
+local gid := $(firstword \
+ $($(target)_$(directory)_GID.$(bld_trg).$(bld_trg_arch)) \
+ $($(target)_$(directory)_GID.$(bld_trg)) \
+ $($(target)_$(directory)_GID) \
+ $($(directory)_GID.$(bld_trg).$(bld_trg_arch)) \
+ $($(directory)_GID.$(bld_trg)) \
+ $($(directory)_GID) \
+ $(top_gid) )
+local flags := \
+ $(top_idflags) \
+ $($(directory)_IDFLAGS) \
+ $($(directory)_IDFLAGS.$(bld_trg)) \
+ $($(directory)_IDFLAGS.$(bld_trg).$(bld_trg_arch)) \
+ $($(target)_$(directory)_IDFLAGS) \
+ $($(target)_$(directory)_IDFLAGS.$(bld_trg)) \
+ $($(target)_$(directory)_IDFLAGS.$(bld_trg).$(bld_trg_arch)) \
+
+# The staging rule (requires double evaluation).
+local stage := $(strip $(firstdefined $(directory)_STAGE $(directory)_INST $(target)_1_STAGE,value))
+if "$(substr $(stage),-1)" != "/" && "$(stage)" != ""
+ $(warning kBuild: Directory $(directory) in install target $(target) has a STAGE/INST property without a trailing slash: '$(stage)')
+ local stage := $(stage)/
+endif
+ifeq ($(root $(stage)),)
+ local insdst := $(PATH_STAGE)/$(stage)$(directory)/
+else
+ local stage := $(abspath $(stage))/
+ ifeq ($(pos $(PATH_OBJ),$(stage)),1)
+ local insdst := $(stage)$(directory)/
+ else
+ $(error kBuild: Directory $(directory) in install target $(target) has a STAGE/INST property with an absolute path outside PATH_OBJ: '$(stage)')
+ endif
+endif
+
+$(target)_2_STAGE_DIR_TARGETS += $(insdst)
+$(eval $(def_install_directory_rule))
+
+# The install rule.
+ifeq ($(insttype),both)
+ local inst := $(strip $(firstdefined $(directory)_INST $(target)_1_INST,value))
+ ifneq ($(substr $(inst),-1),/)
+ $(warning kBuild: Directory $(directory) in install target $(target) has a INST property without a trailing slash: '$(inst)')
+ local inst := $(inst)/
+ endif
+ ifneq ($(root $(stage)),)
+ $(error kBuild: Directory $(directory) in install target $(target) has a INST property with an absolute path: '$(inst)')
+ endif
+ local insdst := $(PATH_INS)/$(inst)$(directory)/
+ $(target)_2_INST_DIR_TARGETS += $(insdst)
+ $(eval $(def_install_directory_rule))
+endif
+
+#$(warning directory=$(directory) inst=$(inst) stage=$(stage) mode=$(mode) gid=$(gid) uid=$(uid))
+endef # def_install_directory
+$(eval-opt-var def_install_directory)
+
+
+##
+# Process one install target.
+#
+define def_install
+# the basics.
+local bld_type := $(firstword $($(target)_BLD_TYPE) $(KBUILD_TYPE))
+local bld_trg := $(firstword $($(target)_BLD_TRG) $(KBUILD_TARGET))
+local bld_trg_arch := $(firstword $($(target)_BLD_TRG_ARCH) $(KBUILD_TARGET_ARCH))
+local bld_trg_cpu := $(firstword $($(target)_BLD_TRG_CPU) $(KBUILD_TARGET_CPU))
+local insttype := $($(target)_1_INSTTYPE)
+
+ifneq ($(insttype),none)
+ $(target)_2_STAGE_TARGETS := $($(target)_GOALS) $($(target)_STAGE_ONLY_GOALS)
+else
+ $(target)_2_STAGE_TARGETS :=
+endif
+$(target)_2_STAGE_DIR_TARGETS :=
+
+ifeq ($(insttype),both)
+ $(target)_2_INST_TARGETS := $($(target)_GOALS) $($(target)_INST_ONLY_GOALS)
+else
+ $(target)_2_INST_TARGETS :=
+endif
+$(target)_2_INST_DIR_TARGETS :=
+
+
+local outbase := $(call TARGET_BASE,$(target),$(target))
+$(target)_0_OUTDIR := $(patsubst %/,%,$(dir $(outbase)))
+$(call KB_FN_ASSIGN_DEPRECATED,PATH_$(target),$($(target)_0_OUTDIR), $(target)_0_OUTDIR)
+
+ifneq ($(insttype),none)
+ # Cache top level target properties.
+ local top_mode := $(firstword \
+ $($(target)_MODE.$(bld_trg).$(bld_trg_arch)) \
+ $($(target)_MODE.$(bld_trg)) \
+ $($(target)_MODE) )
+ local top_exec_mode := $(firstword \
+ $($(target)_EXEC_MODE.$(bld_trg).$(bld_trg_arch)) \
+ $($(target)_EXEC_MODE.$(bld_trg)) \
+ $($(target)_EXEC_MODE) )
+ local top_uid := $(firstword \
+ $($(target)_UID.$(bld_trg).$(bld_trg_arch)) \
+ $($(target)_UID.$(bld_trg)) \
+ $($(target)_UID) )
+ local top_gid := $(firstword \
+ $($(target)_GID.$(bld_trg).$(bld_trg_arch)) \
+ $($(target)_GID.$(bld_trg)) \
+ $($(target)_GID) )
+ local top_ifflags := \
+ $($(target)_IFFLAGS) \
+ $($(target)_IFFLAGS.$(bld_trg)) \
+ $($(target)_IFFLAGS.$(bld_trg).$(bld_trg_arch))
+ local top_idflags := \
+ $($(target)_IDFLAGS) \
+ $($(target)_IDFLAGS.$(bld_trg)) \
+ $($(target)_IDFLAGS.$(bld_trg).$(bld_trg_arch))
+ ifdef $(target)_INSTFUN
+ local top_instfun := $(target)_INSTFUN
+ else
+ local top_instfun := _INSTALL_FILE
+ endif
+ local top_deps := \
+ $($(target)_DEPS.$(bld_trg_cpu)) \
+ $($(target)_DEPS.$(bld_trg).$(bld_trg_arch).$(bld_type)) \
+ $($(target)_DEPS.$(bld_trg).$(bld_trg_arch)) \
+ $($(target)_DEPS.$(bld_trg).$(bld_type)) \
+ $($(target)_DEPS.$(bld_trg_arch)) \
+ $($(target)_DEPS.$(bld_trg)) \
+ $($(target)_DEPS.$(bld_type)) \
+ $($(target)_DEPS)
+ local top_orderdeps := \
+ $($(target)_ORDERDEPS.$(bld_trg_cpu)) \
+ $($(target)_ORDERDEPS.$(bld_trg).$(bld_trg_arch).$(bld_type)) \
+ $($(target)_ORDERDEPS.$(bld_trg).$(bld_trg_arch)) \
+ $($(target)_ORDERDEPS.$(bld_trg).$(bld_type)) \
+ $($(target)_ORDERDEPS.$(bld_trg_arch)) \
+ $($(target)_ORDERDEPS.$(bld_trg)) \
+ $($(target)_ORDERDEPS.$(bld_type)) \
+ $($(target)_ORDERDEPS)
+ ifdef $(target)_DEFPATH
+ local top_defpath := $($(target)_DEFPATH)
+ else ifdef $(target)_PATH
+ local top_defpath := $($(target)_PATH)
+ else
+ local top_defpath :=
+ endif
+ ifneq ($(top_defpath),)
+ local top_deps := $(abspathex $(top_deps),$(top_defpath))
+ local top_orderdeps := $(abspathex $(top_orderdeps),$(top_defpath))
+ endif
+
+ # The user have to use double expansion and can only use the above locals. Not 100% optimal...
+ local top_pre_file_cmds := $(evalcall def_fn_prop_get_first_defined,PRE_XFILE_CMDS)
+ local top_post_file_cmds := $(evalcall def_fn_prop_get_first_defined,POST_XFILE_CMDS)
+ local top_pre_sym_cmds := $(evalcall def_fn_prop_get_first_defined,PRE_SYMLINK_CMDS)
+ local top_post_sym_cmds := $(evalcall def_fn_prop_get_first_defined,POST_SYMLINK_CMDS)
+ local top_pre_dir_cmds := $(evalcall def_fn_prop_get_first_defined,PRE_DIRECTORY_CMDS)
+ local top_post_dir_cmds := $(evalcall def_fn_prop_get_first_defined,POST_DIRECTORY_CMDS)
+
+ $(foreach directory, \
+ $($(target)_DIRS) \
+ $($(target)_DIRS.$(bld_trg)) \
+ $($(target)_DIRS.$(bld_trg).$(bld_trg_arch)) \
+ $($(target)_DIRS.$(bld_trg_arch)) \
+ $($(target)_DIRS.$(bld_trg_cpu)) \
+ $($(target)_DIRS.$(bld_type)), \
+ $(evalval def_install_directory))
+
+ local clean_files := \
+ $($(target)_CLEAN) \
+ $($(target)_CLEAN.$(bld_trg)) \
+ $($(target)_CLEAN.$(bld_trg).$(bld_trg_arch)) \
+ $($(target)_CLEAN.$(bld_trg_arch)) \
+ $($(target)_CLEAN.$(bld_trg_cpu)) \
+ $($(target)_CLEAN.$(bld_type))
+
+ local source_type_prefix :=
+ local source_type_mode := $(firstword $(top_mode) a+r,u+w)
+ $(foreach src,\
+ $($(target)_SOURCES) \
+ $($(target)_SOURCES.$(bld_trg)) \
+ $($(target)_SOURCES.$(bld_trg).$(bld_trg_arch)) \
+ $($(target)_SOURCES.$(bld_trg_arch)) \
+ $($(target)_SOURCES.$(bld_trg_cpu)) \
+ $($(target)_SOURCES.$(bld_type)), \
+ $(evalval def_install_src))
+
+ local source_type_prefix := EXEC_
+ local source_type_mode := $(firstword $(top_exec_mode) a+xr,u+w)
+ $(foreach src,\
+ $($(target)_EXEC_SOURCES) \
+ $($(target)_EXEC_SOURCES.$(bld_trg)) \
+ $($(target)_EXEC_SOURCES.$(bld_trg).$(bld_trg_arch)) \
+ $($(target)_EXEC_SOURCES.$(bld_trg_arch)) \
+ $($(target)_EXEC_SOURCES.$(bld_trg_cpu)) \
+ $($(target)_EXEC_SOURCES.$(bld_type)), \
+ $(evalval def_install_src))
+
+ $(foreach src,\
+ $($(target)_SYMLINKS) \
+ $($(target)_SYMLINKS.$(bld_trg)) \
+ $($(target)_SYMLINKS.$(bld_trg).$(bld_trg_arch)) \
+ $($(target)_SYMLINKS.$(bld_trg_arch)) \
+ $($(target)_SYMLINKS.$(bld_trg_cpu)) \
+ $($(target)_SYMLINKS.$(bld_type)), \
+ $(evalval def_install_symlink))
+else # none
+ local clean_files :=
+endif
+
+# The collection targets (staging only).
+local clean_files += $($(target)_1_TARGET)
+$($(target)_1_TARGET): $$($(target)_2_STAGE_TARGETS) | $$($(target)_2_STAGE_DIR_TARGETS) $$(dir $$@)
+ @$(QUIET2)$(APPEND) $@
+
+$(target): $$($(target)_1_TARGET)
+
+# Update Global lists.
+_INSTALLS += $($(target)_1_TARGET)
+_STAGE_FILES += $($(target)_2_STAGE_TARGETS)
+_STAGE_DIRS += $($(target)_2_STAGE_DIR_TARGETS)
+_INSTALLS_FILES += $($(target)_2_INST_TARGETS)
+_INSTALLS_DIRS += $($(target)_2_INST_DIR_TARGETS)
+_CLEAN_FILES += $(clean_files)
+_DIRS += \
+ $($(target)_0_OUTDIR) \
+ $($(target)_BLDDIRS) \
+ $($(target)_BLDDIRS.$(bld_trg)) \
+ $($(target)_BLDDIRS.$(bld_trg).$(bld_trg_arch)) \
+ $($(target)_BLDDIRS.$(bld_trg_arch)) \
+ $($(target)_BLDDIRS.$(bld_trg_cpu)) \
+ $($(target)_BLDDIRS.$(bld_type))
+
+# Deprecated properties.
+INSTARGET_$(target) := $($(target)_2_STAGE_TARGETS)
+INSTARGET_DIRS_$(target) := $($(target)_2_STAGE_DIR_TARGETS)
+
+endef # def_install
+$(eval-opt-var def_install)
+
+## Do pass 1 on the implicit targets and add them to the list.
+$(foreach target, $(_ALL_INSTALLS_IMPLICIT), \
+ $(evalval def_pass1_install))
+_ALL_INSTALLS += $(_ALL_INSTALLS_IMPLICIT)
+
+## Do pass 2 on all install targets.
+$(foreach target, $(_ALL_INSTALLS), \
+ $(evalvalctx def_install))
+
+ifdef KBUILD_PROFILE_SELF
+ $(evalcall def_profile_self, done install targets)
+endif
+
+#
+# Some introspection targets that can be useful for package maintainers.
+#
+.PHONY: kbuild-show-install-files kbuild-show-install-dirs
+kbuild-show-install-files::
+ $(addprefix $(NL)$(TAB)$(QUIET)$(ECHO) , $(subst $(PATH_INS)/,,$(_INSTALLS_FILES)))
+
+kbuild-show-install-dirs::
+ $(addprefix $(NL)$(TAB)$(QUIET)$(ECHO) , $(subst $(PATH_INS)/,,$(_INSTALLS_DIRS)))
+
+kbuild-show-stage-files::
+ $(addprefix $(NL)$(TAB)$(QUIET)$(ECHO) , $(subst $(PATH_STAGE)/,,$(_STAGE_FILES)))
+
+kbuild-show-stage-dirs::
+ $(addprefix $(NL)$(TAB)$(QUIET)$(ECHO) , $(subst $(PATH_STAGE)/,,$(_STAGE_DIRS)))
+
+