summaryrefslogtreecommitdiffstats
path: root/kBuild/footer-pass1.kmk
diff options
context:
space:
mode:
Diffstat (limited to 'kBuild/footer-pass1.kmk')
-rw-r--r--kBuild/footer-pass1.kmk463
1 files changed, 463 insertions, 0 deletions
diff --git a/kBuild/footer-pass1.kmk b/kBuild/footer-pass1.kmk
new file mode 100644
index 0000000..dc31329
--- /dev/null
+++ b/kBuild/footer-pass1.kmk
@@ -0,0 +1,463 @@
+# $Id: footer-pass1.kmk 3417 2020-08-21 10:59:17Z bird $
+## @file
+# kBuild - Footer - Target lists - Pass 1.
+#
+# This pass is for defining variables that might be referenced in
+# properties of other targets.
+#
+
+#
+# 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.
+#
+#
+
+
+# Don't do anything for fetch targets (yet).
+
+##
+# Link prolog for Pass 1.
+#
+# @param $(target) Normalized target name.
+# @param $(EXT) EXE,DLL,SYS,LIB.
+# @param $(EXTPRE) HOST or nothing.
+# @param $(definst) The default _INST value.
+# @param $(tool_prefix) LD or AR.
+# @param $(bld_trg_base_var) TARGET or HOST.
+define def_pass1_link_common
+
+local bld_type := $(firstword $($(target)_BLD_TYPE) $(KBUILD_TYPE))
+local bld_trg := $(firstword $($(target)_BLD_TRG) $(KBUILD_$(bld_trg_base_var)))
+local bld_trg_arch:= $(firstword $($(target)_BLD_TRG_ARCH) $(KBUILD_$(bld_trg_base_var)_ARCH))
+local bld_trg_cpu := $(firstword $($(target)_BLD_TRG_CPU) $(KBUILD_$(bld_trg_base_var)_CPU))
+
+local tool := $(call _TARGET_TOOL,$(target),$(tool_prefix))
+local name := $(firstword\
+ $($(target)_NAME.$(bld_trg).$(bld_trg_arch).$(bld_type))\
+ $($(target)_NAME.$(bld_trg).$(bld_trg_arch))\
+ $($(target)_NAME.$(bld_trg).$(bld_type))\
+ $($(target)_NAME.$(bld_trg_arch))\
+ $($(target)_NAME.$(bld_trg))\
+ $($(target)_NAME.$(bld_type))\
+ $($(target)_NAME)\
+ $(target))
+local outbase := $(call TARGET_BASE,$(name),$(target))
+$(target)_0_OUTDIR:= $(patsubst %/,%,$(dir $(outbase)))
+$(call KB_FN_ASSIGN_DEPRECATED,PATH_$(target),$($(target)_0_OUTDIR), $(target)_0_OUTDIR)
+
+## @todo fix the fun at the last line (AR != LIB => mess).
+local suff := $(firstword \
+ $($(target)_$(EXT)SUFF.$(bld_trg).$(bld_trg_arch))\
+ $($(target)_$(EXT)SUFF.$(bld_trg))\
+ $($(target)_$(EXT)SUFF)\
+ $(TOOL_$(tool)_$(tool_prefix)$(EXT)SUFF.$(bld_trg).$(bld_trg_arch))\
+ $(TOOL_$(tool)_$(tool_prefix)$(EXT)SUFF.$(bld_trg))\
+ $(TOOL_$(tool)_$(tool_prefix)$(EXT)SUFF)\
+ $(if $(eq $(tool_prefix),AR),$(SUFF_LIB),$($(EXTPRE)SUFF_$(EXT))) )
+local out := $(outbase)$(suff)
+
+# Object directory target variable.
+$(target)_1_TARGET := $(out)
+$(call KB_FN_ASSIGN_DEPRECATED,TARGET_$(target),$($(target)_1_TARGET), $(target)_1_TARGET)
+
+# Staging and install directory target variables.
+local insttype := $(firstword \
+ $($(target)_INSTTYPE.$(bld_trg).$(bld_trg_arch).$(bld_type)) \
+ $($(target)_INSTTYPE.$(bld_trg).$(bld_trg_arch)) \
+ $($(target)_INSTTYPE.$(bld_trg).$(bld_type)) \
+ $($(target)_INSTTYPE.$(bld_trg_arch)) \
+ $($(target)_INSTTYPE.$(bld_trg_cpu)) \
+ $($(target)_INSTTYPE.$(bld_trg)) \
+ $($(target)_INSTTYPE.$(bld_type)) \
+ $($(target)_INSTTYPE) \
+ )
+ifeq ($(insttype),)
+ ifneq ($(firstword \
+ $($(target)_NOINST) \
+ $($(target)_NOINST.$(bld_trg)) \
+ $($(target)_NOINST.$(bld_trg).$(bld_trg_arch)) \
+ $($(target)_NOINST.$(bld_trg).$(bld_trg_arch).$(bld_type)) \
+ $($(target)_NOINST.$(bld_trg_arch)) \
+ $($(target)_NOINST.$(bld_trg_cpu)) \
+ $($(target)_NOINST.$(bld_type)) ),)
+ local insttype := none
+ else
+ local insttype := both
+ endif
+endif
+$(target)_1_INSTTYPE := $(insttype)
+
+local inst := $(strip $(firstdefined \
+ $(target)_INST.$(bld_trg).$(bld_trg_arch).$(bld_type) \
+ $(target)_INST.$(bld_trg).$(bld_trg_arch) \
+ $(target)_INST.$(bld_trg).$(bld_type) \
+ $(target)_INST.$(bld_trg_arch) \
+ $(target)_INST.$(bld_trg_cpu) \
+ $(target)_INST.$(bld_trg) \
+ $(target)_INST.$(bld_type) \
+ $(target)_INST \
+ definst \
+ ,value))
+local stage := $(strip $(firstdefined \
+ $(target)_STAGE.$(bld_trg).$(bld_trg_arch).$(bld_type) \
+ $(target)_STAGE.$(bld_trg).$(bld_trg_arch) \
+ $(target)_STAGE.$(bld_trg).$(bld_type) \
+ $(target)_STAGE.$(bld_trg_arch) \
+ $(target)_STAGE.$(bld_trg_cpu) \
+ $(target)_STAGE.$(bld_trg) \
+ $(target)_STAGE.$(bld_type) \
+ $(target)_STAGE \
+ inst \
+ ,value))
+if1of ($(insttype), stage both)
+ $(target)_1_STAGE := $(stage)
+ if "$(substr $(stage),-1,1)" == "/" # Multicast support requires addprefix/suffix.
+ $(target)_1_STAGE_TARGET := $(addprefix $(PATH_STAGE)/,$(addsuffix $(notdir $(out)),$(stage)))
+ else if "$(stage)" == ""
+ $(target)_1_STAGE_TARGET := $(PATH_STAGE)/$(notdir $(out))
+ else
+ $(target)_1_STAGE_TARGET := $(addprefix $(PATH_STAGE)/,$(stage))
+ endif
+else if1of ($(insttype), none)
+ $(target)_1_STAGE :=
+ $(target)_1_STAGE_TARGET :=
+else
+ $(error kBuild: Unknown value '$(insttype)' for '$(target)_INSTTYPE'. Valid values are 'none', 'both' and 'stage'.)
+endif
+INSTARGET_$(target) := $($(target)_1_STAGE_TARGET)
+
+if1of ($(insttype), both)
+ $(target)_1_INST := $(inst)
+ if "$(substr $(inst),-1,1)" == "/" # Multicast support requires addprefix/suffix.
+ $(target)_1_INST_TARGET := $(addprefix $(PATH_INS)/,$(addsuffix $(notdir $(out)),$(inst)))
+ else if "$(inst)" == ""
+ $(target)_1_INST_TARGET := $(PATH_INS)/$(notdir $(out))
+ else
+ $(target)_1_INST_TARGET := $(addprefix $(PATH_INS)/,$(inst))
+ endif
+else
+ $(target)_1_INST :=
+ $(target)_1_INST_TARGET :=
+endif
+
+# Debug info related stuff.
+local debug_insttype := $(firstword \
+ $($(target)_DEBUG_INSTTYPE.$(bld_trg).$(bld_trg_arch).$(bld_type)) \
+ $($(target)_DEBUG_INSTTYPE.$(bld_trg).$(bld_trg_arch)) \
+ $($(target)_DEBUG_INSTTYPE.$(bld_trg).$(bld_type)) \
+ $($(target)_DEBUG_INSTTYPE.$(bld_trg_arch)) \
+ $($(target)_DEBUG_INSTTYPE.$(bld_trg_cpu)) \
+ $($(target)_DEBUG_INSTTYPE.$(bld_trg)) \
+ $($(target)_DEBUG_INSTTYPE.$(bld_type)) \
+ $($(target)_DEBUG_INSTTYPE) \
+ $(insttype) )
+$(target)_1_DEBUG_INSTTYPE := $(debug_insttype)
+
+if1of ($(debug_insttype), stage both)
+ local debug_stage := $(firstdefined \
+ $(target)_DEBUG_STAGE.$(bld_trg).$(bld_trg_arch).$(bld_type) \
+ $(target)_DEBUG_STAGE.$(bld_trg).$(bld_trg_arch) \
+ $(target)_DEBUG_STAGE.$(bld_trg).$(bld_type) \
+ $(target)_DEBUG_STAGE.$(bld_trg_arch) \
+ $(target)_DEBUG_STAGE.$(bld_trg_cpu) \
+ $(target)_DEBUG_STAGE.$(bld_trg) \
+ $(target)_DEBUG_STAGE.$(bld_type) \
+ $(target)_DEBUG_STAGE \
+ $(target)_DEBUG_INST.$(bld_trg).$(bld_trg_arch).$(bld_type) \
+ $(target)_DEBUG_INST.$(bld_trg).$(bld_trg_arch) \
+ $(target)_DEBUG_INST.$(bld_trg).$(bld_type) \
+ $(target)_DEBUG_INST.$(bld_trg_arch) \
+ $(target)_DEBUG_INST.$(bld_trg_cpu) \
+ $(target)_DEBUG_INST.$(bld_trg) \
+ $(target)_DEBUG_INST.$(bld_type) \
+ $(target)_DEBUG_INST)
+ ifneq ($(debug_stage),)
+ $(target)_1_DEBUG_STAGE := $($(debug_stage))
+ else
+ $(target)_1_DEBUG_STAGE := $(addprefix $(STAGE_DEBUG),$(stage))
+ endif
+ ifndef $(target)_1_DEBUG_STAGE
+ $(target)_1_DEBUG_STAGE := ./
+ endif
+else if1of ($(debug_insttype), none)
+ $(target)_1_DEBUG_STAGE :=
+else
+ $(error kBuild: Unknown value '$(debug_insttype)' for '$(target)_DEBUG_INSTTYPE'. Valid values are 'none', 'both' and 'stage'.)
+endif
+
+if1of ($(debug_insttype), both)
+ local debug_inst := $(firstdefined \
+ $(target)_DEBUG_INST.$(bld_trg).$(bld_trg_arch).$(bld_type) \
+ $(target)_DEBUG_INST.$(bld_trg).$(bld_trg_arch) \
+ $(target)_DEBUG_INST.$(bld_trg).$(bld_type) \
+ $(target)_DEBUG_INST.$(bld_trg_arch) \
+ $(target)_DEBUG_INST.$(bld_trg_cpu) \
+ $(target)_DEBUG_INST.$(bld_trg) \
+ $(target)_DEBUG_INST.$(bld_type) \
+ $(target)_DEBUG_INST)
+ ifneq ($(debug_inst),)
+ $(target)_1_DEBUG_INST := $($(debug_inst))
+ else
+ $(target)_1_DEBUG_INST := $(addprefix $(INST_DEBUG),$(inst))
+ endif
+ ifndef $(target)_1_DEBUG_INST
+ $(target)_1_DEBUG_INST := ./
+ endif
+else
+ $(target)_1_DEBUG_INST :=
+endif
+#$(warning $(NLTAB)$(target)_1_DEBUG_INST=$($(target)_1_DEBUG_INST)$(NLTAB)$(target)_1_DEBUG_STAGE=$($(target)_1_DEBUG_STAGE)$(NLTAB)insttype=$(insttype)$(NLTAB)debug_insttype=$(debug_insttype))
+
+endef # def_pass1_link_common
+$(eval-opt-var def_pass1_link_common)
+
+
+#
+# BLDPROGS (Pass 1)
+#
+define def_pass1_bldprog
+# set NOINST if not forced installation before doing the usual stuff.
+ifndef $(target)_INSTTYPE
+ ifndef $(target)_INST
+ ifndef $(target)_STAGE
+$(target)_INSTTYPE := none
+ endif
+ endif
+endif
+$(evalvalctx def_pass1_link_common)
+endef
+
+EXT := EXE
+EXTPRE := HOST
+definst := $(INST_BIN)
+tool_prefix := LD
+bld_trg_base_var := HOST
+$(foreach target, $(_ALL_BLDPROGS), \
+ $(evalvalctx def_pass1_bldprog))
+
+
+#
+# LIBRARIES (Pass 1)
+#
+EXT := LIB
+EXTPRE :=
+definst := $(INST_LIB)
+tool_prefix := AR
+bld_trg_base_var := TARGET
+$(foreach target, $(_ALL_LIBRARIES), \
+ $(evalvalctx def_pass1_link_common))
+
+
+#
+# DLLS (Pass 1)
+#
+EXT := DLL
+EXTPRE :=
+definst := $(INST_DLL)
+tool_prefix := LD
+bld_trg_base_var := TARGET
+$(foreach target, $(_ALL_DLLS), \
+ $(evalvalctx def_pass1_link_common))
+
+
+#
+# IMPORT LIBRARIES (Pass 1)
+#
+# - On OS/2 and windows these are libraries.
+# - On other platforms they are fake DLLs.
+#
+if1of ($(KBUILD_TARGET), nt os2 win win64 win32)
+ EXT := LIB
+ EXTPRE :=
+ definst := $(INST_LIB)
+ tool_prefix := AR
+ bld_trg_base_var := TARGET
+ $(foreach target, $(_ALL_IMPORT_LIBS), \
+ $(evalvalctx def_pass1_link_common))
+else
+ EXT := DLL
+ EXTPRE :=
+ definst := $(INST_DLL)
+ tool_prefix := LD
+ bld_trg_base_var := TARGET
+ $(foreach target, $(_ALL_IMPORT_LIBS), \
+ $(evalvalctx def_pass1_link_common))
+endif
+
+
+#
+# PROGRAMS (Pass 1)
+#
+EXT := EXE
+EXTPRE :=
+definst := $(INST_BIN)
+tool_prefix := LD
+bld_trg_base_var := TARGET
+$(foreach target, $(_ALL_PROGRAMS), \
+ $(evalvalctx def_pass1_link_common))
+
+
+#
+# SYSMODS (Pass 1)
+#
+EXT := SYS
+EXTPRE :=
+definst := $(INST_SYS)
+tool_prefix := LD
+bld_trg_base_var := TARGET
+$(foreach target, $(_ALL_SYSMODS), \
+ $(evalvalctx def_pass1_link_common))
+
+
+#
+# MISCBINS (Pass 1)
+#
+EXT := BIN
+EXTPRE :=
+definst := $(INST_BIN)
+tool_prefix := LD
+bld_trg_base_var := TARGET
+$(foreach target, $(_ALL_MISCBINS), \
+ $(evalvalctx def_pass1_link_common))
+
+
+#
+# INSTALLS (Pass 1)
+# Note! INSTARGET_* for INSTALLS aren't available until later.
+#
+define def_pass1_install
+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))
+# _1_TARGET
+$(target)_1_TARGET := $(PATH_TARGET)/$(target).ins
+$(call KB_FN_ASSIGN_DEPRECATED,TARGET_$(target),$($(target)_1_TARGET), $(target)_1_TARGET)
+
+# Determine and set 1_INSTTYPE.
+local insttype := $(firstword \
+ $($(target)_INSTTYPE.$(bld_trg).$(bld_trg_arch).$(bld_type)) \
+ $($(target)_INSTTYPE.$(bld_trg).$(bld_trg_arch)) \
+ $($(target)_INSTTYPE.$(bld_trg).$(bld_type)) \
+ $($(target)_INSTTYPE.$(bld_trg_arch)) \
+ $($(target)_INSTTYPE.$(bld_trg_cpu)) \
+ $($(target)_INSTTYPE.$(bld_trg)) \
+ $($(target)_INSTTYPE.$(bld_type)) \
+ $($(target)_INSTTYPE) \
+ )
+ifeq ($(insttype),)
+ ifneq ($(firstword \
+ $($(target)_NOINST) \
+ $($(target)_NOINST.$(bld_trg)) \
+ $($(target)_NOINST.$(bld_trg).$(bld_trg_arch)) \
+ $($(target)_NOINST.$(bld_trg).$(bld_trg_arch).$(bld_type)) \
+ $($(target)_NOINST.$(bld_trg_arch)) \
+ $($(target)_NOINST.$(bld_trg_cpu)) \
+ $($(target)_NOINST.$(bld_type)) ),)
+ local insttype := none
+ else
+ local insttype := both
+ endif
+endif
+ifn1of ($(insttype), none both stage)
+ $(error kBuild: Unknown value '$(insttype)' for '$(target)_INSTTYPE'. Valid values are 'none', 'both' and 'stage'.)
+endif
+$(target)_1_INSTTYPE := $(insttype)
+
+# Determine the actual INST and STAGE sub-dirs to use for this target.
+if1of ($(insttype), stage both)
+ local stage := $(strip $(firstdefined \
+ $(target)_STAGE.$(bld_trg).$(bld_trg_arch).$(bld_type) \
+ $(target)_STAGE.$(bld_trg).$(bld_trg_arch) \
+ $(target)_STAGE.$(bld_trg).$(bld_type) \
+ $(target)_STAGE.$(bld_trg_arch) \
+ $(target)_STAGE.$(bld_trg_cpu) \
+ $(target)_STAGE.$(bld_trg) \
+ $(target)_STAGE.$(bld_type) \
+ $(target)_STAGE \
+ $(target)_INST.$(bld_trg).$(bld_trg_arch).$(bld_type) \
+ $(target)_INST.$(bld_trg).$(bld_trg_arch) \
+ $(target)_INST.$(bld_trg).$(bld_type) \
+ $(target)_INST.$(bld_trg_arch) \
+ $(target)_INST.$(bld_trg_cpu) \
+ $(target)_INST.$(bld_trg) \
+ $(target)_INST.$(bld_type) \
+ $(target)_INST \
+ definst \
+ ,value))
+ if $(words $(stage)) > 1
+ $(warning kBuild: The STAGE/INST property of install '$(target)' specifies multiple location, that is not supported.)
+ local stage := $(word 1, $(stage))
+ endif
+ $(target)_1_STAGE := $(stage)
+else
+ $(target)_1_STAGE = $(error _1_STAGE not used)
+endif
+
+if1of ($(insttype), both)
+ local inst := $(strip $(firstdefined \
+ $(target)_INST.$(bld_trg).$(bld_trg_arch).$(bld_type) \
+ $(target)_INST.$(bld_trg).$(bld_trg_arch) \
+ $(target)_INST.$(bld_trg).$(bld_type) \
+ $(target)_INST.$(bld_trg_arch) \
+ $(target)_INST.$(bld_trg_cpu) \
+ $(target)_INST.$(bld_trg) \
+ $(target)_INST.$(bld_type) \
+ $(target)_INST \
+ definst \
+ ,value))
+ if $(words $(inst)) > 1
+ $(warning kBuild: The INST property of install '$(target)' specifies multiple location, that is not supported.)
+ local inst := $(word 1, $(inst))
+ endif
+ ifneq ($(root $(stage)),)
+ $(error kBuild: The effective INST property of install '$(target)' should not start with a root specification)
+ endif
+ $(target)_1_INST := $(inst)
+else
+ $(target)_1_INST = $(error _1_INST not used)
+endif
+
+# Block properties that we put off setting until pass 2 for INSTALLS.
+$(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!).)
+$(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!).)
+INSTARGET_$(target) = $(error The 'INSTARGET_' is deprecated and besides, it is being accessed to early. Consider '_2_STAGE_TARGETS' or '_2_INST_TARGETS'.)
+
+# INSTARGET_ later.
+# PATH_*
+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)
+endef # def_pass1_install
+$(eval-opt-var def_pass1_install)
+
+$(foreach target, $(_ALL_INSTALLS), \
+ $(evalvalctx def_pass1_install))
+
+ifdef KBUILD_PROFILE_SELF
+ $(evalcall def_profile_self, done pass 1)
+endif
+
+