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) $(COMMON_ASMFLAGS) $(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) $(COMMON_ASMFLAGS) $(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) $(COMMON_CFLAGS) $(Tmp.CFLAGS) -c -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) $(COMMON_CXXFLAGS) $(Tmp.CFLAGS) -c -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