Home | History | Annotate | Download | only in compiler-rt
      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   $(AlwaysRequiredModules) \
    168   $(call GetCNAVar,FUNCTIONS,$(Tmp.Key),$(Tmp.Config),$(Tmp.Arch))))
    169 $(call Set,Tmp.Optimized,$(strip \
    170   $(call GetCNAVar,OPTIMIZED,$(Tmp.Key),$(Tmp.Config),$(Tmp.Arch))))
    171 $(call Set,Tmp.AR,$(strip \
    172   $(call GetCNAVar,AR,$(Tmp.Key),$(Tmp.Config),$(Tmp.Arch))))
    173 $(call Set,Tmp.ARFLAGS,$(strip \
    174   $(call GetCNAVar,ARFLAGS,$(Tmp.Key),$(Tmp.Config),$(Tmp.Arch))))
    175 $(call Set,Tmp.RANLIB,$(strip \
    176   $(call GetCNAVar,RANLIB,$(Tmp.Key),$(Tmp.Config),$(Tmp.Arch))))
    177 $(call Set,Tmp.RANLIBFLAGS,$(strip \
    178   $(call GetCNAVar,RANLIBFLAGS,$(Tmp.Key),$(Tmp.Config),$(Tmp.Arch))))
    179 
    180 # Compute the object inputs for this library.
    181 $(call Set,Tmp.Inputs,\
    182   $(foreach fn,$(sort $(Tmp.Functions)),\
    183     $(call Set,Tmp.FnDir,\
    184       $(call SelectFunctionDir,$(Tmp.Config),$(Tmp.Arch),$(fn),$(Tmp.Optimized)))\
    185     $(Tmp.ObjPath)/$(Tmp.FnDir)/$(fn).o))
    186 $(Tmp.ObjPath)/libcompiler_rt.a: $(Tmp.Inputs) $(Tmp.ObjPath)/.dir
    187 	$(Summary) "  ARCHIVE:   $(Tmp.Name)/$(Tmp.Config)/$(Tmp.Arch): $$@"
    188 	-$(Verb) $(RM) $$@
    189 	$(Verb) $(Tmp.AR) $(Tmp.ARFLAGS) $$@ $(Tmp.Inputs)
    190 	$(Verb) $(Tmp.RANLIB) $(Tmp.RANLIBFLAGS) $$@
    191 .PRECIOUS: $(Tmp.ObjPath)/.dir
    192 
    193 # Per-Config-Arch Targets
    194 $(Tmp.Name)-$(Tmp.Config)-$(Tmp.Arch):: $(Tmp.ObjPath)/libcompiler_rt.a
    195 .PHONY: $(Tmp.Name)-$(Tmp.Config)-$(Tmp.Arch)
    196 
    197 # Per-Config-Arch-SubDir Objects
    198 $(foreach key,$(SubDirKeys),\
    199   $(call PerPlatformConfigArchSubDir_template,$(key)))
    200 endef
    201 
    202 define PerPlatformConfigArchSubDir_template
    203 $(call Set,Tmp.SubDirKey,$(1))
    204 $(call Set,Tmp.SubDir,$($(Tmp.SubDirKey).Dir))
    205 $(call Set,Tmp.SrcPath,$(ProjSrcRoot)/$(Tmp.SubDir))
    206 $(call Set,Tmp.ObjPath,$(ProjObjRoot)/$(Tmp.Name)/$(Tmp.Config)/$(Tmp.Arch)/$(Tmp.SubDirKey))
    207 $(call Set,Tmp.Dependencies,$($(Tmp.SubDirKey).Dependencies))
    208 $(call Set,Tmp.CC,$(strip \
    209   $(call GetCNAVar,CC,$(Tmp.Key),$(Tmp.Config),$(Tmp.Arch))))
    210 $(call Set,Tmp.KERNEL_USE,$(strip \
    211   $(call GetCNAVar,KERNEL_USE,$(Tmp.Key),$(Tmp.Config),$(Tmp.Arch))))
    212 $(call Set,Tmp.VISIBILITY_HIDDEN,$(strip \
    213   $(call GetCNAVar,VISIBILITY_HIDDEN,$(Tmp.Key),$(Tmp.Config),$(Tmp.Arch))))
    214 $(call Set,Tmp.CFLAGS,$(strip \
    215   $(if $(call IsDefined,$(Tmp.Key).UniversalArchs),-arch $(Tmp.Arch),)\
    216   $(if $(call streq,$(Tmp.VISIBILITY_HIDDEN),1),\
    217        -fvisibility=hidden -DVISIBILITY_HIDDEN,)\
    218   $(if $(call streq,$(Tmp.KERNEL_USE),1),\
    219        -mkernel -DKERNEL_USE,)\
    220   $(call GetCNAVar,CFLAGS,$(Tmp.Key),$(Tmp.Config),$(Tmp.Arch))))
    221 
    222 $(Tmp.ObjPath)/%.o: $(Tmp.SrcPath)/%.s $(Tmp.Dependencies) $(Tmp.ObjPath)/.dir
    223 	$(Summary) "  ASSEMBLE:  $(Tmp.Name)/$(Tmp.Config)/$(Tmp.Arch): $$<"
    224 	$(Verb) $(Tmp.CC) $(Tmp.CFLAGS)  -c -o $$@ $$<
    225 $(Tmp.ObjPath)/%.o: $(Tmp.SrcPath)/%.S $(Tmp.Dependencies) $(Tmp.ObjPath)/.dir
    226 	$(Summary) "  ASSEMBLE:  $(Tmp.Name)/$(Tmp.Config)/$(Tmp.Arch): $$<"
    227 	$(Verb) $(Tmp.CC) $(Tmp.CFLAGS) -c -o $$@ $$<
    228 $(Tmp.ObjPath)/%.o: $(Tmp.SrcPath)/%.c $(Tmp.Dependencies) $(Tmp.ObjPath)/.dir
    229 	$(Summary) "  COMPILE:   $(Tmp.Name)/$(Tmp.Config)/$(Tmp.Arch): $$<"
    230 	$(Verb) $(Tmp.CC) $(Tmp.CFLAGS) -c $(COMMON_CFLAGS) -o $$@ $$<
    231 $(Tmp.ObjPath)/%.o: $(Tmp.SrcPath)/%.cc $(Tmp.Dependencies) $(Tmp.ObjPath)/.dir
    232 	$(Summary) "  COMPILE:   $(Tmp.Name)/$(Tmp.Config)/$(Tmp.Arch): $$<"
    233 	$(Verb) $(Tmp.CC) $(Tmp.CFLAGS) -c $(COMMON_CXXFLAGS) -o $$@ $$<
    234 .PRECIOUS: $(Tmp.ObjPath)/.dir
    235 
    236 endef
    237 
    238 # Run templates.
    239 $(foreach key,$(PlatformKeys),\
    240   $(eval $(call PerPlatform_template,$(key))))
    241 
    242 ###
    243 
    244 ifneq ($(DEBUGMAKE),)
    245   $(info MAKE: Done processing Makefile)
    246   $(info  )
    247 endif
    248