summaryrefslogtreecommitdiff
path: root/Makefile
diff options
context:
space:
mode:
Diffstat (limited to 'Makefile')
-rw-r--r--Makefile194
1 files changed, 194 insertions, 0 deletions
diff --git a/Makefile b/Makefile
new file mode 100644
index 000000000..16ee1a460
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,194 @@
+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,$(Archs),$(ActiveObjPath)/$(arch)/libcompiler_rt.Generic.a))
+# The sublibraries to use for an optimized version.
+$(call Set,OptimizedInputs,$(foreach arch,$(Archs),$(ActiveObjPath)/$(arch)/libcompiler_rt.Optimized.a))
+
+# Provide top-level fat archive targets.
+$(ActiveLibGen): $(GenericInputs) $(ActiveObjPath)/.dir
+ $(Summary) " UNIVERSAL: $(ActiveConfig): $$@"
+ -$(Verb) $(RM) $$@
+ $(Verb) $(Lipo) -create -output $$@ $(GenericInputs)
+$(ActiveLibOpt): $(OptimizedInputs) $(ActiveObjPath)/.dir
+ $(Summary) " UNIVERSAL: $(ActiveConfig): $$@"
+ -$(Verb) $(RM) $$@
+ $(Verb) $(Lipo) -create -output $$@ $(OptimizedInputs)
+.PRECIOUS: $(ActiveObjPath)/.dir
+
+# 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)/%.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)))))