blob: ab1850a1250a37089d877f62065753dd7bc897e4 [file] [log] [blame]
SubDirs := lib
# Set default rule before anything else.
all::
include make/config.mk
include make/util.mk
# If SRCROOT is defined, assume we are doing an Apple style build. We
# should be able to use RC_XBS for this but that is unused during
# "make installsrc".
ifdef SRCROOT
include make/AppleBI.mk
endif
# Make sure we don't build with a missing ProjObjRoot.
ifeq ($(ProjObjRoot),)
$(error Refusing to build with empty ProjObjRoot variable)
endif
##############
###
# Rules
###
# Top level targets
# Provide default clean target which is extended by other templates.
.PHONY: clean
clean::
# Test
.PHONY: test
test:
cd test/Unit && ./test
# Template: Config_template Config
#
# This template is used once per Config at the top-level.
define Config_template
$(call Set,ActiveConfig,$1)
$(call Set,ActiveObjPath,$(ProjObjRoot)/$(ActiveConfig))
$(call Set,ActiveLibGen,$(ActiveObjPath)/libcompiler_rt.Generic.a)
$(call Set,ActiveLibOpt,$(ActiveObjPath)/libcompiler_rt.Optimized.a)
# The sublibraries to use for a generic version.
$(call Set,GenericInputs,$(foreach arch,$(TargetArchs),$(ActiveObjPath)/$(arch)/libcompiler_rt.Generic.a))
# The sublibraries to use for an optimized version.
$(call Set,OptimizedInputs,$(foreach arch,$(TargetArchs),$(ActiveObjPath)/$(arch)/libcompiler_rt.Optimized.a))
# Provide top-level fat archive targets. We make sure to not try to lipo if only
# building one target arch.
$(ActiveLibGen): $(GenericInputs) $(ActiveObjPath)/.dir
$(Summary) " UNIVERSAL: $(ActiveConfig): $$@"
-$(Verb) $(RM) $$@
$(if $(TargetArch), \
$(Verb) $(CP) $(GenericInputs) $$@, \
$(Verb) $(Lipo) -create -output $$@ $(GenericInputs))
$(ActiveLibOpt): $(OptimizedInputs) $(ActiveObjPath)/.dir
$(Summary) " UNIVERSAL: $(ActiveConfig): $$@"
-$(Verb) $(RM) $$@
$(if $(TargetArch), \
$(Verb) $(CP) $(GenericInputs) $$@, \
$(Verb) $(Lipo) -create -output $$@ $(OptimizedInputs))
.PRECIOUS: $(ActiveObjPath)/.dir
# Add to default "alias" target.
$(ActiveConfig):: $(ActiveLibGen) $(ActiveLibOpt)
# Add to target lists.
all:: $(ActiveConfig) $(ActiveLibGen) $(ActiveLibOpt)
# Remove entire config directory on clean.
clean:: $(ActiveObjPath)/.remove
endef
# Template: CNA_template Config Arch
#
# This template is used once per Config/Arch at the top-level.
define CNA_template
$(call Set,ActiveConfig,$1)
$(call Set,ActiveArch,$2)
$(call Set,ActiveObjPath,$(ProjObjRoot)/$(ActiveConfig)/$(ActiveArch))
$(call Set,ActiveLibGen,$(ActiveObjPath)/libcompiler_rt.Generic.a)
$(call Set,ActiveLibOpt,$(ActiveObjPath)/libcompiler_rt.Optimized.a)
# Initialize inputs lists. This are extended by the CNA_subdir
# template. The one tricky bit is that we need to use these quoted,
# because they are not complete until the entire makefile has been
# processed.
$(call Set,GenericInputs.$(ActiveConfig).$(ActiveArch),)
$(call Set,OptimizedInputs.$(ActiveConfig).$(ActiveArch),)
# Final.Inputs is created once we have loaded all the subdirectories
# and know what the correct inputs are.
# Provide top-level archive targets.
$(ActiveLibGen): $(ActiveObjPath)/.dir
$(Summary) " ARCHIVE: $(ActiveConfig)/$(ActiveArch): $$@"
-$(Verb) $(RM) $$@
$(Verb) $(Archive) $$@ $$(Generic.Inputs.$(ActiveConfig).$(ActiveArch))
$(Verb) $(Ranlib) $$@
# FIXME: The dependency on ActiveLibGen is a hack, this picks up the
# dependencies on the generic inputs.
$(ActiveLibOpt): $(ActiveLibGen) $(ActiveObjPath)/.dir
$(Summary) " ARCHIVE: $(ActiveConfig)/$(ActiveArch): $$@"
-$(Verb) $(RM) $$@
$(Verb) $(Archive) $$@ $$(Final.Inputs.$(ActiveConfig).$(ActiveArch))
$(Verb) $(Ranlib) $$@
.PRECIOUS: $(ActiveObjPath)/.dir
# Provide some default "alias" targets.
$(ActiveConfig):: $(ActiveLibGen) $(ActiveLibOpt)
$(ActiveArch):: $(ActiveLibGen) $(ActiveLibOpt)
$(ActiveConfig)-$(ActiveArch):: $(ActiveLibGen) $(ActiveLibOpt)
endef
$(foreach config,$(Configs), \
$(foreach arch,$(Archs), \
$(eval $(call CNA_template,$(config),$(arch)))))
$(foreach config,$(Configs), \
$(eval $(call Config_template,$(config))))
###
# How to build things.
# Define rules for building on each configuration & architecture. This
# is not exactly obvious, but variables inside the template are being
# expanded during the make processing, so automatic variables must be
# quoted and normal assignment cannot be used.
# Template: CNA_template Config Arch Dir
# Uses: GetArgs, Dependencies, ObjNames
#
# This template is used once per Config/Arch/Dir.
define CNA_subdir_template
$(call Set,ActiveConfig,$1)
$(call Set,ActiveArch,$2)
$(call Set,ActiveDir,$3)
$(call Set,ActiveSrcPath,$(ProjSrcRoot)/$(ActiveDir))
$(call Set,ActiveObjPath,$(ProjObjRoot)/$(ActiveDir)/$(ActiveConfig)/$(ActiveArch))
$(call Set,ActiveFlags,$(call GetArgs,$(ActiveConfig),$(ActiveArch)))
$(call Set,ActiveObjects,$(ObjNames:%=$(ActiveObjPath)/%))
# Add to the input list for the appropriate library and update the
# dependency.
$(call Append,$(Target).Inputs.$(ActiveConfig).$(ActiveArch),$(ActiveObjects))
$(ProjObjRoot)/$(ActiveConfig)/$(ActiveArch)/libcompiler_rt.$(Target).a: $(ActiveObjects)
$(ActiveObjPath)/%.o: $(ActiveSrcPath)/%.s $(Dependencies) $(ActiveObjPath)/.dir
$(Summary) " ASSEMBLE: $(ActiveConfig)/$(ActiveArch): $$<"
$(Verb) $(CC) -c -o $$@ $(ActiveFlags) $$<
.PRECIOUS: $(ActiveObjPath)/.dir
$(ActiveObjPath)/%.o: $(ActiveSrcPath)/%.S $(Dependencies) $(ActiveObjPath)/.dir
$(Summary) " ASSEMBLE: $(ActiveConfig)/$(ActiveArch): $$<"
$(Verb) $(CC) -c -o $$@ $(ActiveFlags) $$<
.PRECIOUS: $(ActiveObjPath)/.dir
$(ActiveObjPath)/%.o: $(ActiveSrcPath)/%.c $(Dependencies) $(ActiveObjPath)/.dir
$(Summary) " COMPILE: $(ActiveConfig)/$(ActiveArch): $$<"
$(Verb) $(CC) -c -o $$@ $(ActiveFlags) $$<
.PRECIOUS: $(ActiveObjPath)/.dir
# Remove entire config directory on clean.
clean:: $(ProjObjRoot)/$(ActiveDir)/$(ActiveConfig)/.remove
endef
###
# Directory handling magic.
# Create directories as needed, and timestamp their creation.
%/.dir:
$(Summary) " MKDIR: $*"
$(Verb) $(MKDIR) $* > /dev/null
$(Verb) $(DATE) > $@
# Remove directories
%/.remove:
$(Verb) $(RM) -r $*
###
# Include child makefile fragments
$(foreach subdir,$(SubDirs),$(eval include $(subdir)/Makefile.mk))
###
# Determine the actual inputs for an optimized library.
# Template: Final_CNA_template Config Arch
# Uses: GetArgs, Dependencies, ObjNames
#
# This template is used once per Config/Arch.
define Final_CNA_template
$(call Set,ActiveConfig,$1)
$(call Set,ActiveArch,$2)
$(call Set,Final.Inputs.$(ActiveConfig).$(ActiveArch),\
$(shell make/filter-inputs \
$(Optimized.Inputs.$(ActiveConfig).$(ActiveArch)) \
$(Generic.Inputs.$(ActiveConfig).$(ActiveArch))))
endef
$(foreach config,$(Configs), \
$(foreach arch,$(Archs), \
$(eval $(call Final_CNA_template,$(config),$(arch)))))