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) echo 'Created.' > $@
     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.Name)-%)
    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 $(call Set,Tmp.SHARED_LIBRARY,$(strip \
    135   $(call GetCNAVar,SHARED_LIBRARY,$(Tmp.Key),$(Tmp.Config),$(Tmp.Arch))))
    136 $(call Set,Tmp.SHARED_LIBRARY_SUFFIX,$(strip \
    137   $(call GetCNAVar,SHARED_LIBRARY_SUFFIX,$(Tmp.Key),$(Tmp.Config),$(Tmp.Arch))))
    138 
    139 # Compute the library suffix.
    140 $(if $(call streq,1,$(Tmp.SHARED_LIBRARY)),
    141   $(call Set,Tmp.LibrarySuffix,$(Tmp.SHARED_LIBRARY_SUFFIX)),
    142   $(call Set,Tmp.LibrarySuffix,a))
    143 
    144 # Compute the archs to build, depending on whether this is a universal build or
    145 # not.
    146 $(call Set,Tmp.ArchsToBuild,\
    147   $(if $(call IsDefined,$(Tmp.Key).UniversalArchs),\
    148        $(strip \
    149          $(or $($(Tmp.Key).UniversalArchs.$(Tmp.Config)),\
    150               $($(Tmp.Key).UniversalArchs))),\
    151        $(call VarOrDefault,$(Tmp.Key).Arch.$(Tmp.Config),$($(Tmp.Key).Arch))))
    152 
    153 # Copy or lipo to create the per-config library.
    154 $(call Set,Tmp.Inputs,$(Tmp.ArchsToBuild:%=$(Tmp.ObjPath)/%/libcompiler_rt.$(Tmp.LibrarySuffix)))
    155 $(Tmp.ObjPath)/libcompiler_rt.$(Tmp.LibrarySuffix): $(Tmp.Inputs) $(Tmp.ObjPath)/.dir
    156 	$(Summary) "  FINAL-ARCHIVE: $(Tmp.Name)/$(Tmp.Config): $$@"
    157 	-$(Verb) $(RM) $$@
    158 	$(if $(call streq,1,$(words $(Tmp.ArchsToBuild))), \
    159 	  $(Verb) $(CP) $(Tmp.Inputs) $$@, \
    160 	  $(Verb) $(LIPO) -create -output $$@ $(Tmp.Inputs))
    161 .PRECIOUS: $(Tmp.ObjPath)/.dir
    162 
    163 # Per-Config Targets
    164 $(Tmp.Name)-$(Tmp.Config):: $(Tmp.ObjPath)/libcompiler_rt.$(Tmp.LibrarySuffix)
    165 .PHONY: $(Tmp.Name)-$(Tmp.Config)
    166 
    167 # Per-Config-Arch Libraries
    168 $(foreach arch,$(Tmp.ArchsToBuild),\
    169   $(call PerPlatformConfigArch_template,$(arch)))
    170 endef
    171 
    172 define PerPlatformConfigArch_template
    173 $(call Set,Tmp.Arch,$(1))
    174 $(call Set,Tmp.ObjPath,$(ProjObjRoot)/$(Tmp.Name)/$(Tmp.Config)/$(Tmp.Arch))
    175 $(call Set,Tmp.Functions,$(strip \
    176   $(AlwaysRequiredModules) \
    177   $(call GetCNAVar,FUNCTIONS,$(Tmp.Key),$(Tmp.Config),$(Tmp.Arch))))
    178 $(call Set,Tmp.Optimized,$(strip \
    179   $(call GetCNAVar,OPTIMIZED,$(Tmp.Key),$(Tmp.Config),$(Tmp.Arch))))
    180 $(call Set,Tmp.AR,$(strip \
    181   $(call GetCNAVar,AR,$(Tmp.Key),$(Tmp.Config),$(Tmp.Arch))))
    182 $(call Set,Tmp.ARFLAGS,$(strip \
    183   $(call GetCNAVar,ARFLAGS,$(Tmp.Key),$(Tmp.Config),$(Tmp.Arch))))
    184 $(call Set,Tmp.CC,$(strip \
    185   $(call GetCNAVar,CC,$(Tmp.Key),$(Tmp.Config),$(Tmp.Arch))))
    186 $(call Set,Tmp.LDFLAGS,$(strip \
    187   $(call GetCNAVar,LDFLAGS,$(Tmp.Key),$(Tmp.Config),$(Tmp.Arch))))
    188 $(call Set,Tmp.RANLIB,$(strip \
    189   $(call GetCNAVar,RANLIB,$(Tmp.Key),$(Tmp.Config),$(Tmp.Arch))))
    190 $(call Set,Tmp.RANLIBFLAGS,$(strip \
    191   $(call GetCNAVar,RANLIBFLAGS,$(Tmp.Key),$(Tmp.Config),$(Tmp.Arch))))
    192 $(call Set,Tmp.SHARED_LIBRARY,$(strip \
    193   $(call GetCNAVar,SHARED_LIBRARY,$(Tmp.Key),$(Tmp.Config),$(Tmp.Arch))))
    194 
    195 # Compute the library suffix.
    196 $(if $(call streq,1,$(Tmp.SHARED_LIBRARY)),
    197   $(call Set,Tmp.LibrarySuffix,$(Tmp.SHARED_LIBRARY_SUFFIX)),
    198   $(call Set,Tmp.LibrarySuffix,a))
    199 
    200 # Compute the object inputs for this library.
    201 $(call Set,Tmp.Inputs,\
    202   $(foreach fn,$(sort $(Tmp.Functions)),\
    203     $(call Set,Tmp.FnDir,\
    204       $(call SelectFunctionDir,$(Tmp.Config),$(Tmp.Arch),$(fn),$(Tmp.Optimized)))\
    205     $(Tmp.ObjPath)/$(Tmp.FnDir)/$(fn).o))
    206 $(Tmp.ObjPath)/libcompiler_rt.a: $(Tmp.Inputs) $(Tmp.ObjPath)/.dir
    207 	$(Summary) "  ARCHIVE:   $(Tmp.Name)/$(Tmp.Config)/$(Tmp.Arch): $$@"
    208 	-$(Verb) $(RM) $$@
    209 	$(Verb) $(Tmp.AR) $(Tmp.ARFLAGS) $$@ $(Tmp.Inputs)
    210 	$(Verb) $(Tmp.RANLIB) $(Tmp.RANLIBFLAGS) $$@
    211 $(Tmp.ObjPath)/libcompiler_rt.dylib: $(Tmp.Inputs) $(Tmp.ObjPath)/.dir
    212 	$(Summary) "  DYLIB:   $(Tmp.Name)/$(Tmp.Config)/$(Tmp.Arch): $$@"
    213 	$(Verb) $(Tmp.CC) -arch $(Tmp.Arch) -dynamiclib -o $$@ \
    214 	  $(Tmp.Inputs) $(Tmp.LDFLAGS)
    215 $(Tmp.ObjPath)/libcompiler_rt.so: $(Tmp.Inputs) $(Tmp.ObjPath)/.dir
    216 	$(Summary) "  SO:   $(Tmp.Name)/$(Tmp.Config)/$(Tmp.Arch): $$@"
    217 	$(Verb) $(Tmp.CC) -shared -o $$@ \
    218 	  $(Tmp.Inputs) $(Tmp.LDFLAGS)
    219 .PRECIOUS: $(Tmp.ObjPath)/.dir
    220 
    221 # Per-Config-Arch Targets
    222 $(Tmp.Name)-$(Tmp.Config)-$(Tmp.Arch):: $(Tmp.ObjPath)/libcompiler_rt.$(Tmp.LibrarySuffix)
    223 .PHONY: $(Tmp.Name)-$(Tmp.Config)-$(Tmp.Arch)
    224 
    225 # Per-Config-Arch-SubDir Objects
    226 $(foreach key,$(SubDirKeys),\
    227   $(call PerPlatformConfigArchSubDir_template,$(key)))
    228 endef
    229 
    230 define PerPlatformConfigArchSubDir_template
    231 $(call Set,Tmp.SubDirKey,$(1))
    232 $(call Set,Tmp.SubDir,$($(Tmp.SubDirKey).Dir))
    233 $(call Set,Tmp.SrcPath,$(ProjSrcRoot)/$(Tmp.SubDir))
    234 $(call Set,Tmp.ObjPath,$(ProjObjRoot)/$(Tmp.Name)/$(Tmp.Config)/$(Tmp.Arch)/$(Tmp.SubDirKey))
    235 $(call Set,Tmp.Dependencies,$($(Tmp.SubDirKey).Dependencies))
    236 $(call Set,Tmp.CC,$(strip \
    237   $(call GetCNAVar,CC,$(Tmp.Key),$(Tmp.Config),$(Tmp.Arch))))
    238 $(call Set,Tmp.KERNEL_USE,$(strip \
    239   $(call GetCNAVar,KERNEL_USE,$(Tmp.Key),$(Tmp.Config),$(Tmp.Arch))))
    240 $(call Set,Tmp.VISIBILITY_HIDDEN,$(strip \
    241   $(call GetCNAVar,VISIBILITY_HIDDEN,$(Tmp.Key),$(Tmp.Config),$(Tmp.Arch))))
    242 $(call Set,Tmp.CFLAGS,$(strip \
    243   $(if $(call IsDefined,$(Tmp.Key).UniversalArchs),-arch $(Tmp.Arch),)\
    244   $(if $(call streq,$(Tmp.VISIBILITY_HIDDEN),1),\
    245        -fvisibility=hidden -DVISIBILITY_HIDDEN,)\
    246   $(if $(call streq,$(Tmp.KERNEL_USE),1),\
    247        -mkernel -DKERNEL_USE,)\
    248   $(call GetCNAVar,CFLAGS,$(Tmp.Key),$(Tmp.Config),$(Tmp.Arch))))
    249 
    250 $(Tmp.ObjPath)/%.o: $(Tmp.SrcPath)/%.s $(Tmp.Dependencies) $(Tmp.ObjPath)/.dir
    251 	$(Summary) "  ASSEMBLE:  $(Tmp.Name)/$(Tmp.Config)/$(Tmp.Arch): $$<"
    252 	$(Verb) $(Tmp.CC) $(Tmp.CFLAGS)  -c -o $$@ $$<
    253 $(Tmp.ObjPath)/%.o: $(Tmp.SrcPath)/%.S $(Tmp.Dependencies) $(Tmp.ObjPath)/.dir
    254 	$(Summary) "  ASSEMBLE:  $(Tmp.Name)/$(Tmp.Config)/$(Tmp.Arch): $$<"
    255 	$(Verb) $(Tmp.CC) $(Tmp.CFLAGS) -c -o $$@ $$<
    256 $(Tmp.ObjPath)/%.o: $(Tmp.SrcPath)/%.c $(Tmp.Dependencies) $(Tmp.ObjPath)/.dir
    257 	$(Summary) "  COMPILE:   $(Tmp.Name)/$(Tmp.Config)/$(Tmp.Arch): $$<"
    258 	$(Verb) $(Tmp.CC) $(Tmp.CFLAGS) -c $(COMMON_CFLAGS) -o $$@ $$<
    259 $(Tmp.ObjPath)/%.o: $(Tmp.SrcPath)/%.cc $(Tmp.Dependencies) $(Tmp.ObjPath)/.dir
    260 	$(Summary) "  COMPILE:   $(Tmp.Name)/$(Tmp.Config)/$(Tmp.Arch): $$<"
    261 	$(Verb) $(Tmp.CC) $(Tmp.CFLAGS) -c $(COMMON_CXXFLAGS) -o $$@ $$<
    262 .PRECIOUS: $(Tmp.ObjPath)/.dir
    263 
    264 endef
    265 
    266 # Run templates.
    267 $(foreach key,$(PlatformKeys),\
    268   $(eval $(call PerPlatform_template,$(key))))
    269 
    270 ###
    271 
    272 ifneq ($(DEBUGMAKE),)
    273   $(info MAKE: Done processing Makefile)
    274   $(info  )
    275 endif
    276