# $Id: footer.kmk 189 2004-12-14 17:36:58Z bird $ ## @file # # kBuild - File included at top of makefile. # # Copyright (c) 2004 knut st. osmundsen # # # 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 typetype0, Boston, MA 0sourcetargettargettarget-targettype07 USA # # ifndef __footer_kmk__ # start-of-file-content # # Variables. # (Some of these need initialization before including definitions using them.) # # all targets. ALL_TARGETS := \ $(LIBRARIES) $(LIBRARIES.$(BUILD_TARGET)) \ $(IMPORT_LIBS) $(IMPORT_LIBS.$(BUILD_TARGET)) \ $(DLLS) $(DLLS.$(BUILD_TARGET)) \ $(PROGRAMS) $(PROGRAMS.$(BUILD_TARGET)) \ $(SYSMODS) $(SYSMODS.$(BUILD_TARGET)) \ $(OTHERS) $(OTHERS.$(BUILD_TARGET)) # dependency files. _DEPFILES := # All kind of output files except for _OBJS and _DEPFILES. # Compiling or linking definition outputting other things that $@ and any # required dependency file must add those output files to this variable. _OUT_FILES := # all of a type _OBJS := _LIBS := _DLLS := _EXES := _SYSMODS:= _DIRS := _IMPORT_LIBS := # all objs of a specific target define def_objs_var _OBJS_$target := endef $(foreach target, $(ALL_TARGETS), $(eval _OBJS_$(target) := )) # # Basic macros # ## Figure out the tool for a source # @param $target source file # @param $source normalized main target # @param $type tooltype _SOURCE_TOOL = $(strip $(firstword \ $($(target)_$(source)_$(type)TOOL.$(BUILD_TARGET)) \ $($(target)_$(source)_$(type)TOOL) \ $($(target)_$(source)_TOOL.$(BUILD_TARGET)) \ $($(target)_$(source)_TOOL) \ $($(target)_$(type)TOOL.$(BUILD_TARGET)) \ $($(target)_$(type)TOOL) \ $($(target)_TOOL.$(BUILD_TARGET)) \ $($(target)_TOOL) \ $($(source)_$(type)TOOL.$(BUILD_TARGET)) \ $($(source)_$(type)TOOL) \ $($(source)_TOOL.$(BUILD_TARGET)) \ $($(source)_TOOL) \ $($(type)TOOL.$(BUILD_TARGET)) \ $($(type)TOOL) \ $(TOOL.$(BUILD_TARGET)) \ $(TOOL) )) _SOURCE_TOOL_OLD = $(strip $(firstword \ $($(target)_$(source)_$(type)TOOL.$(BUILD_TARGET)) $($(target)_$(source)_TOOL.$(BUILD_TARGET)) \ $($(target)_$(source)_$(type)TOOL) $($target_$source_TOOL) \ $($(target)_$(type)TOOL.$(BUILD_TARGET)) $($(target)_TOOL.$(BUILD_TARGET)) \ $($(target)_$(type)TOOL) $($target_TOOL) \ $($(source)_$(type)TOOL.$(BUILD_TARGET)) $($(source)_TOOL.$(BUILD_TARGET)) \ $($(source)_$(type)TOOL) $($(source)_TOOL) \ $($(type)TOOL.$(BUILD_TARGET)) $(TOOL.$(BUILD_TARGET)) \ $($(type)TOOL) $(TOOL) )) ## Figure out the tool for a target. # @param $target normalized target. # @param $source tooltype. _TARGET_TOOL = $(strip $(firstword \ $($(target)_$(source)TOOL.$(BUILD_TARGET)) \ $($(target)_$(source)TOOL) \ $($(target)_TOOL.$(BUILD_TARGET)) \ $($(target)_TOOL) \ $($(source)TOOL) \ $($(source)TOOL.$(BUILD_TARGET)) \ $(TOOL.$(BUILD_TARGET)) \ $(TOOL) \ )) ## Removes the drive letter from a path (if it has one) # @param $1 the path no-drive=$(word $(words $(subst :, ,$(1))),$(subst :, ,$(1))) ## Removes the root slash from a path (if it has one) # @param $1 the path no-root-slash=$(patsubst /%,%,$(1)) ## Figure out where to put object files. # @param $1 source file # @param $2 normalized main target _OBJECT_BASE = $(PATH_TARGET)/$(2)/$(call no-root-slash,$(call no-drive,$(basename $(patsubst $(PATH_TARGET)/$(2)/%,gen/%,$(1))))) ## Figure out where to put object files. # @param $1 real target name. # @param $2 normalized main target _TARGET_BASE = $(PATH_TARGET)/$(2)/$(call no-root-slash,$(call no-drive,$(basename $(1)))) # # Check syntax which leads to weird syntax errors. # ## Check # @param $(target) Target name. define def_check_target ifneq ("$($(target)_TEMPLATE)","$(strip $($(target)_TEMPLATE))") $$(error $(target) have an incorrect template name. Remove any tabs!) endif endef $(foreach target, $(ALL_TARGETS),$(eval $(def_check_target))) # # Include templates # _TEMPLATES := $(TEMPLATE) define def_templates ifdef $(target)_TEMPLATE _TEMPLATES += $($(target)_TEMPLATE) endif endef $(foreach target, $(ALL_TARGETS), $(eval $(def_templates))) _TEMPLATES := $(sort $(_TEMPLATES)) # $ (warning dbg: _TEMPLATES=$(_TEMPLATES)) define def_templates_include ifndef TEMPLATE_$(template) include $(firstword $(wildcard $(PATH_KBUILD)/templates/$(template).kmk)) endif endef $(foreach template, $(_TEMPLATES), $(eval $(def_templates))) # # Common Inheritance # ## Inherit defaults property # @param $(prop) Property name # @param $(target) Target name. define def_inherit_defaults_one ifndef $(target)_$(prop) ifndef $(target)_$(prop).$(BUILD_TARGET) ifdef $(prop) $$(eval $(target)_$(prop) := $($(prop))) endif ifdef $(prop).$(BUILD_TARGET) $$(eval $(target)_$(prop).$(BUILD_TARGET) := $($(prop).$(BUILD_TARGET))) endif endif endif endef ## Inherit default properties for one target. # A bit tricky this one, but it depends a bit on whether or not TEMPLATE # is inherited from the default properties. # @param $(target) Target name # define def_inherit_defaults ifdef $(target)_TEMPLATE ifeq ($(strip $(TEMPLATE_$($(target)_TEMPLATE)_TOOL) $(TEMPLATE_$($(target)_TEMPLATE)_TOOL.$(BUILD_TARGET))),) $$(foreach prop,TOOL, $$(eval $$(def_inherit_defaults_one))) endif ifeq ($(strip $(TEMPLATE_$($(target)_TEMPLATE)_SDKS) $(TEMPLATE_$($(target)_TEMPLATE)_SDKS.$(BUILD_TARGET))),) $$(foreach prop,SDKS, $$(eval $$(def_inherit_defaults_one))) endif else $$(foreach prop,TEMPLATE TOOL SDKS, $$(eval $$(def_inherit_defaults_one))) endif endef # Inherit default properties. # !!!!!!THIS IS MESSY AND NOT NECESSARY!!!!!! $(foreach target, $(ALL_TARGETS),$(eval $(def_inherit_defaults))) ## Inherit one template property in a accumulative manner. # @param $(prop) Property name # @param $(target) Target name # @todo fix the precedence order for some properties. define def_inherit_template_one ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop) ifndef $(target)_$(prop) #$$ (warning dbgtarget: $(target)_$(prop):='$(TEMPLATE_$($(target)_TEMPLATE)_$(prop))' TEMPLATE_$($(target)_TEMPLATE)_$(prop)) $$(target)_$$(prop) := $$(TEMPLATE_$$($$(target)_TEMPLATE)_$$(prop)) endif endif ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(BUILD_TARGET) ifndef $(target)_$(prop).$(BUILD_TARGET) #$$ (warning dbgsource: $(target)_$(prop).$(BUILD_TARGET)="TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(BUILD_TARGET)" TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(BUILD_TARGET)) $$(target)_$$(prop).$$(BUILD_TARGET) := $$(TEMPLATE_$$($$(target)_TEMPLATE)_$$(prop).$$(BUILD_TARGET)) endif endif endef ## Inherit one template property. # @param $(prop) Property name # @param $(target) Target name define def_inherit_template_one_accumulate ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop) #$$ (warning dbgtype: TEMPLATE_$($(target)_TEMPLATE)_$(prop) $(target)_$(prop)=$($(target)_$(prop)) $(TEMPLATE_$($(target)_TEMPLATE)_$(prop))) $$(eval $(target)_$(prop) := $($(target)_$(prop)) $(TEMPLATE_$($(target)_TEMPLATE)_$(prop))) #$$ (warning dbgtype: $(target)_$(prop)=$($(target)_$(prop))) endif ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(BUILD_TARGET) #$$ (warning dbg4: TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(BUILD_TARGET)) $$(eval $(target)_$(prop).$(BUILD_TARGET) := $($(target)_$(prop).$(BUILD_TARGET)) $(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(BUILD_TARGET))) endif ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(BUILD_TARGET_CPU) #$$ (warning dbg5: TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(BUILD_TARGET_CPU)) $$(eval $(target)_$(prop).$(BUILD_TARGET_CPU) := $($(target)_$(prop).$(BUILD_TARGET)) $(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(BUILD_TARGET_CPU))) endif ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(BUILD_TARGET_ARCH) #$$ (warning dbg6: TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(BUILD_TARGET_ARCH)) $$(eval $(target)_$(prop).$(BUILD_TARGET_ARCH) := $($(target)_$(prop).$(BUILD_TARGET)) $(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(BUILD_TARGET_ARCH))) endif endef ## Inherit template properties for on target. # @param $(target) Target name. define def_inherit_template $$(foreach prop, TOOL ARTOOL CTOOL CXXTOOL ASTOOL LDTOOL\ ,$$(eval $$(def_inherit_template_one))) $$(foreach prop,SDKS DEFS INCS COPTS CFLAGS CDEFS CINCS CXXOPTS CXXFLAGS CXXDEFS CXXINCS ASOPTS ASFLAGS ASDEFS ASINCS LDFLAGS LIBS LIBPATH \ ,$$(eval $$(def_inherit_template_one_accumulate))) endef # Inherit template properties $(foreach target, $(ALL_TARGETS),$(eval $(def_inherit_template))) # # Include tools # _TOOLS := $(TOOL) define def_tools_target_source $(foreach tool,\ $($(source)_TOOL.$(BUILD_TARGET)) $($(target)_$(source)_TOOL.$(BUILD_TARGET))\ $($(source)_TOOL) $($(target)_$(source)_TOOL)\ $($(source)_CTOOL.$(BUILD_TARGET)) $($(target)_$(source)_CTOOL.$(BUILD_TARGET))\ $($(source)_CTOOL) $($(target)_$(source)_CTOOL)\ $($(source)_CXXTOOL.$(BUILD_TARGET)) $($(target)_$(source)_CXXTOOL.$(BUILD_TARGET))\ $($(source)_CXXTOOL) $($(target)_$(source)_CXXTOOL)\ $($(source)_ASTOOL.$(BUILD_TARGET)) $($(target)_$(source)_ASTOOL.$(BUILD_TARGET))\ $($(source)_ASTOOL) $($(target)_$(source)_ASTOOL)\ $($(source)_ARTOOL.$(BUILD_TARGET)) $($(target)_$(source)_ARTOOL.$(BUILD_TARGET))\ $($(source)_ARTOOL) $($(target)_$(source)_ARTOOL)\ $($(source)_LDTOOL.$(BUILD_TARGET)) $($(target)_$(source)_LDTOOL.$(BUILD_TARGET))\ $($(source)_LDTOOL) $($(target)_$(source)_LDTOOL)\ ,$(eval _TOOLS += $(tool))) endef define def_tools_target $(foreach tool,\ $($(target)_TOOL.$(BUILD_TARGET))\ $($(target)_TOOL)\ $($(target)_CTOOL.$(BUILD_TARGET))\ $($(target)_CTOOL)\ $($(target)_CXXTOOL.$(BUILD_TARGET))\ $($(target)_CXXTOOL)\ $($(target)_ASTOOL.$(BUILD_TARGET))\ $($(target)_ASTOOL)\ $($(target)_ARTOOL.$(BUILD_TARGET))\ $($(target)_ARTOOL)\ $($(target)_LDTOOL.$(BUILD_TARGET))\ $($(target)_LDTOOL)\ ,$(eval _TOOLS += $(tool))) $(foreach source, $($(target)_SOURCES) $($(target)_SOURCES.$(BUILD_TARGET)) $($(target)_SOURCES.$(BUILD_MODE)) \ , $(eval $(def_tools_target_source))) endef $(foreach target, $(ALL_TARGETS), $(eval $(def_tools_target))) _TOOLS := $(sort $(_TOOLS)) define def_tools_include ifndef TOOL_$(tool) include $(firstword $(wildcard $(PATH_KBUILD)/tools/$(tool).kmk)) endif endef $(foreach tool, $(_TOOLS), $(eval $(def_tools_include))) # # Include SDKs # _SDKS := $(SDKS) define def_sdks_target_source $(foreach sdk, $($(source)_SDKS) $($(source)_SDKS.$(BUILD_TARGET)) $($(source)_SDKS.$(BUILD_MODE)) \ $($(target)_$(source)_SDKS) $($(target)_$(source)_SDKS.$(BUILD_TARGET)) $($(target)_$(source)_SDKS.$(BUILD_MODE)), \ $(eval _SDKS += $(sdk))) endef define def_sdks_target $(foreach sdk, $($(target)_SDKS) $($(target)_SDKS.$(BUILD_TARGET)) $($(target)_SDKS.$(BUILD_MODE))\ , $(eval _SDKS += $(sdk))) $(foreach source, $($(target)_SOURCES) $($(target)_SOURCES.$(BUILD_TARGET)) $($(target)_SOURCES.$(BUILD_MODE))\ , $(eval $(def_sdks_target_source))) endef $(foreach target, $(ALL_TARGETS), $(eval $(def_sdks_target))) _SDKS := $(sort $(_SDKS)) define def_sdks_include_one ifndef SDK_$(sdk) include $(firstword $(wildcard $(PATH_KBUILD)/sdks/$(sdk).kmk)) endif endef $(foreach sdk, $(_SDKS), $(eval $(def_sdks_include_one))) # # Object processing. # ## Generic macro for processing C, C++ and Assembly sources. # @param $(target) Normalized target name. # @param $(source) Source file name. # @param $(type) Source type. {C,CXX,AS} # # @remark I've no clue why I've to $(eval ..) everything in this define. MAKE bug? # @remark I now have a clue. Have to use $$ if not. define def_target_source_c_cpp_asm #$ (warning dbg: def_target_source_c_cpp_asm: source='$(source)' target='$(target)' type='$(type)') $(eval tool:=$(call _SOURCE_TOOL,$(source),$(target),$(type))) $(eval outbase := $(call _OBJECT_BASE,$(source),$(target))) $(eval PATH_$(target)_$(source) := $(patsubst %/,%,$(dir $(outbase)))) $(eval dirdep := $(dir $(outbase)).dir_created) $(eval defs :=\ $(TOOL_$(tool)_DEFS)\ $(TOOL_$(tool)_DEFS.$(BUILD_TYPE))\ $(TOOL_$(tool)_DEFS.$(BUILD_TARGET))\ $(TOOL_$(tool)_DEFS.$(BUILD_TARGET_ARCH))\ $(TOOL_$(tool)_DEFS.$(BUILD_TARGET_CPU))\ $(TOOL_$(tool)_$(type)DEFS)\ $(TOOL_$(tool)_$(type)DEFS.$(BUILD_TYPE))\ $(foreach sdk, $(SDKS.$(BUILD_TARGET)) \ $(SDKS.$(BUILD_TYPE)) \ $(SDKS),\ $(SDK_$(sdk)_DEFS)\ $(SDK_$(sdk)_DEFS.$(BUILD_TYPE))\ $(SDK_$(sdk)_DEFS.$(BUILD_TARGET))\ $(SDK_$(sdk)_DEFS.$(BUILD_TARGET_ARCH))\ $(SDK_$(sdk)_DEFS.$(BUILD_TARGET_CPU))\ $(SDK_$(sdk)_$(type)DEFS)\ $(SDK_$(sdk)_$(type)DEFS.$(BUILD_TYPE))\ $(SDK_$(sdk)_$(type)DEFS.$(BUILD_TARGET))\ $(SDK_$(sdk)_$(type)DEFS.$(BUILD_TARGET_ARCH))\ $(SDK_$(sdk)_$(type)DEFS.$(BUILD_TARGET_CPU)))\ $(DEFS)\ $(DEFS.$(BUILD_TYPE))\ $(DEFS.$(BUILD_TARGET))\ $(DEFS.$(BUILD_TARGET_ARCH))\ $(DEFS.$(BUILD_TARGET_CPU))\ $($(type)DEFS)\ $($(type)DEFS.$(BUILD_TYPE))\ $($(type)DEFS.$(BUILD_TARGET))\ $($(type)DEFS.$(BUILD_TARGET_ARCH))\ $($(type)DEFS.$(BUILD_TARGET_CPU))\ $(foreach sdk, $($(target)_SDKS.$(BUILD_TARGET)) \ $($(target)_SDKS.$(BUILD_TYPE)) \ $($(target)_SDKS),\ $(SDK_$(sdk)_DEFS)\ $(SDK_$(sdk)_DEFS.$(BUILD_TYPE))\ $(SDK_$(sdk)_DEFS.$(BUILD_TARGET))\ $(SDK_$(sdk)_DEFS.$(BUILD_TARGET_ARCH))\ $(SDK_$(sdk)_DEFS.$(BUILD_TARGET_CPU))\ $(SDK_$(sdk)_$(type)DEFS)\ $(SDK_$(sdk)_$(type)DEFS.$(BUILD_TYPE))\ $(SDK_$(sdk)_$(type)DEFS.$(BUILD_TARGET))\ $(SDK_$(sdk)_$(type)DEFS.$(BUILD_TARGET_ARCH))\ $(SDK_$(sdk)_$(type)DEFS.$(BUILD_TARGET_CPU)))\ $($(target)_DEFS)\ $($(target)_DEFS.$(BUILD_TYPE))\ $($(target)_DEFS.$(BUILD_TARGET))\ $($(target)_DEFS.$(BUILD_TARGET_ARCH))\ $($(target)_DEFS.$(BUILD_TARGET_CPU))\ $($(target)_$(type)DEFS)\ $($(target)_$(type)DEFS.$(BUILD_TYPE))\ $($(target)_$(type)DEFS.$(BUILD_TARGET))\ $($(target)_$(type)DEFS.$(BUILD_TARGET_ARCH))\ $($(target)_$(type)DEFS.$(BUILD_TARGET_CPU))\ $(foreach sdk, $($(source)_SDKS.$(BUILD_TARGET)) \ $($(source)_SDKS.$(BUILD_TYPE)) \ $($(source)_SDKS),\ $(SDK_$(sdk)_DEFS)\ $(SDK_$(sdk)_DEFS.$(BUILD_TYPE))\ $(SDK_$(sdk)_DEFS.$(BUILD_TARGET))\ $(SDK_$(sdk)_DEFS.$(BUILD_TARGET_ARCH))\ $(SDK_$(sdk)_DEFS.$(BUILD_TARGET_CPU))\ $(SDK_$(sdk)_$(type)DEFS)\ $(SDK_$(sdk)_$(type)DEFS.$(BUILD_TYPE))\ $(SDK_$(sdk)_$(type)DEFS.$(BUILD_TARGET))\ $(SDK_$(sdk)_$(type)DEFS.$(BUILD_TARGET_ARCH))\ $(SDK_$(sdk)_$(type)DEFS.$(BUILD_TARGET_CPU)))\ $($(source)_DEFS)\ $($(source)_DEFS.$(BUILD_TYPE))\ $($(source)_DEFS.$(BUILD_TARGET))\ $($(source)_DEFS.$(BUILD_TARGET_ARCH))\ $($(source)_DEFS.$(BUILD_TARGET_CPU))\ $($(source)_$(type)DEFS)\ $($(source)_$(type)DEFS.$(BUILD_TYPE))\ $($(source)_$(type)DEFS.$(BUILD_TARGET))\ $($(source)_$(type)DEFS.$(BUILD_TARGET_ARCH))\ $($(source)_$(type)DEFS.$(BUILD_TARGET_CPU))\ $(foreach sdk, $($(target)_$(source)_SDKS.$(BUILD_TARGET)) \ $($(target)_$(source)_SDKS.$(BUILD_TYPE)) \ $($(target)_$(source)_SDKS),\ $(SDK_$(sdk)_DEFS)\ $(SDK_$(sdk)_DEFS.$(BUILD_TYPE))\ $(SDK_$(sdk)_DEFS.$(BUILD_TARGET))\ $(SDK_$(sdk)_DEFS.$(BUILD_TARGET_ARCH))\ $(SDK_$(sdk)_DEFS.$(BUILD_TARGET_CPU))\ $(SDK_$(sdk)_$(type)DEFS)\ $(SDK_$(sdk)_$(type)DEFS.$(BUILD_TYPE))\ $(SDK_$(sdk)_$(type)DEFS.$(BUILD_TARGET))\ $(SDK_$(sdk)_$(type)DEFS.$(BUILD_TARGET_ARCH))\ $(SDK_$(sdk)_$(type)DEFS.$(BUILD_TARGET_CPU)))\ $($(target)_$(source)_DEFS)\ $($(target)_$(source)_DEFS.$(BUILD_TYPE))\ $($(target)_$(source)_DEFS.$(BUILD_TARGET))\ $($(target)_$(source)_DEFS.$(BUILD_TARGET_ARCH))\ $($(target)_$(source)_DEFS.$(BUILD_TARGET_CPU))\ $($(target)_$(source)_$(type)DEFS)\ $($(target)_$(source)_$(type)DEFS.$(BUILD_TYPE))\ $($(target)_$(source)_$(type)DEFS.$(BUILD_TARGET))\ $($(target)_$(source)_$(type)DEFS.$(BUILD_TARGET_ARCH))\ $($(target)_$(source)_$(type)DEFS.$(BUILD_TARGET_CPU))\ ) $(eval incs :=\ $($(target)_$(source)_$(type)INCS.$(BUILD_TARGET_CPU))\ $($(target)_$(source)_$(type)INCS.$(BUILD_TARGET_ARCH))\ $($(target)_$(source)_$(type)INCS.$(BUILD_TARGET))\ $($(target)_$(source)_$(type)INCS.$(BUILD_TYPE))\ $($(target)_$(source)_$(type)INCS)\ $($(target)_$(source)_INCS.$(BUILD_TARGET_CPU))\ $($(target)_$(source)_INCS.$(BUILD_TARGET_ARCH))\ $($(target)_$(source)_INCS.$(BUILD_TARGET))\ $($(target)_$(source)_INCS.$(BUILD_TYPE))\ $($(target)_$(source)_INCS)\ $(foreach sdk, $($(target)_$(source)_SDKS.$(BUILD_TARGET)) \ $($(target)_$(source)_SDKS.$(BUILD_TYPE)) \ $($(target)_$(source)_SDKS),\ $(SDK_$(sdk)_$(type)INCS.$(BUILD_TARGET_CPU))\ $(SDK_$(sdk)_$(type)INCS.$(BUILD_TARGET_ARCH))\ $(SDK_$(sdk)_$(type)INCS.$(BUILD_TARGET))\ $(SDK_$(sdk)_$(type)INCS.$(BUILD_TYPE))\ $(SDK_$(sdk)_$(type)INCS)\ $(SDK_$(sdk)_INCS.$(BUILD_TARGET_CPU))\ $(SDK_$(sdk)_INCS.$(BUILD_TARGET_ARCH))\ $(SDK_$(sdk)_INCS.$(BUILD_TARGET))\ $(SDK_$(sdk)_INCS.$(BUILD_TYPE))\ $(SDK_$(sdk)_INCS))\ $($(source)_$(type)INCS.$(BUILD_TARGET_CPU))\ $($(source)_$(type)INCS.$(BUILD_TARGET_ARCH))\ $($(source)_$(type)INCS.$(BUILD_TARGET))\ $($(source)_$(type)INCS.$(BUILD_TYPE))\ $($(source)_$(type)INCS)\ $($(source)_INCS.$(BUILD_TARGET_CPU))\ $($(source)_INCS.$(BUILD_TARGET_ARCH))\ $($(source)_INCS.$(BUILD_TARGET))\ $($(source)_INCS.$(BUILD_TYPE))\ $($(source)_INCS)\ $(foreach sdk, $($(source)_SDKS.$(BUILD_TARGET)) \ $($(source)_SDKS.$(BUILD_TYPE)) \ $($(source)_SDKS),\ $(SDK_$(sdk)_$(type)INCS.$(BUILD_TARGET_CPU))\ $(SDK_$(sdk)_$(type)INCS.$(BUILD_TARGET_ARCH))\ $(SDK_$(sdk)_$(type)INCS.$(BUILD_TARGET))\ $(SDK_$(sdk)_$(type)INCS.$(BUILD_TYPE))\ $(SDK_$(sdk)_$(type)INCS)\ $(SDK_$(sdk)_INCS.$(BUILD_TARGET_CPU))\ $(SDK_$(sdk)_INCS.$(BUILD_TARGET_ARCH))\ $(SDK_$(sdk)_INCS.$(BUILD_TARGET))\ $(SDK_$(sdk)_INCS.$(BUILD_TYPE))\ $(SDK_$(sdk)_INCS))\ $($(target)_$(type)INCS.$(BUILD_TARGET_CPU))\ $($(target)_$(type)INCS.$(BUILD_TARGET_ARCH))\ $($(target)_$(type)INCS.$(BUILD_TARGET))\ $($(target)_$(type)INCS.$(BUILD_TYPE))\ $($(target)_$(type)INCS)\ $($(target)_INCS.$(BUILD_TARGET_CPU))\ $($(target)_INCS.$(BUILD_TARGET_ARCH))\ $($(target)_INCS.$(BUILD_TARGET))\ $($(target)_INCS.$(BUILD_TYPE))\ $($(target)_INCS)\ $(foreach sdk, $($(target)_SDKS.$(BUILD_TARGET)) \ $($(target)_SDKS.$(BUILD_TYPE)) \ $($(target)_SDKS),\ $(SDK_$(sdk)_$(type)INCS.$(BUILD_TARGET_CPU))\ $(SDK_$(sdk)_$(type)INCS.$(BUILD_TARGET_ARCH))\ $(SDK_$(sdk)_$(type)INCS.$(BUILD_TARGET))\ $(SDK_$(sdk)_$(type)INCS.$(BUILD_TYPE))\ $(SDK_$(sdk)_$(type)INCS)\ $(SDK_$(sdk)_INCS.$(BUILD_TARGET_CPU))\ $(SDK_$(sdk)_INCS.$(BUILD_TARGET_ARCH))\ $(SDK_$(sdk)_INCS.$(BUILD_TARGET))\ $(SDK_$(sdk)_INCS.$(BUILD_TYPE))\ $(SDK_$(sdk)_INCS))\ $(INCS.$(BUILD_TARGET_CPU))\ $(INCS.$(BUILD_TARGET_ARCH))\ $(INCS.$(BUILD_TARGET))\ $(INCS.$(BUILD_TYPE))\ $(INCS)\ $(foreach sdk, $(SDKS.$(BUILD_TARGET)) \ $(SDKS.$(BUILD_TYPE)) \ $(SDKS),\ $(SDK_$(sdk)_$(type)INCS.$(BUILD_TARGET_CPU))\ $(SDK_$(sdk)_$(type)INCS.$(BUILD_TARGET_ARCH))\ $(SDK_$(sdk)_$(type)INCS.$(BUILD_TARGET))\ $(SDK_$(sdk)_$(type)INCS.$(BUILD_TYPE))\ $(SDK_$(sdk)_$(type)INCS)\ $(SDK_$(sdk)_INCS.$(BUILD_TARGET_CPU))\ $(SDK_$(sdk)_INCS.$(BUILD_TARGET_ARCH))\ $(SDK_$(sdk)_INCS.$(BUILD_TARGET))\ $(SDK_$(sdk)_INCS.$(BUILD_TYPE))\ $(SDK_$(sdk)_INCS))\ $(TOOL_$(tool)_$(type)INCS.$(BUILD_TARGET_CPU))\ $(TOOL_$(tool)_$(type)INCS.$(BUILD_TARGET_ARCH))\ $(TOOL_$(tool)_$(type)INCS.$(BUILD_TARGET))\ $(TOOL_$(tool)_$(type)INCS.$(BUILD_TYPE))\ $(TOOL_$(tool)_$(type)INCS)\ ) $(eval flags :=\ $(TOOL_$(tool)_$(type)FLAGS)\ $(TOOL_$(tool)_$(type)FLAGS.$(BUILD_TYPE))\ $(TOOL_$(tool)_$(type)FLAGS.$(BUILD_TARGET))\ $(TOOL_$(tool)_$(type)FLAGS.$(BUILD_TARGET_ARCH))\ $(TOOL_$(tool)_$(type)FLAGS.$(BUILD_TARGET_CPU))\ $($(type)FLAGS)\ $($(type)FLAGS.$(BUILD_TYPE))\ $($(type)FLAGS.$(BUILD_TARGET))\ $($(type)FLAGS.$(BUILD_TARGET_ARCH))\ $($(type)FLAGS.$(BUILD_TARGET_CPU))\ $($(target)_$(type)FLAGS)\ $($(target)_$(type)FLAGS.$(BUILD_TYPE))\ $($(target)_$(type)FLAGS.$(BUILD_TARGET))\ $($(target)_$(type)FLAGS.$(BUILD_TARGET_ARCH))\ $($(target)_$(type)FLAGS.$(BUILD_TARGET_CPU))\ $($(source)_$(type)FLAGS)\ $($(source)_$(type)FLAGS.$(BUILD_TYPE))\ $($(source)_$(type)FLAGS.$(BUILD_TARGET))\ $($(source)_$(type)FLAGS.$(BUILD_TARGET_ARCH))\ $($(source)_$(type)FLAGS.$(BUILD_TARGET_CPU))\ $($(target)_$(source)_$(type)FLAGS)\ $($(target)_$(source)_$(type)FLAGS.$(BUILD_TYPE))\ $($(target)_$(source)_$(type)FLAGS.$(BUILD_TARGET))\ $($(target)_$(source)_$(type)FLAGS.$(BUILD_TARGET_ARCH))\ $($(target)_$(source)_$(type)FLAGS.$(BUILD_TARGET_CPU))\ ) $(eval objsuff := $(firstword \ $($(target)_$(source)_OBJSUFF.$(BUILD_TARGET))\ $($(target)_$(source)_OBJSUFF)\ $($(source)_OBJSUFF.$(BUILD_TARGET))\ $($(source)_OBJSUFF)\ $($(target)_OBJSUFF.$(BUILD_TARGET))\ $($(target)_OBJSUFF)\ $(TOOL_$(tool)_$(type)OBJSUFF.$(BUILD_TARGET))\ $(TOOL_$(tool)_$(type)OBJSUFF)\ $(SUFF_OBJ)\ )) $(eval obj := $(outbase)$(objsuff)) $(eval dep := $(outbase)$(SUFF_DEP)) $(eval deps := \ $($(target)_$(source)_DEPS)\ $($(target)_$(source)_DEPS.$(BUILD_TYPE))\ $($(target)_$(source)_DEPS.$(BUILD_TARGET))\ $($(target)_$(source)_DEPS.$(BUILD_TARGET_ARCH))\ $($(target)_$(source)_DEPS.$(BUILD_TARGET_CPU))\ $($(source)_DEPS)\ $($(source)_DEPS.$(BUILD_TYPE))\ $($(source)_DEPS.$(BUILD_TARGET))\ $($(target)_DEPS)\ $($(target)_DEPS.$(BUILD_TARGET_ARCH))\ $($(target)_DEPS.$(BUILD_TARGET_CPU))) #$ (warning dbg: target=$(target) source=$(source) tool=$(tool) obj=$(obj) dep=$(dep) flags=$(flags) defs=$(defs) incs=$(incs) dirdep=$(dirdep) outbase=$(outbase) objsuff=$(objsuff) deps=$(deps)) ifndef TOOL_$(tool)_COMPILE_$(type) $$(warning kBuild: TOOL_$(tool)_COMPILE_$(type) is not defined. source=$(source) target=$(target) ) $$(warning kBuild: tools: \ 1 $($(target)_$(source)_$(type)TOOL.$(BUILD_TARGET)) \ 2 $($(target)_$(source)_$(type)TOOL) \ 3 $($(target)_$(source)_TOOL.$(BUILD_TARGET)) \ 4 $($(target)_$(source)_TOOL) \ 5 $($(target)_$(type)TOOL.$(BUILD_TARGET)) \ 6 $($(target)_$(type)TOOL) \ 7 $($(target)_TOOL.$(BUILD_TARGET)) \ 8 $($(target)_TOOL) \ 9 $($(source)_$(type)TOOL.$(BUILD_TARGET)) \ 10 $($(source)_$(type)TOOL) \ 11 $($(source)_TOOL.$(BUILD_TARGET)) \ 12 $($(source)_TOOL) \ 13 $($(type)TOOL.$(BUILD_TARGET)) \ 14 $($(type)TOOL) \ 15 $(TOOL.$(BUILD_TARGET)) \ 16 $(TOOL) ) endif $(eval $(TOOL_$(tool)_COMPILE_$(type))) $(eval _OBJS_$(target) += $(obj)) $(eval _DEPFILES += $(dep)) endef ## Generic macro for processing all target sources. # @param $(target) Normalized target name. define def_target_sources #$ (warning def_target_sources) # C sources $(foreach type,C,$(foreach source, $(filter %.c, $($(target)_SOURCES) $($(target)_SOURCES.$(BUILD_TARGET)) $($(target)_SOURCES.$(BUILD_MODE)))\ ,$(eval $(def_target_source_c_cpp_asm)) )) # C++ sources $(foreach type,CXX,$(foreach source, $(filter %.cpp %.cxx %.xx, $($(target)_SOURCES) $($(target)_SOURCES.$(BUILD_TARGET)) $($(target)_SOURCES.$(BUILD_MODE)))\ ,$(eval $(def_target_source_c_cpp_asm)) )) # ASM sources $(foreach type,AS,$(foreach source, $(filter %.asm %.s %.S, $($(target)_SOURCES) $($(target)_SOURCES.$(BUILD_TARGET)) $($(target)_SOURCES.$(BUILD_MODE)))\ ,$(eval $(def_target_source_c_cpp_asm)) )) endef # # LIBRARIES # ## Library (one). # @param $(target) Normalized library (target) name. define def_lib # library basics $(eval tool := $(call _TARGET_TOOL,$(target),AR)) ifeq ($(tool),) $$(error kBuild: Library target $(target) doesn't have a tool defined!) endif ## @todo prefix $(eval outbase := $(call _TARGET_BASE,$(target),$(target))) $(eval PATH_$(target) := $(patsubst %/,%,$(dir $(outbase)))) $(eval libsuff := $(firstword\ $($(target)_LIBSUFF.$(BUILD_TARGET))\ $($(target)_LIBSUFF)\ $(TOOL_$(tool)_ARLIBSUFF.$(BUILD_TARGET))\ $(TOOL_$(tool)_ARLIBSUFF)\ $(SUFF_LIB)\ )) $(eval lib := $(outbase)$(libsuff)) $(eval TARGET_$(target) := $(lib)) # source -> object $(eval $(def_target_sources)) # library linking $(eval tool := $(call _TARGET_TOOL,$(target),AR)) $(eval outbase := $(call _TARGET_BASE,$(target),$(target))) $(eval flags :=\ $(TOOL_$(tool)_ARFLAGS)\ $(TOOL_$(tool)_ARFLAGS.$(BUILD_TYPE))\ $(ARFLAGS)\ $(ARFLAGS.$(BUILD_TYPE))\ $($(target)_ARFLAGS)\ $($(target)_ARFLAGS.$(BUILD_TYPE))\ ) $(eval objs = $(_OBJS_$(target))) $(eval othersrc := $(filter-out %.c %.cpp %.cxx %.cc %.s %.S %.asm,$($(target)_SOURCES) $($(target)_SOURCES.$(BUILD_TARGET)) $($(target)_SOURCES.$(BUILD_MODE)))) $(eval dirdep := $(dir $(lib)).dir_created) ## @todo fix dependencies on makefiles an such $(eval deps := $($(target)_DEPS)) $(eval $(TOOL_$(tool)_LINK_LIBRARY)) # publish rule (still need work) ifndef $(target)_NOINST $(eval publib := $(PATH_LIB)/$(notdir $(lib))) $(publib) : $(lib) $(dir $(publib)).dir_created $(CP) $(lib) $(publib) _LIBS += $(publib) _OUT_FILES += $(lib) $(publib) else _LIBS += $(lib) _OUT_FILES += $(lib) endif _OBJS += $(_OBJS_$(target)) endef # Process libraries $(foreach target, $(LIBRARIES) $(LIBRARIES.$(BUILD_TARGET)), $(eval $(def_lib))) # # DLLS # ## DLL (one). # @param $(target) Normalized target (program) name. define def_dll # dllmod basics $(eval tool := $(call _TARGET_TOOL,$(target),LD)) $(eval outbase := $(call _TARGET_BASE,$(target),$(target))) $(eval PATH_$(target) := $(patsubst %/,%,$(dir $(outbase)))) $(eval dllsuff := $(firstword $($(target)_DLLSUFF) $($(target)_DLLSUFF) $(TOOL_$(tool)_LDDLLSUFF) $(SUFF_DLL))) $(eval dll := $(outbase)$(dllsuff)) $(eval TARGET_$(target) := $(dll)) # source -> object $(eval $(def_target_sources)) # dllmod linking. $(eval tool := $(call _TARGET_TOOL,$(target),LD)) $(eval outbase := $(call _TARGET_BASE,$(target),$(target))) $(eval objs = $(_OBJS_$(target))) $(eval flags :=\ $(TOOL_$(tool)_LDFLAGS)\ $(TOOL_$(tool)_LDFLAGS.$(BUILD_TYPE))\ $(TOOL_$(tool)_LDFLAGS.$(BUILD_TARGET))\ $(TOOL_$(tool)_LDFLAGS.$(BUILD_TARGET_ARCH))\ $(TOOL_$(tool)_LDFLAGS.$(BUILD_TARGET_CPU))\ $(LDFLAGS)\ $(LDFLAGS.$(BUILD_TYPE))\ $(LDFLAGS.$(BUILD_TARGET))\ $(LDFLAGS.$(BUILD_TARGET_ARCH))\ $(LDFLAGS.$(BUILD_TARGET_CPU))\ $($(target)_LDFLAGS)\ $($(target)_LDFLAGS.$(BUILD_TYPE))\ $($(target)_LDFLAGS.$(BUILD_TARGET))\ $($(target)_LDFLAGS.$(BUILD_TARGET_ARCH))\ $($(target)_LDFLAGS.$(BUILD_TARGET_CPU))\ ) $(eval libs :=\ $($(target)_LIBS.$(BUILD_TARGET_CPU))\ $($(target)_LIBS.$(BUILD_TARGET_ARCH))\ $($(target)_LIBS.$(BUILD_TARGET))\ $($(target)_LIBS.$(BUILD_TYPE))\ $($(target)_LIBS)\ $(foreach sdk, $($(target)_SDKS.$(BUILD_TARGET)) \ $($(target)_SDKS.$(BUILD_TYPE)) \ $($(target)_SDKS),\ $(SDK_$(sdk)_LIBS.$(BUILD_TARGET_CPU))\ $(SDK_$(sdk)_LIBS.$(BUILD_TARGET_ARCH))\ $(SDK_$(sdk)_LIBS.$(BUILD_TARGET))\ $(SDK_$(sdk)_LIBS.$(BUILD_TYPE))\ $(SDK_$(sdk)_LIBS))\ $(LIBS.$(BUILD_TARGET_CPU))\ $(LIBS.$(BUILD_TARGET_ARCH))\ $(LIBS.$(BUILD_TARGET))\ $(LIBS.$(BUILD_TYPE))\ $(LIBS)\ $(foreach sdk, $(SDKS.$(BUILD_TARGET)) \ $(SDKS.$(BUILD_TYPE)) \ $(SDKS),\ $(SDK_$(sdk)_LIBS.$(BUILD_TARGET_CPU))\ $(SDK_$(sdk)_LIBS.$(BUILD_TARGET_ARCH))\ $(SDK_$(sdk)_LIBS.$(BUILD_TARGET))\ $(SDK_$(sdk)_LIBS.$(BUILD_TYPE))\ $(SDK_$(sdk)_LIBS))\ $(TOOL_$(tool)_LIBS.$(BUILD_TARGET_CPU))\ $(TOOL_$(tool)_LIBS.$(BUILD_TARGET_ARCH))\ $(TOOL_$(tool)_LIBS.$(BUILD_TARGET))\ $(TOOL_$(tool)_LIBS.$(BUILD_TYPE))\ $(TOOL_$(tool)_LIBS)\ ) $(eval libpath :=\ $($(target)_LIBPATH.$(BUILD_TARGET_CPU))\ $($(target)_LIBPATH.$(BUILD_TARGET_ARCH))\ $($(target)_LIBPATH.$(BUILD_TARGET))\ $($(target)_LIBPATH.$(BUILD_TYPE))\ $($(target)_LIBPATH)\ $(foreach sdk, $($(target)_SDKS.$(BUILD_TARGET)) \ $($(target)_SDKS.$(BUILD_TYPE)) \ $($(target)_SDKS),\ $(SDK_$(sdk)_LIBPATH.$(BUILD_TARGET_CPU))\ $(SDK_$(sdk)_LIBPATH.$(BUILD_TARGET_ARCH))\ $(SDK_$(sdk)_LIBPATH.$(BUILD_TARGET))\ $(SDK_$(sdk)_LIBPATH.$(BUILD_TYPE))\ $(SDK_$(sdk)_LIBPATH))\ $(LIBPATH.$(BUILD_TARGET_CPU))\ $(LIBPATH.$(BUILD_TARGET_ARCH))\ $(LIBPATH.$(BUILD_TARGET))\ $(LIBPATH.$(BUILD_TYPE))\ $(LIBPATH)\ $(foreach sdk, $(SDKS.$(BUILD_TARGET)) \ $(SDKS.$(BUILD_TYPE)) \ $(SDKS),\ $(SDK_$(sdk)_LIBPATH.$(BUILD_TARGET_CPU))\ $(SDK_$(sdk)_LIBPATH.$(BUILD_TARGET_ARCH))\ $(SDK_$(sdk)_LIBPATH.$(BUILD_TARGET))\ $(SDK_$(sdk)_LIBPATH.$(BUILD_TYPE))\ $(SDK_$(sdk)_LIBPATH))\ $(TOOL_$(tool)_LIBPATH.$(BUILD_TARGET_CPU))\ $(TOOL_$(tool)_LIBPATH.$(BUILD_TARGET_ARCH))\ $(TOOL_$(tool)_LIBPATH.$(BUILD_TARGET))\ $(TOOL_$(tool)_LIBPATH.$(BUILD_TYPE))\ $(TOOL_$(tool)_LIBPATH)\ ) $(eval dirdep := $(dir $(dll)).dir_created) ## @todo fix dependencies $(eval deps := $($(target)_DEPS)) # $(eval custom_pre := $(strip $(firstword $($(target)_CUSTOM_PRE.$(BUILD_TARGET).$(BUILD_TYPE))\ $($(target)_CUSTOM_PRE.$(BUILD_TARGET))\ $($(target)_CUSTOM_PRE.$(BUILD_TYPE))\ $($(target)_CUSTOM_PRE)\ $(CUSTOM_PRE.$(BUILD_TARGET).$(BUILD_TYPE))\ $(CUSTOM_PRE.$(BUILD_TARGET))\ $(CUSTOM_PRE.$(BUILD_TYPE))\ $(CUSTOM_PRE)\ ))) $(eval custom_post := $(strip $(firstword $($(target)_CUSTOM_POST.$(BUILD_TARGET).$(BUILD_TYPE))\ $($(target)_CUSTOM_POST.$(BUILD_TARGET))\ $($(target)_CUSTOM_POST.$(BUILD_TYPE))\ $($(target)_CUSTOM_POST)\ $(CUSTOM_POST.$(BUILD_TARGET).$(BUILD_TYPE))\ $(CUSTOM_POST.$(BUILD_TARGET))\ $(CUSTOM_POST.$(BUILD_TYPE))\ $(CUSTOM_POST)\ ))) $(eval othersrc := $(filter-out %.c %.cpp %.cxx %.cc %.s %.S %.asm,$($(target)_SOURCES) $($(target)_SOURCES.$(BUILD_TARGET)) $($(target)_SOURCES.$(BUILD_MODE)))) ifndef TOOL_$(tool)_LINK_DLL $$(warning kBuild: TOOL_$(tool)_LINK_DLL is not defined. target=$(target) ) $$(warning kBuild: tools: \ 1 $($(target)_$(source)TOOL.$(BUILD_TARGET)) \ 2 $($(target)_$(source)TOOL) \ 3 $($(target)_TOOL.$(BUILD_TARGET)) \ 4 $($(target)_TOOL) \ 5 $($(source)TOOL) \ 6 $($(source)TOOL.$(BUILD_TARGET)) \ 7 $(TOOL.$(BUILD_TARGET)) \ 8 $(TOOL) ) endif $(eval $(TOOL_$(tool)_LINK_DLL)) # publish rule (still need work) ifndef $(target)_NOINST $(eval pubdll := $(PATH_BIN)/$(notdir $(dll))) $(pubdll) : $(dll) $(dir $(pubdll)).dir_created $(CP) $(dll) $(pubdll) $(eval TARGET_PUB_$(target) := $(pubdll)) _DLLS += $(pubdll) _OUT_FILES += $(dll) $(pubdll) else _DLLS += $(dll) _OUT_FILES += $(dll) endif _OBJS += $(_OBJS_$(target)) endef # Process dlls $(foreach target, $(DLLS) $(DLLS.$(BUILD_TARGET)), $(eval $(def_dll))) # # Process import libraries. # # - On OS/2 and windows these are libraries. # - On other platforms they are fake DLLs. ifeq ($(subst win32,os2,$(BUILD_TARGET)),os2) $(foreach target, $(IMPORT_LIBS) $(IMPORT_LIBS.$(BUILD_TARGET)), $(eval $(def_lib))) else $(foreach target, $(IMPORT_LIBS) $(IMPORT_LIBS.$(BUILD_TARGET)), $(eval $(def_dll))) endif $(foreach target, $(IMPORT_LIBS) $(IMPORT_LIBS.$(BUILD_TARGET)), $(eval _IMPORT_LIBS += $(firstword $(TARGET_PUB_$(target)) $(TARGET_$(target))))) # # PROGRAMS # ## Program (one). # @param $(target) Normalized target (program) name. define def_program # basics $(eval tool := $(call _TARGET_TOOL,$(target),LD)) $(eval outbase := $(call _TARGET_BASE,$(target),$(target))) $(eval PATH_$(target) := $(patsubst %/,%,$(dir $(outbase)))) $(eval exesuff := $(firstword $($(target)_EXESUFF) $($(target)_EXESUFF) $(TOOL_$(tool)_LDEXESUFF) $(SUFF_EXE))) $(eval exe := $(outbase)$(exesuff)) $(eval TARGET_$(target) := $(exe)) # source -> object $(eval $(def_target_sources)) # more library stuff. $(eval tool := $(call _TARGET_TOOL,$(target),LD)) $(eval outbase := $(call _TARGET_BASE,$(target),$(target))) $(eval objs = $(_OBJS_$(target))) $(eval flags :=\ $(TOOL_$(tool)_LDFLAGS)\ $(TOOL_$(tool)_LDFLAGS.$(BUILD_TYPE))\ $(TOOL_$(tool)_LDFLAGS.$(BUILD_TARGET))\ $(TOOL_$(tool)_LDFLAGS.$(BUILD_TARGET_ARCH))\ $(TOOL_$(tool)_LDFLAGS.$(BUILD_TARGET_CPU))\ $(LDFLAGS)\ $(LDFLAGS.$(BUILD_TYPE))\ $(LDFLAGS.$(BUILD_TARGET))\ $(LDFLAGS.$(BUILD_TARGET_ARCH))\ $(LDFLAGS.$(BUILD_TARGET_CPU))\ $($(target)_LDFLAGS)\ $($(target)_LDFLAGS.$(BUILD_TYPE))\ $($(target)_LDFLAGS.$(BUILD_TARGET))\ $($(target)_LDFLAGS.$(BUILD_TARGET_ARCH))\ $($(target)_LDFLAGS.$(BUILD_TARGET_CPU))\ ) $(eval libs :=\ $($(target)_LIBS.$(BUILD_TARGET_CPU))\ $($(target)_LIBS.$(BUILD_TARGET_ARCH))\ $($(target)_LIBS.$(BUILD_TARGET))\ $($(target)_LIBS.$(BUILD_TYPE))\ $($(target)_LIBS)\ $(foreach sdk, $($(target)_SDKS.$(BUILD_TARGET)) \ $($(target)_SDKS.$(BUILD_TYPE)) \ $($(target)_SDKS),\ $(SDK_$(sdk)_LIBS.$(BUILD_TARGET_CPU))\ $(SDK_$(sdk)_LIBS.$(BUILD_TARGET_ARCH))\ $(SDK_$(sdk)_LIBS.$(BUILD_TARGET))\ $(SDK_$(sdk)_LIBS.$(BUILD_TYPE))\ $(SDK_$(sdk)_LIBS))\ $(LIBS.$(BUILD_TARGET_CPU))\ $(LIBS.$(BUILD_TARGET_ARCH))\ $(LIBS.$(BUILD_TARGET))\ $(LIBS.$(BUILD_TYPE))\ $(LIBS)\ $(foreach sdk, $(SDKS.$(BUILD_TARGET)) \ $(SDKS.$(BUILD_TYPE)) \ $(SDKS),\ $(SDK_$(sdk)_LIBS.$(BUILD_TARGET_CPU))\ $(SDK_$(sdk)_LIBS.$(BUILD_TARGET_ARCH))\ $(SDK_$(sdk)_LIBS.$(BUILD_TARGET))\ $(SDK_$(sdk)_LIBS.$(BUILD_TYPE))\ $(SDK_$(sdk)_LIBS))\ $(TOOL_$(tool)_LIBS.$(BUILD_TARGET_CPU))\ $(TOOL_$(tool)_LIBS.$(BUILD_TARGET_ARCH))\ $(TOOL_$(tool)_LIBS.$(BUILD_TARGET))\ $(TOOL_$(tool)_LIBS.$(BUILD_TYPE))\ $(TOOL_$(tool)_LIBS)\ ) $(eval libpath :=\ $($(target)_LIBPATH.$(BUILD_TARGET_CPU))\ $($(target)_LIBPATH.$(BUILD_TARGET_ARCH))\ $($(target)_LIBPATH.$(BUILD_TARGET))\ $($(target)_LIBPATH.$(BUILD_TYPE))\ $($(target)_LIBPATH)\ $(foreach sdk, $($(target)_SDKS.$(BUILD_TARGET)) \ $($(target)_SDKS.$(BUILD_TYPE)) \ $($(target)_SDKS),\ $(SDK_$(sdk)_LIBPATH.$(BUILD_TARGET_CPU))\ $(SDK_$(sdk)_LIBPATH.$(BUILD_TARGET_ARCH))\ $(SDK_$(sdk)_LIBPATH.$(BUILD_TARGET))\ $(SDK_$(sdk)_LIBPATH.$(BUILD_TYPE))\ $(SDK_$(sdk)_LIBPATH))\ $(LIBPATH.$(BUILD_TARGET_CPU))\ $(LIBPATH.$(BUILD_TARGET_ARCH))\ $(LIBPATH.$(BUILD_TARGET))\ $(LIBPATH.$(BUILD_TYPE))\ $(LIBPATH)\ $(foreach sdk, $(SDKS.$(BUILD_TARGET)) \ $(SDKS.$(BUILD_TYPE)) \ $(SDKS),\ $(SDK_$(sdk)_LIBPATH.$(BUILD_TARGET_CPU))\ $(SDK_$(sdk)_LIBPATH.$(BUILD_TARGET_ARCH))\ $(SDK_$(sdk)_LIBPATH.$(BUILD_TARGET))\ $(SDK_$(sdk)_LIBPATH.$(BUILD_TYPE))\ $(SDK_$(sdk)_LIBPATH))\ $(TOOL_$(tool)_LIBPATH.$(BUILD_TARGET_CPU))\ $(TOOL_$(tool)_LIBPATH.$(BUILD_TARGET_ARCH))\ $(TOOL_$(tool)_LIBPATH.$(BUILD_TARGET))\ $(TOOL_$(tool)_LIBPATH.$(BUILD_TYPE))\ $(TOOL_$(tool)_LIBPATH)\ ) $(eval dirdep := $(dir $(exe)).dir_created) ## @todo fix dependencies $(eval deps := $($(target)_DEPS)) # $(eval custom_pre := $(strip $(firstword $($(target)_CUSTOM_PRE.$(BUILD_TARGET).$(BUILD_TYPE))\ $($(target)_CUSTOM_PRE.$(BUILD_TARGET))\ $($(target)_CUSTOM_PRE.$(BUILD_TYPE))\ $($(target)_CUSTOM_PRE)\ $(CUSTOM_PRE.$(BUILD_TARGET).$(BUILD_TYPE))\ $(CUSTOM_PRE.$(BUILD_TARGET))\ $(CUSTOM_PRE.$(BUILD_TYPE))\ $(CUSTOM_PRE)\ ))) $(eval custom_post := $(strip $(firstword $($(target)_CUSTOM_POST.$(BUILD_TARGET).$(BUILD_TYPE))\ $($(target)_CUSTOM_POST.$(BUILD_TARGET))\ $($(target)_CUSTOM_POST.$(BUILD_TYPE))\ $($(target)_CUSTOM_POST)\ $(CUSTOM_POST.$(BUILD_TARGET).$(BUILD_TYPE))\ $(CUSTOM_POST.$(BUILD_TARGET))\ $(CUSTOM_POST.$(BUILD_TYPE))\ $(CUSTOM_POST)\ ))) $(eval othersrc := $(filter-out %.c %.cpp %.cxx %.cc %.s %.S %.asm,$($(target)_SOURCES) $($(target)_SOURCES.$(BUILD_TARGET)) $($(target)_SOURCES.$(BUILD_MODE)))) $(eval $(TOOL_$(tool)_LINK_PROGRAM)) # publish rule (still need work) ifndef $(target)_NOINST $(eval pubexe := $(PATH_BIN)/$(notdir $(exe))) $(pubexe) : $(exe) $(dir $(pubexe)).dir_created $(CP) $(exe) $(pubexe) _DLLS += $(pubexe) _OUT_FILES += $(exe) $(pubexe) else _DLLS += $(exe) _OUT_FILES += $(exe) endif _OBJS += $(_OBJS_$(target)) endef # Process libraries $(foreach target, $(PROGRAMS) $(PROGRAMS.$(BUILD_TARGET)), $(eval $(def_program))) # # SYSMODS # ## System module (one). # @param $(target) Normalized target (program) name. define def_sysmod # sysmod basics $(eval tool := $(call _TARGET_TOOL,$(target),LD)) $(eval outbase := $(call _TARGET_BASE,$(target),$(target))) $(eval PATH_$(target) := $(patsubst %/,%,$(dir $(outbase)))) $(eval syssuff := $(firstword $($(target)_SYSSUFF) $($(target)_SYSSUFF) $(TOOL_$(tool)_LDSYSSUFF) $(SUFF_SYS))) $(eval sys := $(outbase)$(syssuff)) $(eval TARGET_$(target) := $(sys)) # source -> object $(eval $(def_target_sources)) # sysmod linking $(eval tool := $(call _TARGET_TOOL,$(target),LD)) $(eval outbase := $(call _TARGET_BASE,$(target),$(target))) $(eval objs = $(_OBJS_$(target))) $(eval flags :=\ $(TOOL_$(tool)_LDFLAGS)\ $(TOOL_$(tool)_LDFLAGS.$(BUILD_TYPE))\ $(TOOL_$(tool)_LDFLAGS.$(BUILD_TARGET))\ $(TOOL_$(tool)_LDFLAGS.$(BUILD_TARGET_ARCH))\ $(TOOL_$(tool)_LDFLAGS.$(BUILD_TARGET_CPU))\ $(LDFLAGS)\ $(LDFLAGS.$(BUILD_TYPE))\ $(LDFLAGS.$(BUILD_TARGET))\ $(LDFLAGS.$(BUILD_TARGET_ARCH))\ $(LDFLAGS.$(BUILD_TARGET_CPU))\ $($(target)_LDFLAGS)\ $($(target)_LDFLAGS.$(BUILD_TYPE))\ $($(target)_LDFLAGS.$(BUILD_TARGET))\ $($(target)_LDFLAGS.$(BUILD_TARGET_ARCH))\ $($(target)_LDFLAGS.$(BUILD_TARGET_CPU))\ ) $(eval libs :=\ $($(target)_LIBS.$(BUILD_TARGET_CPU))\ $($(target)_LIBS.$(BUILD_TARGET_ARCH))\ $($(target)_LIBS.$(BUILD_TARGET))\ $($(target)_LIBS.$(BUILD_TYPE))\ $($(target)_LIBS)\ $(foreach sdk, $($(target)_SDKS.$(BUILD_TARGET)) \ $($(target)_SDKS.$(BUILD_TYPE)) \ $($(target)_SDKS),\ $(SDK_$(sdk)_LIBS.$(BUILD_TARGET_CPU))\ $(SDK_$(sdk)_LIBS.$(BUILD_TARGET_ARCH))\ $(SDK_$(sdk)_LIBS.$(BUILD_TARGET))\ $(SDK_$(sdk)_LIBS.$(BUILD_TYPE))\ $(SDK_$(sdk)_LIBS))\ $(LIBS.$(BUILD_TARGET_CPU))\ $(LIBS.$(BUILD_TARGET_ARCH))\ $(LIBS.$(BUILD_TARGET))\ $(LIBS.$(BUILD_TYPE))\ $(LIBS)\ $(foreach sdk, $(SDKS.$(BUILD_TARGET)) \ $(SDKS.$(BUILD_TYPE)) \ $(SDKS),\ $(SDK_$(sdk)_LIBS.$(BUILD_TARGET_CPU))\ $(SDK_$(sdk)_LIBS.$(BUILD_TARGET_ARCH))\ $(SDK_$(sdk)_LIBS.$(BUILD_TARGET))\ $(SDK_$(sdk)_LIBS.$(BUILD_TYPE))\ $(SDK_$(sdk)_LIBS))\ $(TOOL_$(tool)_LIBS.$(BUILD_TARGET_CPU))\ $(TOOL_$(tool)_LIBS.$(BUILD_TARGET_ARCH))\ $(TOOL_$(tool)_LIBS.$(BUILD_TARGET))\ $(TOOL_$(tool)_LIBS.$(BUILD_TYPE))\ $(TOOL_$(tool)_LIBS)\ ) $(eval libpath :=\ $($(target)_LIBPATH.$(BUILD_TARGET_CPU))\ $($(target)_LIBPATH.$(BUILD_TARGET_ARCH))\ $($(target)_LIBPATH.$(BUILD_TARGET))\ $($(target)_LIBPATH.$(BUILD_TYPE))\ $($(target)_LIBPATH)\ $(foreach sdk, $($(target)_SDKS.$(BUILD_TARGET)) \ $($(target)_SDKS.$(BUILD_TYPE)) \ $($(target)_SDKS),\ $(SDK_$(sdk)_LIBPATH.$(BUILD_TARGET_CPU))\ $(SDK_$(sdk)_LIBPATH.$(BUILD_TARGET_ARCH))\ $(SDK_$(sdk)_LIBPATH.$(BUILD_TARGET))\ $(SDK_$(sdk)_LIBPATH.$(BUILD_TYPE))\ $(SDK_$(sdk)_LIBPATH))\ $(LIBPATH.$(BUILD_TARGET_CPU))\ $(LIBPATH.$(BUILD_TARGET_ARCH))\ $(LIBPATH.$(BUILD_TARGET))\ $(LIBPATH.$(BUILD_TYPE))\ $(LIBPATH)\ $(foreach sdk, $(SDKS.$(BUILD_TARGET)) \ $(SDKS.$(BUILD_TYPE)) \ $(SDKS),\ $(SDK_$(sdk)_LIBPATH.$(BUILD_TARGET_CPU))\ $(SDK_$(sdk)_LIBPATH.$(BUILD_TARGET_ARCH))\ $(SDK_$(sdk)_LIBPATH.$(BUILD_TARGET))\ $(SDK_$(sdk)_LIBPATH.$(BUILD_TYPE))\ $(SDK_$(sdk)_LIBPATH))\ $(TOOL_$(tool)_LIBPATH.$(BUILD_TARGET_CPU))\ $(TOOL_$(tool)_LIBPATH.$(BUILD_TARGET_ARCH))\ $(TOOL_$(tool)_LIBPATH.$(BUILD_TARGET))\ $(TOOL_$(tool)_LIBPATH.$(BUILD_TYPE))\ $(TOOL_$(tool)_LIBPATH)\ ) $(eval dirdep := $(dir $(sys)).dir_created) ## @todo fix dependencies $(eval deps := $($(target)_DEPS)) # $(eval custom_pre := $(strip $(firstword $($(target)_CUSTOM_PRE.$(BUILD_TARGET).$(BUILD_TYPE))\ $($(target)_CUSTOM_PRE.$(BUILD_TARGET))\ $($(target)_CUSTOM_PRE.$(BUILD_TYPE))\ $($(target)_CUSTOM_PRE)\ $(CUSTOM_PRE.$(BUILD_TARGET).$(BUILD_TYPE))\ $(CUSTOM_PRE.$(BUILD_TARGET))\ $(CUSTOM_PRE.$(BUILD_TYPE))\ $(CUSTOM_PRE)\ ))) $(eval custom_post := $(strip $(firstword $($(target)_CUSTOM_POST.$(BUILD_TARGET).$(BUILD_TYPE))\ $($(target)_CUSTOM_POST.$(BUILD_TARGET))\ $($(target)_CUSTOM_POST.$(BUILD_TYPE))\ $($(target)_CUSTOM_POST)\ $(CUSTOM_POST.$(BUILD_TARGET).$(BUILD_TYPE))\ $(CUSTOM_POST.$(BUILD_TARGET))\ $(CUSTOM_POST.$(BUILD_TYPE))\ $(CUSTOM_POST)\ ))) $(eval othersrc := $(filter-out %.c %.cpp %.cxx %.cc %.s %.S %.asm,$($(target)_SOURCES) $($(target)_SOURCES.$(BUILD_TARGET)) $($(target)_SOURCES.$(BUILD_MODE)))) ifndef TOOL_$(tool)_LINK_SYSMOD $$(warning kBuild: TOOL_$(tool)_LINK_SYSMOD is not defined. target=$(target) ) $$(warning kBuild: tools: \ 1 $($(target)_$(source)TOOL.$(BUILD_TARGET)) \ 2 $($(target)_$(source)TOOL) \ 3 $($(target)_TOOL.$(BUILD_TARGET)) \ 4 $($(target)_TOOL) \ 5 $($(source)TOOL) \ 6 $($(source)TOOL.$(BUILD_TARGET)) \ 7 $(TOOL.$(BUILD_TARGET)) \ 8 $(TOOL) ) endif $(eval $(TOOL_$(tool)_LINK_SYSMOD)) # publish rule (still need work) ifndef $(target)_NOINST $(eval pubsys := $(PATH_BIN)/$(notdir $(sys))) $(pubsys): $(sys) $(dir $(pubsys)).dir_created $(CP) $(sys) $(pubsys) $(eval _SYSMODS += $(pubsys)) $(eval _OUT_FILES += $(sys) $(pubsys)) else $(eval _SYSMODS += $(sys)) $(eval _OUT_FILES += $(sys)) endif _OBJS += $(_OBJS_$(target)) endef # Process sysmods $(foreach target, $(SYSMODS) $(SYSMODS.$(BUILD_TARGET)), $(eval $(def_sysmod))) # # OTHERS # _OTHERS = $(OTHERS) # # DOCS # # # Directories. # _DIRFILES := $(sort $(addsuffix /.dir_created,$(_DIRS)) $(addsuffix .dir_created,$(sort $(dir $(_OUT_FILES) $(_OBJS))))) define def_createdir $(dirfile): $(call MSG_Ltarget,Creating directory $$(@D)) $(MKDIR) -p $$(@D) @echo dir_created > $$@ endef $(foreach dirfile,$(_DIRFILES),$(eval $(def_createdir))) # # Include dependency files. # $(foreach dep,$(wildcard $(_DEPFILES)),$(eval include $(dep))) # # PASSES (including directory and makefile walking) # # Do all the default passes if it's unspecified. #PASSES ?= needed libraries binaries others publish PASSES ?= libraries dlls binaries others ## Proritized list of the default makefile when walking subdirectories. # The user can overload this list. DEFAULT_MAKEFILE ?= Makefile.kmk makefile.kmk Makefile makefile ## Subdir # @param $(pass) Lowercase pass name. # @param $(PASS) Uppercase pass name. # @param $(subdir) Subdirectory # @param $(tag) tag to attach to the rule name. define def_pass_subdir pass_$(pass)$(tag):: $(QUIET)$$(MAKE) -C $(subdir) -f $$(notdir $$(firstword $$(wildcard $$(addprefix $(subdir)/,$$(DEFAULT_MAKEFILE))))) pass_$(pass) endef ## Submakefile # @param $(pass) Lowercase pass name. # @param $(PASS) Uppercase pass name. # @param $(makefile) Makefile. # @param $(tag) tag to attach to the rule name. define def_pass_makefile pass_$(pass)$(tag):: $(QUIET)$$(MAKE) -C $(patsubst %/,%,$(dir $(makefile))) -f $(notdir $(makefile)) pass_$(pass) endef ## Execute a pass. # @param $(pass) Lowercase pass name. # @param $(PASS) Uppercase pass name. define def_pass $(eval SUBDIRS_$(PASS) ?= $(SUBDIRS) $(SUBDIRS.$(BUILD_TARGET))) $(eval SUBDIRS_AFTER_$(PASS) ?= $(SUBDIRS_AFTER) $(SUBDIRS_AFTER.$(BUILD_TARGET))) $(eval MAKEFILES_BEFORE_$(PASS) ?= $(MAKEFILES_BEFORE) $(MAKEFILES_BEFORE.$(BUILD_TARGET))) $(eval MAKEFILES_AFTER_$(PASS) ?= $(MAKEFILES_AFTER) $(MAKEFILES_AFTER.$(BUILD_TARGET))) $(eval tag:=_before) $(foreach subdir,$(SUBDIRS_$(PASS)) $(SUBDIRS_$(PASS).$(BUILD_TARGET)) ,$(eval $(def_pass_subdir))) $(foreach makefile,$(MAKEFILES_BEFORE_$(PASS)) $(MAKEFILES_BEFORE_$(PASS).$(BUILD_TARGET)),$(eval $(def_pass_makefile))) $(eval tag:=_after) $(foreach subdir,$(SUBDIRS_AFTER_$(PASS)) $(SUBDIRS_AFTER_$(PASS).$(BUILD_TARGET)) ,$(eval $(def_pass_subdir))) $(foreach makefile,$(MAKEFILES_AFTER_$(PASS)) $(MAKEFILES_AFTER_$(PASS).$(BUILD_TARGET)) ,$(eval $(def_pass_makefile))) .NOTPARALLEL: pass_$(pass)_before pass_$(pass)_after .PHONY: pass_$(pass) pass_$(pass)_before pass_$(pass)_doit pass_$(pass)_after pass_$(pass): \ pass_$(pass)_before \ pass_$(pass)_doit \ pass_$(pass)_after endef ## PASS: needed # This pass builds targets which are required for building the rest. pass_needed_doit: $(_NEEDEDS) pass := needed PASS := NEEDED $(eval $(def_pass)) ## PASS: libraries # This pass builds library targets. pass_libraries_doit: $(_LIBS) $(_IMPORT_LIBS) $(_OTHER_LIBRARIES) pass := libraries PASS := LIBRARIES $(eval $(def_pass)) ## PASS: binaries # This pass builds dll targets. pass_dlls_doit: $(_DLLS) $(_OTHER_DLLS) pass := dlls PASS := DLLS $(eval $(def_pass)) ## PASS: binaries # This pass builds binary targets, i.e. programs, system modules and stuff. pass_binaries_doit: $(_EXES) $(_SYSMODS) $(_OTHER_BINARIES) pass := binaries PASS := BINARIES $(eval $(def_pass)) ## PASS: others # This pass builds other targets. pass_others_doit: $(_OTHERS) pass := others PASS := OTHERS $(eval $(def_pass)) ## PASS: publish # This pass installs the built entities to a sandbox area. pass_publish_doit: publish publish:: pass := publish PASS := PUBLISH # $(sort).. not nice. SUBDIRS_PUBLISH ?= $(sort $(SUBDIRS) $(SUBDIRS.$(BUILD_TARGET)) $(SUBDIRS_LIBRARIES) $(SUBDIRS_LIBRARIES.$(BUILD_TARGET)) $(SUBDIRS_BINARIES) $(SUBDIRS_BINARIES.$(BUILD_TARGET)) $(SUBDIRS_OTHERS) $(SUBDIRS_OTHERS.$(BUILD_TARGET))) SUBDIRS_AFTER_PUBLISH ?= $(sort $(SUBDIRS_AFTER) $(SUBDIRS_AFTER.$(BUILD_TARGET)) $(SUBDIRS_AFTER_LIBRARIES) $(SUBDIRS_AFTER_LIBRARIES.$(BUILD_TARGET)) $(SUBDIRS_AFTER_BINARIES) $(SUBDIRS_AFTER_BINARIES.$(BUILD_TARGET)) $(SUBDIRS_AFTER_OTHERS) $(SUBDIRS_AFTER_OTHERS.$(BUILD_TARGET))) MAKEFILES_BEFORE_PUBLISH?= $(sort $(MAKEFILES_BEFORE) $(MAKEFILES_BEFORE.$(BUILD_TARGET)) $(MAKEFILES_BEFORE_LIBRARIES) $(MAKEFILES_BEFORE_LIBRARIES.$(BUILD_TARGET)) $(MAKEFILES_BEFORE_BINARIES) $(MAKEFILES_BEFORE_BINARIES.$(BUILD_TARGET)) $(MAKEFILES_BEFORE_OTHERS) $(MAKEFILES_BEFORE_OTHERS.$(BUILD_TARGET))) MAKEFILES_AFTER_PUBLISH ?= $(sort $(MAKEFILES_AFTER) $(MAKEFILES_AFTER.$(BUILD_TARGET)) $(MAKEFILES_AFTER_LIBRARIES) $(MAKEFILES_AFTER_LIBRARIES.$(BUILD_TARGET)) $(MAKEFILES_AFTER_BINARIES) $(MAKEFILES_AFTER_BINARIES.$(BUILD_TARGET)) $(MAKEFILES_AFTER_OTHERS) $(MAKEFILES_AFTER_OTHERS.$(BUILD_TARGET))) $(eval $(def_pass)) ## PASS: packing # This pass processes custom packing rules. pass_packing_doit: packing packing:: pass := packing PASS := PACKING $(eval $(def_pass)) ## PASS: clean # This pass removes all generated files. pass_clean_doit: $(RM) -f $(_OUT_FILES) $(_OBJS) $(_DEPFILES) $(_DIRFILES) $(OTHER_CLEAN) pass := clean PASS := CLEAN $(eval $(def_pass)) clean: pass_clean ## PASS: nothing # This pass just walks the tree. pass_nothing_doit: $(call MSG_Ltarget,Did nothing in $(CURDIR)) pass := nothing PASS := NOTHING $(eval $(def_pass)) nothing: pass_nothing # # THE MAIN RULES # all_recursive: $(foreach pass,$(PASSES),pass_$(pass)) rebuild: clean $(MAKE) -f $(firstword $(MAKEFILE_LIST)) all_recursive # misc shortcuts. target: needed libraries binaries others objects: $(_OBJS) libraries: $(_LIBS) $(_IMPORT_LIBS) $(_OTHER_LIBRARIES) dlls: $(_DLLS) programs: $(_EXES) sysmods: $(_SYSMODS) # end-of-file-content __footer_kmk__ := target endif # __footer_kmk__