Home | History | Annotate | Download | only in runtime
      1 SubDirs := lib
      2 
      3 # Set default rule before anything else.
      4 all: help
      5 
      6 include make/config.mk
      7 include make/util.mk
      8 # If SRCROOT is defined, assume we are doing an Apple style build. We should be
      9 # able to use RC_XBS for this but that is unused during "make installsrc".
     10 ifdef SRCROOT
     11   include make/AppleBI.mk
     12 endif
     13 
     14 # Make sure we don't build with a missing ProjObjRoot.
     15 ifeq ($(ProjObjRoot),)
     16 $(error Refusing to build with empty ProjObjRoot variable)
     17 endif
     18 
     19 ##############
     20 
     21 ###
     22 # Rules
     23 
     24 ###
     25 # Top level targets
     26 
     27 # FIXME: Document the available subtargets.
     28 help:
     29 	@echo "usage: make [{VARIABLE=VALUE}*] target"
     30 	@echo
     31 	@echo "User variables:"
     32 	@echo "  VERBOSE=1: Use to show all commands [default=0]"
     33 	@echo
     34 	@echo "Available targets:"
     35 	@echo "  <platform name>: build the libraries for 'platform'"
     36 	@echo "  clean:           clean all configurations"
     37 	@echo "  test:            run unit tests"
     38 	@echo
     39 	@echo "  info-platforms:  list available platforms"
     40 	@echo "  help-devel:      print additional help for developers"
     41 	@echo
     42 
     43 help-devel: help
     44 	@echo "Development targets:"
     45 	@echo "  <platform name>-<config name>:"
     46 	@echo "    build the libraries for a single platform config"
     47 	@echo "  <platform name>-<config name>-<arch name>:"
     48 	@echo "    build the libraries for a single config and arch"
     49 	@echo "  info-functions: list available compiler-rt functions"
     50 	@echo "  help-hidden: print help for Makefile debugging"
     51 	@echo
     52 
     53 help-hidden: help-devel
     54 	@echo "Debugging variables:"
     55 	@echo "  DEBUGMAKE=1: enable some Makefile logging [default=]"
     56 	@echo "           =2: enable more Makefile logging"
     57 	@echo
     58 	@echo "Debugging targets:"
     59 	@echo "  make-print-FOO: print information on the variable 'FOO'"
     60 	@echo
     61 
     62 info-functions:
     63 	@echo "compiler-rt Available Functions"
     64 	@echo
     65 	@echo "All Functions: $(AvailableFunctions)"
     66 	@$(foreach fn,$(AvailableFunctions),\
     67 	  printf "  %-20s - available in (%s)\n" $(fn)\
     68 	    "$(foreach key,$(AvailableIn.$(fn)),$($(key).Dir))";)
     69 
     70 info-platforms:
     71 	@echo "compiler-rt Available Platforms"
     72 	@echo
     73 	@echo "Platforms:"
     74 	@$(foreach key,$(PlatformKeys),\
     75 	  printf "  %s - from '%s'\n" $($(key).Name) $($(key).Path);\
     76 	  printf "    %s\n" "$($(key).Description)";\
     77 	  printf "    Configurations: %s\n\n" "$($(key).Configs)";)
     78 
     79 # Provide default clean target which is extended by other templates.
     80 .PHONY: clean
     81 clean::
     82 
     83 # Test
     84 .PHONY: test
     85 test:
     86 	cd test/Unit && ./test
     87 
     88 ###
     89 # Directory handling magic.
     90 
     91 # Create directories as needed, and timestamp their creation.
     92 %/.dir:
     93 	$(Summary) "  MKDIR:     $*"
     94 	$(Verb) $(MKDIR) $* > /dev/null
     95 	$(Verb) $(DATE) > $@
     96 
     97 # Remove directories
     98 %/.remove:
     99 	$(Verb) $(RM) -r $*
    100 
    101 ###
    102 # Include child makefile fragments
    103 
    104 Dir := .
    105 include make/subdir.mk
    106 include make/lib_info.mk
    107 include make/lib_util.mk
    108 include make/lib_platforms.mk
    109 
    110 ###
    111 # Define Platform Rules
    112 
    113 define PerPlatform_template
    114 $(call Set,Tmp.Key,$(1))
    115 $(call Set,Tmp.Name,$($(Tmp.Key).Name))
    116 $(call Set,Tmp.Configs,$($(Tmp.Key).Configs))
    117 $(call Set,Tmp.ObjPath,$(ProjObjRoot)/$(Tmp.Name))
    118 
    119 # Top-Level Platform Target
    120 $(Tmp.Name):: $(Tmp.Configs:%=$(Tmp.ObjPath)/%/libcompiler_rt.a)
    121 .PHONY: $(Tmp.Name)
    122 
    123 clean::
    124 	$(Verb) rm -rf $(Tmp.ObjPath)
    125 
    126 # Per-Config Libraries
    127 $(foreach config,$(Tmp.Configs),\
    128   $(call PerPlatformConfig_template,$(config)))
    129 endef
    130 
    131 define PerPlatformConfig_template
    132 $(call Set,Tmp.Config,$(1))
    133 $(call Set,Tmp.ObjPath,$(ProjObjRoot)/$(Tmp.Name)/$(Tmp.Config))
    134 
    135 # Compute the archs to build, depending on whether this is a universal build or
    136 # not.
    137 $(call Set,Tmp.ArchsToBuild,\
    138   $(if $(call IsDefined,$(Tmp.Key).UniversalArchs),\
    139        $(strip \
    140          $(or $($(Tmp.Key).UniversalArchs.$(Tmp.Config)),\
    141               $($(Tmp.Key).UniversalArchs))),\
    142        $(call VarOrDefault,$(Tmp.Key).Arch.$(Tmp.Config),$($(Tmp.Key).Arch))))
    143 
    144 # Copy or lipo to create the per-config library.
    145 $(call Set,Tmp.Inputs,$(Tmp.ArchsToBuild:%=$(Tmp.ObjPath)/%/libcompiler_rt.a))
    146 $(Tmp.ObjPath)/libcompiler_rt.a: $(Tmp.Inputs) $(Tmp.ObjPath)/.dir
    147 	$(Summary) "  FINAL-ARCHIVE: $(Tmp.Name)/$(Tmp.Config): $$@"
    148 	-$(Verb) $(RM) $$@
    149 	$(if $(call streq,1,$(words $(Tmp.ArchsToBuild))), \
    150 	  $(Verb) $(CP) $(Tmp.Inputs) $$@, \
    151 	  $(Verb) $(LIPO) -create -output $$@ $(Tmp.Inputs))
    152 .PRECIOUS: $(Tmp.ObjPath)/.dir
    153 
    154 # Per-Config Targets
    155 $(Tmp.Name)-$(Tmp.Config):: $(Tmp.ObjPath)/libcompiler_rt.a
    156 .PHONY: $(Tmp.Name)-$(Tmp.Config)
    157 
    158 # Per-Config-Arch Libraries
    159 $(foreach arch,$(Tmp.ArchsToBuild),\
    160   $(call PerPlatformConfigArch_template,$(arch)))
    161 endef
    162 
    163 define PerPlatformConfigArch_template
    164 $(call Set,Tmp.Arch,$(1))
    165 $(call Set,Tmp.ObjPath,$(ProjObjRoot)/$(Tmp.Name)/$(Tmp.Config)/$(Tmp.Arch))
    166 $(call Set,Tmp.Functions,$(strip \
    167   $(call GetCNAVar,FUNCTIONS,$(Tmp.Key),$(Tmp.Config),$(Tmp.Arch))))
    168 $(call Set,Tmp.Optimized,$(strip \
    169   $(call GetCNAVar,OPTIMIZED,$(Tmp.Key),$(Tmp.Config),$(Tmp.Arch))))
    170 $(call Set,Tmp.AR,$(strip \
    171   $(call GetCNAVar,AR,$(Tmp.Key),$(Tmp.Config),$(Tmp.Arch))))
    172 $(call Set,Tmp.ARFLAGS,$(strip \
    173   $(call GetCNAVar,ARFLAGS,$(Tmp.Key),$(Tmp.Config),$(Tmp.Arch))))
    174 $(call Set,Tmp.RANLIB,$(strip \
    175   $(call GetCNAVar,RANLIB,$(Tmp.Key),$(Tmp.Config),$(Tmp.Arch))))
    176 $(call Set,Tmp.RANLIBFLAGS,$(strip \
    177   $(call GetCNAVar,RANLIBFLAGS,$(Tmp.Key),$(Tmp.Config),$(Tmp.Arch))))
    178 
    179 # Compute the object inputs for this library.
    180 $(call Set,Tmp.Inputs,\
    181   $(foreach fn,$(sort $(Tmp.Functions)),\
    182     $(call Set,Tmp.FnDir,\
    183       $(call SelectFunctionDir,$(Tmp.Config),$(Tmp.Arch),$(fn),$(Tmp.Optimized)))\
    184     $(Tmp.ObjPath)/$(Tmp.FnDir)/$(fn).o))
    185 $(Tmp.ObjPath)/libcompiler_rt.a: $(Tmp.Inputs) $(Tmp.ObjPath)/.dir
    186 	$(Summary) "  ARCHIVE:   $(Tmp.Name)/$(Tmp.Config)/$(Tmp.Arch): $$@"
    187 	-$(Verb) $(RM) $$@
    188 	$(Verb) $(Tmp.AR) $(Tmp.ARFLAGS) $$@ $(Tmp.Inputs)
    189 	$(Verb) $(Tmp.RANLIB) $(Tmp.RANLIBFLAGS) $$@
    190 .PRECIOUS: $(Tmp.ObjPath)/.dir
    191 
    192 # Per-Config-Arch Targets
    193 $(Tmp.Name)-$(Tmp.Config)-$(Tmp.Arch):: $(Tmp.ObjPath)/libcompiler_rt.a
    194 .PHONY: $(Tmp.Name)-$(Tmp.Config)-$(Tmp.Arch)
    195 
    196 # Per-Config-Arch-SubDir Objects
    197 $(foreach key,$(SubDirKeys),\
    198   $(call PerPlatformConfigArchSubDir_template,$(key)))
    199 endef
    200 
    201 define PerPlatformConfigArchSubDir_template
    202 $(call Set,Tmp.SubDirKey,$(1))
    203 $(call Set,Tmp.SubDir,$($(Tmp.SubDirKey).Dir))
    204 $(call Set,Tmp.SrcPath,$(ProjSrcRoot)/$(Tmp.SubDir))
    205 $(call Set,Tmp.ObjPath,$(ProjObjRoot)/$(Tmp.Name)/$(Tmp.Config)/$(Tmp.Arch)/$(Tmp.SubDirKey))
    206 $(call Set,Tmp.Dependencies,$($(Tmp.SubDirKey).Dependencies))
    207 $(call Set,Tmp.CC,$(strip \
    208   $(call GetCNAVar,CC,$(Tmp.Key),$(Tmp.Config),$(Tmp.Arch))))
    209 $(call Set,Tmp.CFLAGS,$(strip \
    210   $(if $(call IsDefined,$(Tmp.Key).UniversalArchs),-arch $(Tmp.Arch),)\
    211   $(if $(call streq,$($(Tmp.Key).VISIBILITY_HIDDEN),1),\
    212        -fvisibility=hidden -DVISIBILITY_HIDDEN,)\
    213   $(call GetCNAVar,CFLAGS,$(Tmp.Key),$(Tmp.Config),$(Tmp.Arch))))
    214 
    215 $(Tmp.ObjPath)/%.o: $(Tmp.SrcPath)/%.s $(Tmp.Dependencies) $(Tmp.ObjPath)/.dir
    216 	$(Summary) "  ASSEMBLE:  $(Tmp.Name)/$(Tmp.Config)/$(Tmp.Arch): $$<"
    217 	$(Verb) $(Tmp.CC) $(Tmp.CFLAGS)  -c -o $$@ $$<
    218 $(Tmp.ObjPath)/%.o: $(Tmp.SrcPath)/%.S $(Tmp.Dependencies) $(Tmp.ObjPath)/.dir
    219 	$(Summary) "  ASSEMBLE:  $(Tmp.Name)/$(Tmp.Config)/$(Tmp.Arch): $$<"
    220 	$(Verb) $(Tmp.CC) $(Tmp.CFLAGS) -c -o $$@ $$<
    221 $(Tmp.ObjPath)/%.o: $(Tmp.SrcPath)/%.c $(Tmp.Dependencies) $(Tmp.ObjPath)/.dir
    222 	$(Summary) "  COMPILE:   $(Tmp.Name)/$(Tmp.Config)/$(Tmp.Arch): $$<"
    223 	$(Verb) $(Tmp.CC) $(Tmp.CFLAGS) -c -o $$@ $$<
    224 .PRECIOUS: $(Tmp.ObjPath)/.dir
    225 
    226 endef
    227 
    228 # Run templates.
    229 $(foreach key,$(PlatformKeys),\
    230   $(eval $(call PerPlatform_template,$(key))))
    231 
    232 ###
    233 
    234 ifneq ($(DEBUGMAKE),)
    235   $(info MAKE: Done processing Makefile)
    236   $(info  )
    237 endif
    238