VirtualBox

Changeset 985 in kBuild


Ignore:
Timestamp:
May 29, 2007 1:16:10 AM (18 years ago)
Author:
bird
Message:

Working on inhertiance. Added target inherting but it's a bit restricted by the expansion order currently (it not tested either).

Location:
trunk/kBuild
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/kBuild/footer.kmk

    r984 r985  
    3333#
    3434
     35# All targets of each types.
     36_ALL_BLDPROGS    := $(BLDPROGS)    $(BLDPROGS.$(BUILD_PLATFORM))    $(BLDPROGS.$(BUILD_PLATFORM).$(BUILD_PLATFORM_ARCH))    $(BLDPROGS.$(BUILD_PLATFORM_ARCH))  $(BLDPROGS.$(BUILD_PLATFORM_CPU))   $(BLDPROGS.$(BUILD_TYPE))
     37_ALL_LIBRARIES   := $(LIBRARIES)   $(LIBRARIES.$(BUILD_TARGET))     $(LIBRARIES.$(BUILD_TARGET).$(BUILD_TARGET_ARCH))       $(LIBRARIES.$(BUILD_TARGET_ARCH))   $(LIBRARIES.$(BUILD_TARGET_CPU))    $(LIBRARIES.$(BUILD_TYPE))
     38_ALL_IMPORT_LIBS := $(IMPORT_LIBS) $(IMPORT_LIBS.$(BUILD_TARGET))   $(IMPORT_LIBS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH))     $(IMPORT_LIBS.$(BUILD_TARGET_ARCH)) $(IMPORT_LIBS.$(BUILD_TARGET_CPU))  $(IMPORT_LIBS.$(BUILD_TYPE))
     39_ALL_DLLS        := $(DLLS)        $(DLLS.$(BUILD_TARGET))          $(DLLS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH))            $(DLLS.$(BUILD_TARGET_ARCH))        $(DLLS.$(BUILD_TARGET_CPU))         $(DLLS.$(BUILD_TYPE))
     40_ALL_PROGRAMS    := $(PROGRAMS)    $(PROGRAMS.$(BUILD_TARGET))      $(PROGRAMS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH))        $(PROGRAMS.$(BUILD_TARGET_ARCH))    $(PROGRAMS.$(BUILD_TARGET_CPU))     $(PROGRAMS.$(BUILD_TYPE))
     41_ALL_SYSMODS     := $(SYSMODS)     $(SYSMODS.$(BUILD_TARGET))       $(SYSMODS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH))         $(SYSMODS.$(BUILD_TARGET_ARCH))     $(SYSMODS.$(BUILD_TARGET_CPU))      $(SYSMODS.$(BUILD_TYPE))
     42_ALL_OTHERS      := $(OTHERS)      $(OTHERS.$(BUILD_TARGET))        $(OTHERS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH))          $(OTHERS.$(BUILD_TARGET_ARCH))      $(OTHERS.$(BUILD_TARGET_CPU))       $(OTHERS.$(BUILD_TYPE))
     43_ALL_INSTALLS    := $(INSTALLS)    $(INSTALLS.$(BUILD_TARGET))      $(INSTALLS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH))        $(INSTALLS.$(BUILD_TARGET_ARCH))    $(INSTALLS.$(BUILD_TARGET_CPU))     $(INSTALLS.$(BUILD_TYPE))
     44_ALL_FETCHES     := $(FETCHES)     $(FETCHES.$(BUILD_TARGET))       $(FETCHES.$(BUILD_TARGET).$(BUILD_TARGET_ARCH))         $(FETCHES.$(BUILD_TARGET_ARCH))     $(FETCHES.$(BUILD_TARGET_CPU))      $(FETCHES.$(BUILD_TYPE))
     45_ALL_PATCHES     := $(PATCHES)     $(PATCHES.$(BUILD_TARGET))       $(PATCHES.$(BUILD_TARGET).$(BUILD_TARGET_ARCH))         $(PATCHES.$(BUILD_TARGET_ARCH))     $(PATCHES.$(BUILD_TARGET_CPU))      $(PATCHES.$(BUILD_TYPE))
     46
    3547# all targets.
    36 _ALL_TARGETS := \
    37         $(FETCHES)     $(FETCHES.$(BUILD_TARGET))       $(FETCHES.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) \
    38         $(PATCHES)     $(PATCHES.$(BUILD_TARGET))       $(PATCHES.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) \
    39         $(BLDPROGS)    $(BLDPROGS.$(BUILD_PLATFORM))    $(BLDPROGS.$(BUILD_PLATFORM).$(BUILD_PLATFORM_ARCH)) \
    40         $(LIBRARIES)   $(LIBRARIES.$(BUILD_TARGET))     $(LIBRARIES.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) \
    41         $(IMPORT_LIBS) $(IMPORT_LIBS.$(BUILD_TARGET))   $(IMPORT_LIBS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) \
    42         $(DLLS)        $(DLLS.$(BUILD_TARGET))          $(DLLS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) \
    43         $(PROGRAMS)    $(PROGRAMS.$(BUILD_TARGET))      $(PROGRAMS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) \
    44         $(SYSMODS)     $(SYSMODS.$(BUILD_TARGET))       $(SYSMODS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) \
    45         $(INSTALLS)    $(INSTALLS.$(BUILD_TARGET))      $(INSTALLS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) \
    46         $(OTHERS)      $(OTHERS.$(BUILD_TARGET))        $(OTHERS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH))
     48_ALL_TARGETS = \
     49        $(_ALL_FETCHES) \
     50        $(_ALL_PATCHES) \
     51        $(_ALL_BLDPROGS) \
     52        $(_ALL_LIBRARIES) \
     53        $(_ALL_IMPORT_LIBS) \
     54        $(_ALL_DLLS) \
     55        $(_ALL_PROGRAMS) \
     56        $(_ALL_SYSMODS) \
     57        $(_ALL_INSTALLS) \
     58        $(_ALL_OTHERS)
    4759
    4860# all $(BUILD_TARGET) targets.
    49 _ALL_BUILD_TARGET_TARGETS := \
    50         $(FETCHES)     $(FETCHES.$(BUILD_TARGET))       $(FETCHES.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) \
    51         $(PATCHES)     $(PATCHES.$(BUILD_TARGET))       $(PATCHES.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) \
    52         $(LIBRARIES)   $(LIBRARIES.$(BUILD_TARGET))     $(LIBRARIES.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) \
    53         $(IMPORT_LIBS) $(IMPORT_LIBS.$(BUILD_TARGET))   $(IMPORT_LIBS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) \
    54         $(DLLS)        $(DLLS.$(BUILD_TARGET))          $(DLLS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) \
    55         $(PROGRAMS)    $(PROGRAMS.$(BUILD_TARGET))      $(PROGRAMS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) \
    56         $(SYSMODS)     $(SYSMODS.$(BUILD_TARGET))       $(SYSMODS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) \
    57         $(INSTALLS)    $(INSTALLS.$(BUILD_TARGET))      $(INSTALLS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) \
    58         $(OTHERS)      $(OTHERS.$(BUILD_TARGET))        $(OTHERS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH))
    59 
    60 # all $(BUILD_TARGET) targets.
    61 _ALL_BUILD_PLATFORM_TARGETS := \
    62         $(BLDPROGS)    $(BLDPROGS.$(BUILD_PLATFORM))    $(BLDPROGS.$(BUILD_PLATFORM).$(BUILD_PLATFORM_ARCH))
    63 
    64 ## all linkable targets.
    65 #_ALL_LINKABLE_TARGETS := \
    66 #       $(BLDPROGS)    $(BLDPROGS.$(BUILD_PLATFORM))    $(BLDPROGS.$(BUILD_PLATFORM).$(BUILD_PLATFORM_ARCH)) \
    67 #       $(DLLS)        $(DLLS.$(BUILD_TARGET))          $(DLLS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) \
    68 #       $(PROGRAMS)    $(PROGRAMS.$(BUILD_TARGET))      $(PROGRAMS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) \
    69 #       $(SYSMODS)     $(SYSMODS.$(BUILD_TARGET))       $(SYSMODS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH))
    70 #
    71 ## all library targets.
    72 #_ALL_LIBRARY_TARGETS := \
    73 #       $(LIBRARIES)   $(LIBRARIES.$(BUILD_TARGET))     $(LIBRARIES.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) \
    74 #       $(IMPORT_LIBS) $(IMPORT_LIBS.$(BUILD_TARGET))   $(IMPORT_LIBS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) \
     61_ALL_BUILD_TARGET_TARGETS = \
     62        $(_ALL_FETCHES) \
     63        $(_ALL_PATCHES) \
     64        $(_ALL_LIBRARIES) \
     65        $(_ALL_IMPORT_LIBS) \
     66        $(_ALL_DLLS) \
     67        $(_ALL_PROGRAMS) \
     68        $(_ALL_SYSMODS) \
     69        $(_ALL_INSTALLS) \
     70        $(_ALL_OTHERS)
     71
     72# all $(BUILD_PLATFORM) targets.
     73_ALL_BUILD_PLATFORM_TARGETS = \
     74        $(_ALL_BLDPROGS)
    7575
    7676# all targets making use of srcname.
    77 _ALL_SRCNAME_TARGETS := \
    78         $(FETCHES)     $(FETCHES.$(BUILD_TARGET))       $(FETCHES.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) \
    79         $(PATCHES)     $(PATCHES.$(BUILD_TARGET))       $(PATCHES.$(BUILD_TARGET).$(BUILD_TARGET_ARCH))
     77_ALL_SRCNAME_TARGETS = \
     78        $(_ALL_FETCHES) \
     79        $(_ALL_PATCHES)
    8080
    8181# dependency files.
     
    151151
    152152
    153 
    154 #
    155 # Check syntax which leads to weird syntax errors.
    156 #
    157 
    158 ## Check
    159 # @param        $(target)       Target name.
    160 define def_check_target
    161 ifneq ("$($(target)_TEMPLATE)","$(strip $($(target)_TEMPLATE))")
    162 $$(error $(target) have an incorrect template name. Remove any tabs!)
    163 endif
    164 endef
    165 $(foreach target, $(_ALL_TARGETS),$(eval $(def_check_target)))
    166 
    167 
    168 #
    169 # Target inheritance.
    170 #
    171 # $ (foreach ...
    172 
    173 
    174 #
    175 # Include templates
     153## Inherit one template property in a non-accumulative manner.
     154# @param    $(prop)         Property name
     155# @param    $(src)          Source (parent) object.
     156# @param    $(trg)          Target (child) object.
     157# @remark Not all properties has all the variations, but making the correct
     158#         exceptions will only complicate matters and probably not gain much speed.
     159define def_inherit_one
     160ifdef $(src)_$(prop)
     161 ifndef $(trg)_$(prop)
     162  $(trg)_$(prop) = $($(src)_$(prop))
     163  #$ (warning dbg-inherit: $(trg)_$(prop) = $($(src)_$(prop)) )
     164 endif
     165endif
     166endef # def_inherit_one
     167
     168## Inherit one template property in a non-accumulative manner.
     169# @param    $(prop)         Property name
     170# @param    $(src)          Source (parent) object.
     171# @param    $(trg)          Target (child) object.
     172# @remark Not all properties has all the variations, but making the correct
     173#         exceptions will only complicate matters and probably not gain much speed.
     174# @todo   Check how/if this differs from def_inherit_one.
     175define def_inherit_one_now
     176ifdef $(src)_$(prop)
     177 ifndef $(trg)_$(prop)
     178  $(trg)_$(prop) := $($(src)_$(prop))
     179  #$ (warning dbg-inherit-now: $(trg)_$(prop) = $($(src)_$(prop)) )
     180 endif
     181endif
     182endef # def_inherit_one_now
     183
     184## Inherit one template property in a non-accumulative manner, deferred expansion.
     185# @param    $(prop)         Property name
     186# @param    $(src)          Source
     187# @param    $(trg)          Target
     188# @remark This define relies on double evaluation
     189define def_inherit_one_deferred
     190ifdef $(src)_$(prop)
     191 ifndef $(trg)_$(prop)
     192  $(trg)_$(prop) = $$($(src)_$(prop))
     193  #$ (warning dbg-inherit-def: $(trg)_$(prop) = $($(src)_$(prop)) )
     194 endif
     195endif
     196endef # def_inherit_one_deferred
     197
     198## Generic inheritance for use with targets templates and tools.
     199# @param    trg                 Object to consider for inheriting.
     200# @param    src_prefix          What to prefix the value found in EXTENDS with to get the object.
     201# @param    properties          List of the properties with straight expansion.
     202# @param    properties_now      List of the properties with immediate expansion.
     203# @param    properties_deferred List of the properties with deferred expansion (e.g. function).
     204define def_inherit
     205src := $(strip $($(trg)_EXTENDS))
     206ifneq ($(src),)
     207 ifndef $(trg)_EXTENDS_STATUS_
     208  $(trg)_EXTENDS_STATUS_ := 0
     209  src := $(src_prefix)$(src)
     210
     211  # Recursivly process the parent (src) if it's inherting from somebody too.
     212  ifdef $(src)_EXTENDS
     213   ifneq ($($(src)_EXTENDS_STATUS_),42)
     214    # 'foreach' will create 'trg' in a new variable context hiding
     215        # out current variable. 'src' OTOH will be overwritten.
     216    #$ (warning def_inherit: recursing into $(src) from $(trg))
     217    $(foreach trg, $(src), $(eval $(value def_inherit)))
     218    src := $(src_prefix)$(strip $($(trg)_EXTENDS))
     219   endif
     220  endif
     221
     222  # Inherit the properties and mark the trg done.
     223  #$ (warning def_inherit: trg=$(trg) src=$(src))
     224  $(foreach prop, $(properties),          $(eval $(def_inherit_one)))
     225  $(foreach prop, $(properties_now),      $(eval $(def_inherit_one_now)))
     226  $(foreach prop, $(properties_deferred), $(eval $(def_inherit_one_deferred)))
     227  $(trg)_EXTENDS_STATUS_ := 42
     228 else
     229  # Check for inheritance loops.
     230  ifneq ($(target)_EXTENDS_STATUS_),42)
     231   $(error kBuild: Target inheritance loop! target=$(target))
     232  endif
     233 endif
     234endif
     235endef # def_inherit
     236
     237
     238#
     239# Determin all the templates that is being used and make
     240# sure they are present.
    176241#
    177242_TEMPLATES := $(TEMPLATE)
    178243define def_templates
    179244ifdef $(target)_TEMPLATE
    180 _TEMPLATES += $($(target)_TEMPLATE)
    181 endif
    182 endef
     245 ifneq ("$($(target)_TEMPLATE)","$(strip $($(target)_TEMPLATE))")
     246  $$(error kBuild: The template name of target '$(target)' contains tabs ($($(target)_TEMPLATE))). Please remove them)
     247 endif
     248 _TEMPLATES += $($(target)_TEMPLATE)
     249endif
     250endef # def_templates
    183251$(foreach target, $(_ALL_TARGETS), $(eval $(def_templates)))
    184252_TEMPLATES := $(sort $(_TEMPLATES))
    185 # $ (warning dbg: _TEMPLATES=$(_TEMPLATES))
    186253
    187254define def_templates_include
    188255ifndef TEMPLATE_$(template)
    189 include $(firstword $(foreach path, $(TEMPLATE_PATHS) $(PATH_KBUILD)/templates/, $(wildcard $(path)/$(template).kmk)))
    190 endif
    191 endef
     256 TEMPLATE_$(template)_INCLUDE_FILE_ := $(firstword $(foreach path, $(TEMPLATE_PATHS) $(PATH_KBUILD)/templates/, $(wildcard $(path)/$(template).kmk)))
     257 ifneq ($(TEMPLATE_$(template)_INCLUDE_FILE_),)
     258  include $(TEMPLATE_$(template)_INCLUDE_FILE_)
     259 else
     260  $$(error kBuild: Cannot find template '$(template)')
     261 endif
     262endif
     263endef # def_templates_include
    192264$(foreach template, $(_TEMPLATES), $(eval $(def_templates)))
    193265
     266#$ (warning dbg _TEMPLATES := $(_TEMPLATES))
     267
     268
     269#
     270# Determin the BLD_TRG_* keywords required for correct inherting.
     271#
     272# This means walking all the template and target lists in order to
     273# pick up all BLD_TRG_* attributes.
     274#
     275_BLD_TYPES   := $(BUILD_TYPE)
     276_BLD_TARGETS := $(BUILD_TARGET) $(BUILD_PLATFORMS)
     277_BLD_ARCHES  := $(BUILD_TARGET_ARCH) $(BUILD_PLATFORM_ARCH)
     278_BLD_CPUS    := $(BUILD_TARGET_CPU) $(BUILD_PLATFORM_CPU)
     279
     280define def_collect_bld_xyz
     281ifdef ($(src)_BLD_TYPE)
     282 _BLD_TYPE += $($(src)_BLD_TYPE)
     283endif
     284ifdef ($(src)_BLD_TRG)
     285 _BLD_TARGETS += $($(src)_BLD_TRG)
     286endif
     287ifdef ($(src)_BLD_TRG_ARCH)
     288 _BLD_ARCHES += $($(src)_BLD_TRG_ARCH)
     289endif
     290ifdef ($(src)_BLD_TRG_CPU)
     291 _BLD_CPU += $($(src)_BLD_TRG_CPU)
     292endif
     293endef # def_collect_bld_xyz
     294$(foreach src, $(addprefix TEMPLATE_, $(_TEMPLATES)) $(_ALL_TARGETS)\
     295        ,$(eval $(def_collect_bld_xyz)))
     296
     297# drop duplicate values
     298_BLD_TYPES   := $(sort $(_BLD_TYPES))
     299_BLD_TARGETS := $(sort $(_BLD_TARGETS))
     300_BLD_ARCHES  := $(sort $(_BLD_ARCHES))
     301_BLD_CPUS    := $(sort $(_BLD_CPUS))
     302
     303# Construct all the possible keywords.
     304_KEYWORDS := $(_BLD_TYPES) $(_BLD_TARGETS) $(_BLD_ARCHES) $(_BLD_CPUS) \
     305        $(foreach bld_trg,$(_BLD_TARGETS),$(addprefix $(bld_trg).,$(_BLD_ARCHES)))
     306# $ (warning dbg _KEYWORDS := $(_KEYWORDS))
     307
     308
     309#
     310# Target inheritance.
     311#
     312# This has to be done on a per target list basis as to avoid adding
     313# incorrect properties that will wast memory, time, and may confuse
     314# later strictness checks. This also has to be done *before* templates
     315# are applied to the targets. Since we're doing that part rather
     316# early on, the target inheritance feature is a bit restricted at
     317# the moment. However, this will be addressed in a little(?) while.
     318#
     319
     320src_prefix :=
     321## combines the specified properties $(1) with the $(_KEYWORDS).
     322_COMB_KEY_PROP = $(1)  $(foreach keyword,$(_KEYWORDS), $(addsuffix .$(keyword), $(1)))
     323
     324# Fetches.
     325properties          := $(call _COMB_KEY_PROP,$(PROPS_FETCHES_SINGLE))
     326properties_now      := $(call _COMB_KEY_PROP,$(PROPS_FETCHES_ACCUMULATE_R) $(PROPS_FETCHES_ACCUMULATE_L))
     327properties_deferred := $(call _COMB_KEY_PROP,$(PROPS_FETCHES_DEFERRED))
     328$(foreach trg, $(_ALL_FETCHES),$(eval $(value def_inherit)))
     329
     330## Patches. - not implemented yet.
     331#properties          := $(call _COMB_KEY_PROP,$(PROPS_PATCHES_SINGLE))
     332#properties_now      := $(call _COMB_KEY_PROP,$(PROPS_PATCHES_ACCUMULATE_R) $(PROPS_PATCHES_ACCUMULATE_L))
     333#properties_deferred := $(call _COMB_KEY_PROP,$(PROPS_PATCHES_DEFERRED))
     334#$(foreach trg, $(_ALL_PATCHES),$(eval $(value def_inherit)))
     335
     336# Programs and build programs.
     337properties          := $(call _COMB_KEY_PROP,$(PROPS_PROGRAMS_SINGLE))
     338properties_now      := $(call _COMB_KEY_PROP,$(PROPS_PROGRAMS_ACCUMULATE_R) $(PROPS_PROGRAMS_ACCUMULATE_L))
     339properties_deferred := $(call _COMB_KEY_PROP,$(PROPS_PROGRAMS_DEFERRED))
     340$(foreach trg, $(_ALL_BLDPROGS) $(_ALL_PROGRAMS),$(eval $(value def_inherit)))
     341
     342# Libraries and import libraries.
     343properties          := $(call _COMB_KEY_PROP,$(PROPS_LIBRARIES_SINGLE))
     344properties_now      := $(call _COMB_KEY_PROP,$(PROPS_LIBRARIES_ACCUMULATE_R) $(PROPS_LIBRARIES_ACCUMULATE_L))
     345properties_deferred := $(call _COMB_KEY_PROP,$(PROPS_LIBRARIES_DEFERRED))
     346$(foreach trg, $(_ALL_LIBRARIES) $(_ALL_IMPORT_LIBS),$(eval $(value def_inherit)))
     347
     348# DLLs.
     349properties          := $(call _COMB_KEY_PROP,$(PROPS_DLLS_SINGLE))
     350properties_now      := $(call _COMB_KEY_PROP,$(PROPS_DLLS_ACCUMULATE_R) $(PROPS_DLLS_ACCUMULATE_L))
     351properties_deferred := $(call _COMB_KEY_PROP,$(PROPS_DLLS_DEFERRED))
     352$(foreach trg, $(_ALL_DLLS),$(eval $(value def_inherit)))
     353
     354# Installs.
     355properties          := $(call _COMB_KEY_PROP,$(PROPS_INSTALLS_SINGLE))
     356properties_now      := $(call _COMB_KEY_PROP,$(PROPS_INSTALLS_ACCUMULATE_R) $(PROPS_INSTALLS_ACCUMULATE_L))
     357properties_deferred := $(call _COMB_KEY_PROP,$(PROPS_INSTALLS_DEFERRED))
     358$(foreach trg, $(_ALL_INSTALLS),$(eval $(value def_inherit)))
     359
    194360
    195361#
    196362# Template Inheritance.
    197363#
    198 define def_template_extends_prop
    199 ifndef TEMPLATE_$(template)_$(prop)
    200  ifdef TEMPLATE_$(parent)_$(prop)
    201 TEMPLATE_$(template)_$(prop) = $$(TEMPLATE_$(parent)_$(prop))
    202  endif
    203 endif
    204 endef
    205 
    206 
    207 define def_template_extends
    208 ifdef TEMPLATE_$(template)_EXTENDS
    209  ifndef TEMPLATE_$(template)_EXTENDS_STATUS_
    210   TEMPLATE_$(template)_EXTENDS_STATUS_ := 0
    211   parent := $(strip $(TEMPLATE_$(template)_EXTENDS))
    212 
    213   # recursivly process the parent if it's inherting from somebody too.
    214   ifdef TEMPLATE_$(parent)_EXTENDS
    215    ifneq ($(TEMPLATE_$(parent)_EXTENDS_STATUS_),42)
    216     # foreach will create 'template' in a new variable context hiding our current variable.
    217     $(foreach template, $(parent), $(eval $(value def_template_extends)))
    218     parent := $(strip $(TEMPLATE_$(template)_EXTENDS))
    219    endif
    220   endif
    221 
    222   # inherit properties.
    223   $(foreach prop, $(PROPS_SINGLE) $(PROPS_ACCUMULATE_R) $(PROPS_ACCUMULATE_L) $(PROPS_DEFERRED)\
    224     $(addsuffix .$(BUILD_TARGET),                      $(PROPS_SINGLE) $(PROPS_ACCUMULATE_L) $(PROPS_ACCUMULATE_R) $(PROPS_DEFERRED))\
    225     $(addsuffix .$(BUILD_TARGET).$(BUILD_TARGET_ARCH), $(PROPS_SINGLE) $(PROPS_ACCUMULATE_L) $(PROPS_ACCUMULATE_R) $(PROPS_DEFERRED))\
    226     $(addsuffix .$(BUILD_TARGET_ARCH),                 $(PROPS_SINGLE) $(PROPS_ACCUMULATE_L) $(PROPS_ACCUMULATE_R) $(PROPS_DEFERRED))\
    227     $(addsuffix .$(BUILD_TARGET_CPU),                  $(PROPS_SINGLE) $(PROPS_ACCUMULATE_L) $(PROPS_ACCUMULATE_R) $(PROPS_DEFERRED))\
    228     $(addsuffix .$(BUILD_TYPE),                        $(PROPS_SINGLE) $(PROPS_ACCUMULATE_L) $(PROPS_ACCUMULATE_R) $(PROPS_DEFERRED))\
    229     ,$(eval $(def_template_extends_prop))) # exploits the 2 evaluation, so no value!
    230 
    231   TEMPLATE_$(template)_EXTENDS_STATUS_ := 42
    232  else
    233   # protect against inheritance loops.
    234   ifneq ($(TEMPLATE_$(template)_EXTENDS_STATUS_),42)
    235    $(error kBuild: inheritance loop! template=$(template))
    236   endif
    237  endif
    238 endif
    239 endef
    240 
    241 # $ (foreach template, $(_TEMPLATES), $(if TEMPLATE_$(template)_EXTENDS, $(eval $(value def_template_extends))))
    242 $(foreach template, $(_TEMPLATES), $(eval $(value def_template_extends)))
     364# This is much the same as with target inheritance, except we cannot
     365# restrict the properties involved since we've got a clue which target
     366# types are using them. But, we can drop the instance expansion we're
     367# doing for targets since there won't be any more changes to either the
     368# source nor the target templates beyond this exercise.
     369#
     370
     371src_prefix := TEMPLATE_
     372properties :=
     373properties_now :=
     374properties_deferred := $(call _COMB_KEY_PROP,$(PROPS_ALL))
     375$(foreach trg, $(addprefix TEMPLATE_,$(_TEMPLATES)),$(eval $(value def_inherit)))
     376
     377# done.
     378src_prefix :=
     379properties :=
     380properties_now :=
     381properties_deferred :=
    243382
    244383
     
    423562#
    424563# Include tools & sdks
     564#
     565# The first part of this exercise is to figure out which TOOLS and SDKS
     566# that should be included.
    425567#
    426568_TOOLS := $(TOOL.$(BUILD_TARGET))   $(TOOL.$(BUILD_TARGET_ARCH))   $(TOOL.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) \
     
    452594        $($(source)_SDKS) \
    453595        $($(target)_$(source)_SDKS))
    454 endef
     596endef # def_tools_sdks_target_source
    455597
    456598define def_tools_sdks_target
     599_bld_type := $(firstword $($(target)_BLD_TYPE) $(BUILD_TYPE))
    457600_bld_trg := $(firstword $($(target)_BLD_TRG) $(bld_trg))
    458601_bld_trg_arch := $(firstword $($(target)_BLD_TRG_ARCH) $(bld_trg_arch))
     
    474617        $($(target)_SOURCES.$(_bld_trg).$(_bld_trg_arch)) \
    475618        $($(target)_SOURCES.$(_bld_trg_cpu)) \
    476         $($(target)_SOURCES.$(BUILD_TYPE)) \
     619        $($(target)_SOURCES.$(_bld_type)) \
    477620        $($(target)_SOURCES) \
    478621        , $(eval $(value def_tools_sdks_target_source)))
    479 endef
     622endef # def_tools_sdks_target
    480623
    481624define def_tools_srcname_target
     625_bld_type := $(firstword $($(target)_BLD_TYPE) $(BUILD_TYPE))
    482626_bld_trg := $(firstword $($(target)_BLD_TRG) $(bld_trg))
    483627_bld_trg_arch := $(firstword $($(target)_BLD_TRG_ARCH) $(bld_trg_arch))
     
    489633        $($(target)_SOURCES.$(_bld_trg).$(_bld_trg_arch)) \
    490634        $($(target)_SOURCES.$(_bld_trg_cpu)) \
    491         $($(target)_SOURCES.$(BUILD_TYPE)) \
     635        $($(target)_SOURCES.$(_bld_type)) \
    492636        $($(target)_SOURCES) \
    493637        ), $(eval $(value def_tools_sdks_target_source)))
    494 endef
     638endef # def_tools_srcname_target
    495639
    496640bld_trg := $(BUILD_TARGET)
     
    509653define def_tools_include
    510654ifndef TOOL_$(tool)
    511 TOOL_$(tool)_KMK_FILE := $(firstword $(foreach path, $(TOOL_PATHS) $(PATH_KBUILD)/tools, $(wildcard $(path)/$(tool).kmk)))
    512 ifeq ($(TOOL_$(tool)_KMK_FILE),)
    513 $(error kBuild: Cannot find include file for the tool '$(tool)'! Searched: $(TOOL_PATHS) $(PATH_KBUILD)/tools)
    514 endif
    515 include $(TOOL_$(tool)_KMK_FILE)
    516 ifndef TOOL_$(tool)
    517 $(warning kBuild: TOOL_$(tool) was not by $(TOOL_$(tool)_KMK_FILE)!)
    518 endif
    519 endif
    520 endef
     655 TOOL_$(tool)_KMK_FILE := $(firstword $(foreach path, $(TOOL_PATHS) $(PATH_KBUILD)/tools, $(wildcard $(path)/$(tool).kmk)))
     656 ifeq ($(TOOL_$(tool)_KMK_FILE),)
     657  $(error kBuild: Cannot find include file for the tool '$(tool)'! Searched: $(TOOL_PATHS) $(PATH_KBUILD)/tools)
     658 endif
     659 include $(TOOL_$(tool)_KMK_FILE)
     660 ifndef TOOL_$(tool)
     661  $(warning kBuild: TOOL_$(tool) was not by $(TOOL_$(tool)_KMK_FILE)!)
     662 endif
     663endif
     664endef # def_tools_include
    521665
    522666_TOOLS := $(sort $(_TOOLS))
     
    527671define def_sdks_include_one
    528672ifndef SDK_$(sdk)
    529 SDK_$(sdk)_KMK_FILE := $(firstword $(foreach path, $(SDK_PATHS) $(PATH_KBUILD)/sdks, $(wildcard $(path)/$(sdk).kmk)))
    530 ifeq ($(SDK_$(sdk)_KMK_FILE),)
    531 $(error kBuild: Cannot find include file for the SDK '$(sdk)'! Searched: $(SDK_PATHS) $(PATH_KBUILD)/sdks)
    532 endif
    533 include $(SDK_$(sdk)_KMK_FILE)
    534 ifndef SDK_$(sdk)
    535 $(warning kBuild: SDK_$(sdk) was not defined by $(SDK_$(sdk)_KMK_FILE)!)
    536 endif
    537 endif
    538 endef
     673 SDK_$(sdk)_KMK_FILE := $(firstword $(foreach path, $(SDK_PATHS) $(PATH_KBUILD)/sdks, $(wildcard $(path)/$(sdk).kmk)))
     674 ifeq ($(SDK_$(sdk)_KMK_FILE),)
     675  $(error kBuild: Cannot find include file for the SDK '$(sdk)'! Searched: $(SDK_PATHS) $(PATH_KBUILD)/sdks)
     676 endif
     677 include $(SDK_$(sdk)_KMK_FILE)
     678 ifndef SDK_$(sdk)
     679  $(warning kBuild: SDK_$(sdk) was not defined by $(SDK_$(sdk)_KMK_FILE)!)
     680 endif
     681endif
     682endef # def_sdks_include_one
    539683
    540684_SDKS := $(sort $(_SDKS))
    541685$(foreach sdk, $(_SDKS), $(eval $(value def_sdks_include_one)))
    542686
     687## @todo Execute SDKS and TOOL inhertiance.
    543688
    544689
     
    715860#
    716861define def_pass1_install
    717 bld_type  := $(firstword $($(target)_BLD_TYPE)     $(BUILD_TYPE))
    718 bld_trg   := $(firstword $($(target)_BLD_TRG)      $(BUILD_TARGET))
     862bld_type    := $(firstword $($(target)_BLD_TYPE)     $(BUILD_TYPE))
     863bld_trg     := $(firstword $($(target)_BLD_TRG)      $(BUILD_TARGET))
    719864bld_trg_arch:= $(firstword $($(target)_BLD_TRG_ARCH) $(BUILD_TARGET_ARCH))
    720865bld_trg_cpu := $(firstword $($(target)_BLD_TRG_CPU)  $(BUILD_TARGET_CPU))
  • trunk/kBuild/header.kmk

    r984 r985  
    124124
    125125#
    126 # The OSes and Architectures that kBuild recognizes.
     126# The OSes, Architectures and CPUs that kBuild recognizes.
    127127#
    128128# When kBuild is ported to a new OS or architecture a unique keyword needs
     
    131131# build types. (PORTME)
    132132#
    133 KBUILD_OSES   = darwin freebsd l4 linux netbsd nt openbsd os2 solaris win
    134 KBUILD_ARCHES = x86 amd64 sparc32 sparc64 mips32 mips64 ppc32 ppc64
     133KBUILD_OSES   := darwin freebsd l4 linux netbsd nt openbsd os2 solaris win
     134KBUILD_ARCHES := x86 amd64 sparc32 sparc64 mips32 mips64 ppc32 ppc64
    135135
    136136
     
    531531
    532532
    533 #
    534 #
    535 #
    536 
    537533## PROPS_TOOLS
    538 # This is a subset of the other PROPS
     534# This is a subset of PROPS_SINGLE.
    539535PROPS_TOOLS := TOOL CTOOL CXXTOOL ASTOOL RCTOOL ARTOOL LDTOOL FETCHTOOL UNPACKTOOL PATCHTOOL
    540536
     
    545541PROPS_SINGLE := $(PROPS_TOOLS) INST NOINST BLD_TYPE BLD_TRG BLD_TRG_ARCH BLD_TRG_CPU FETCHDIR \
    546542        OBJSUFF COBJSUFF CXXOBJSUFF ASOBJSUFF RCOBJSUFF SYSSUFF EXESUFF DLLSUFF LIBSUFF ARLIBSUFF
     543## PROPS_SINGLE_LNK
     544# Subset of PROPS_SINGLE which applies to all linkable targets.
     545PROPS_SINGLE_LNK := TOOL CTOOL CXXTOOL ASTOOL RCTOOL \
     546    INST NOINST BLD_TYPE BLD_TRG BLD_TRG_ARCH BLD_TRG_CPU \
     547        OBJSUFF COBJSUFF CXXOBJSUFF ASOBJSUFF RCOBJSUFF
    547548
    548549## PROPS_DEFERRED
    549550# This list of non-accumulative target properties which are or may be
    550551# functions, and thus should not be expanded until the very last moment.
    551 PROPS_DEFERRED := INSTFUN INSTALLER PRE_CMDS POST_CMDS NAME
     552PROPS_DEFERRED := INSTFUN INSTALLER PRE_CMDS POST_CMDS NAME SONAME
    552553
    553554## PROPS_ACCUMULATE_R
     
    557558# will do the necessary inheritance from templates to targets.
    558559PROPS_ACCUMULATE_R := \
    559         DEFS DEPS ORDERDEPS \
     560        DEPS ORDERDEPS DEFS \
     561        ARFLAGS \
    560562        CFLAGS CDEFS \
    561563        CXXFLAGS CXXDEFS \
     
    565567        IDFLAGS IFDLAGS ISFLAGS \
    566568        FETCHFLAGS UNPACKFLAGS PATCHFLAGS
     569## PROPS_ACCUMULATE_R_LNK
     570# Subset of PROPS_ACCUMULATE_R which applies to all linkable targets.
     571PROPS_ACCUMULATE_R_LNK := \
     572        DEPS ORDERDEPS DEFS \
     573        CFLAGS CDEFS \
     574        CXXFLAGS CXXDEFS \
     575        ASFLAGS ASDEFS \
     576        RCFLAGS RCDEFS \
     577        IDFLAGS IFDLAGS ISFLAGS
    567578
    568579## PROPS_ACCUMULATE
     
    575586        INCS CINCS CXXINCX ASINCS RCINCS \
    576587        LIBS LIBPATH \
    577         DIRS BLDDIRS \
    578         CLEAN
     588        DIRS BLDDIRS CLEAN
     589## PROPS_ACCUMULATE_L_LNK
     590# Subset of PROPS_ACCUMULATE_L which applies to all linkable targets.
     591PROPS_ACCUMULATE_L_LNK := \
     592        SDKS SOURCES \
     593        INCS CINCS CXXINCX ASINCS RCINCS \
     594        BLDDIRS CLEAN
    579595
    580596## PROPS_ALL
    581597# List of all the properties.
    582598PROPS_ALL = $(PROPS_SINGLE) $(PROPS_DEFERRED) $(PROPS_ACCUMULATE_L) $(PROPS_ACCUMULATE_R)
     599
     600
     601## @name Properties valid on programs (BLDPROGS and PROGRAMS)
     602## @{
     603PROPS_PROGRAMS_SINGLE        := $(PROPS_SINGLE_LNK) LDTOOL EXESUFF
     604PROPS_PROGRAMS_DEFERRED      := $(PROPS_DEFERRED)
     605PROPS_PROGRAMS_ACCUMULATE_R  := $(PROPS_ACCUMULATE_R_LNK) LDFLAGS
     606PROPS_PROGRAMS_ACCUMULATE_L  := $(PROPS_ACCUMULATE_L_LNK) LIBS LIBPATH
     607## @}
     608
     609## @name Properties valid on libraries (LIBRARIES and IMPORT_LIBS)
     610## @{
     611PROPS_LIBRARIES_SINGLE       := $(PROPS_SINGLE_LNK) ARTOOL LIBSUFF ARLIBSUFF
     612PROPS_LIBRARIES_DEFERRED     := $(filter-out SONAME,$(PROPS_DEFERRED))
     613PROPS_LIBRARIES_ACCUMULATE_R := $(PROPS_ACCUMULATE_R_LNK) ARFLAGS
     614PROPS_LIBRARIES_ACCUMULATE_L := $(PROPS_ACCUMULATE_L_LNK)
     615## @}
     616
     617## @name Properties valid on dlls (DLLS)
     618## @{
     619PROPS_DLLS_SINGLE            := $(PROPS_SINGLE_LNK) LDTOOL DLLSUFF LIBSUFF
     620PROPS_DLLS_DEFERRED          := $(PROPS_DEFERRED)
     621PROPS_DLLS_ACCUMULATE_R      := $(PROPS_ACCUMULATE_R_LNK) LDFLAGS
     622PROPS_DLLS_ACCUMULATE_L      := $(PROPS_ACCUMULATE_L_LNK) LIBS LIBPATH
     623## @}
     624
     625## @name Properties valid on installs (INSTALLS)
     626## @{
     627PROPS_INSTALLS_SINGLE        := TOOL INST NOINST
     628PROPS_INSTALLS_DEFERRED      := INSTFUN INSTALLER
     629PROPS_INSTALLS_ACCUMULATE_R  := DEPS ORDERDEPS
     630PROPS_INSTALLS_ACCUMULATE_L  := SOURCES DIRS CLEAN
     631## @}
     632
     633## @name Properties valid on fetches (INSTALLS)
     634## @{
     635PROPS_FETCHES_SINGLE         := TOOL FETCHTOOL UNPACKTOOL PATCHTOOL INST FETCHDIR
     636PROPS_FETCHES_DEFERRED       :=
     637PROPS_FETCHES_ACCUMULATE_R   := FETCHFLAGS UNPACKFLAGS PATCHFLAGS
     638PROPS_FETCHES_ACCUMULATE_L   := SOURCES
     639## @}
    583640
    584641
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette