Daniel Dunbar | b3a6901 | 2009-06-26 16:47:03 +0000 | [diff] [blame] | 1 | SubDirs := lib |
| 2 | |
| 3 | # Set default rule before anything else. |
Daniel Dunbar | 48464e0 | 2010-01-18 06:49:33 +0000 | [diff] [blame] | 4 | all: help |
Daniel Dunbar | b3a6901 | 2009-06-26 16:47:03 +0000 | [diff] [blame] | 5 | |
| 6 | include make/config.mk |
| 7 | include make/util.mk |
Daniel Dunbar | 557a6ea | 2010-01-13 16:13:01 +0000 | [diff] [blame] | 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". |
Daniel Dunbar | b3a6901 | 2009-06-26 16:47:03 +0000 | [diff] [blame] | 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 | |
Daniel Dunbar | f572275 | 2010-01-18 06:48:19 +0000 | [diff] [blame] | 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:" |
Daniel Dunbar | 48464e0 | 2010-01-18 06:49:33 +0000 | [diff] [blame] | 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" |
Daniel Dunbar | f572275 | 2010-01-18 06:48:19 +0000 | [diff] [blame] | 41 | @echo |
| 42 | |
Daniel Dunbar | 9edf5cd | 2010-01-18 06:48:40 +0000 | [diff] [blame] | 43 | help-devel: help |
| 44 | @echo "Development targets:" |
Daniel Dunbar | 48464e0 | 2010-01-18 06:49:33 +0000 | [diff] [blame] | 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" |
Daniel Dunbar | 9edf5cd | 2010-01-18 06:48:40 +0000 | [diff] [blame] | 49 | @echo " info-functions: list available compiler-rt functions" |
Daniel Dunbar | 48464e0 | 2010-01-18 06:49:33 +0000 | [diff] [blame] | 50 | @echo " help-hidden: print help for Makefile debugging" |
Daniel Dunbar | 9edf5cd | 2010-01-18 06:48:40 +0000 | [diff] [blame] | 51 | @echo |
| 52 | |
| 53 | help-hidden: help-devel |
Daniel Dunbar | f572275 | 2010-01-18 06:48:19 +0000 | [diff] [blame] | 54 | @echo "Debugging variables:" |
Daniel Dunbar | faf0150 | 2010-01-18 06:48:33 +0000 | [diff] [blame] | 55 | @echo " DEBUGMAKE=1: enable some Makefile logging [default=]" |
| 56 | @echo " =2: enable more Makefile logging" |
Daniel Dunbar | f572275 | 2010-01-18 06:48:19 +0000 | [diff] [blame] | 57 | @echo |
| 58 | @echo "Debugging targets:" |
| 59 | @echo " make-print-FOO: print information on the variable 'FOO'" |
| 60 | @echo |
| 61 | |
Daniel Dunbar | 9edf5cd | 2010-01-18 06:48:40 +0000 | [diff] [blame] | 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 | |
Daniel Dunbar | 48464e0 | 2010-01-18 06:49:33 +0000 | [diff] [blame] | 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 | |
Daniel Dunbar | b3a6901 | 2009-06-26 16:47:03 +0000 | [diff] [blame] | 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 | |
Daniel Dunbar | b3a6901 | 2009-06-26 16:47:03 +0000 | [diff] [blame] | 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 | |
Daniel Dunbar | faf0150 | 2010-01-18 06:48:33 +0000 | [diff] [blame] | 104 | Dir := . |
| 105 | include make/subdir.mk |
Daniel Dunbar | 78cfbc5 | 2010-01-18 06:48:56 +0000 | [diff] [blame] | 106 | include make/lib_info.mk |
| 107 | include make/lib_util.mk |
Daniel Dunbar | 48464e0 | 2010-01-18 06:49:33 +0000 | [diff] [blame] | 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),\ |
Daniel Dunbar | 06f38e5 | 2010-01-19 00:01:15 +0000 | [diff] [blame] | 139 | $(strip \ |
| 140 | $(or $($(Tmp.Key).UniversalArchs.$(Tmp.Config)),\ |
| 141 | $($(Tmp.Key).UniversalArchs))),\ |
Daniel Dunbar | 48464e0 | 2010-01-18 06:49:33 +0000 | [diff] [blame] | 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 \ |
Daniel Dunbar | 401f693 | 2011-11-16 01:19:19 +0000 | [diff] [blame] | 167 | $(AlwaysRequiredModules) \ |
Daniel Dunbar | 48464e0 | 2010-01-18 06:49:33 +0000 | [diff] [blame] | 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)))) |
Daniel Dunbar | d3d2263 | 2010-03-31 17:00:48 +0000 | [diff] [blame] | 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)))) |
Daniel Dunbar | 48464e0 | 2010-01-18 06:49:33 +0000 | [diff] [blame] | 214 | $(call Set,Tmp.CFLAGS,$(strip \ |
Daniel Dunbar | 6a571fb | 2010-01-18 22:19:34 +0000 | [diff] [blame] | 215 | $(if $(call IsDefined,$(Tmp.Key).UniversalArchs),-arch $(Tmp.Arch),)\ |
Daniel Dunbar | d3d2263 | 2010-03-31 17:00:48 +0000 | [diff] [blame] | 216 | $(if $(call streq,$(Tmp.VISIBILITY_HIDDEN),1),\ |
Daniel Dunbar | 6a571fb | 2010-01-18 22:19:34 +0000 | [diff] [blame] | 217 | -fvisibility=hidden -DVISIBILITY_HIDDEN,)\ |
Daniel Dunbar | d3d2263 | 2010-03-31 17:00:48 +0000 | [diff] [blame] | 218 | $(if $(call streq,$(Tmp.KERNEL_USE),1),\ |
| 219 | -mkernel -DKERNEL_USE,)\ |
Daniel Dunbar | 48464e0 | 2010-01-18 06:49:33 +0000 | [diff] [blame] | 220 | $(call GetCNAVar,CFLAGS,$(Tmp.Key),$(Tmp.Config),$(Tmp.Arch)))) |
Daniel Dunbar | 48464e0 | 2010-01-18 06:49:33 +0000 | [diff] [blame] | 221 | |
| 222 | $(Tmp.ObjPath)/%.o: $(Tmp.SrcPath)/%.s $(Tmp.Dependencies) $(Tmp.ObjPath)/.dir |
| 223 | $(Summary) " ASSEMBLE: $(Tmp.Name)/$(Tmp.Config)/$(Tmp.Arch): $$<" |
Daniel Dunbar | 6a571fb | 2010-01-18 22:19:34 +0000 | [diff] [blame] | 224 | $(Verb) $(Tmp.CC) $(Tmp.CFLAGS) -c -o $$@ $$< |
Daniel Dunbar | 48464e0 | 2010-01-18 06:49:33 +0000 | [diff] [blame] | 225 | $(Tmp.ObjPath)/%.o: $(Tmp.SrcPath)/%.S $(Tmp.Dependencies) $(Tmp.ObjPath)/.dir |
| 226 | $(Summary) " ASSEMBLE: $(Tmp.Name)/$(Tmp.Config)/$(Tmp.Arch): $$<" |
Daniel Dunbar | 6a571fb | 2010-01-18 22:19:34 +0000 | [diff] [blame] | 227 | $(Verb) $(Tmp.CC) $(Tmp.CFLAGS) -c -o $$@ $$< |
Daniel Dunbar | 48464e0 | 2010-01-18 06:49:33 +0000 | [diff] [blame] | 228 | $(Tmp.ObjPath)/%.o: $(Tmp.SrcPath)/%.c $(Tmp.Dependencies) $(Tmp.ObjPath)/.dir |
| 229 | $(Summary) " COMPILE: $(Tmp.Name)/$(Tmp.Config)/$(Tmp.Arch): $$<" |
Daniel Dunbar | 6a571fb | 2010-01-18 22:19:34 +0000 | [diff] [blame] | 230 | $(Verb) $(Tmp.CC) $(Tmp.CFLAGS) -c -o $$@ $$< |
Daniel Dunbar | a6fd845 | 2011-12-01 23:35:49 +0000 | [diff] [blame] | 231 | $(Tmp.ObjPath)/%.o: $(Tmp.SrcPath)/%.cc $(Tmp.Dependencies) $(Tmp.ObjPath)/.dir |
| 232 | $(Summary) " COMPILE: $(Tmp.Name)/$(Tmp.Config)/$(Tmp.Arch): $$<" |
Kostya Serebryany | e235715 | 2011-12-06 21:11:50 +0000 | [diff] [blame] | 233 | $(Verb) $(Tmp.CC) $(Tmp.CFLAGS) -c $(COMMON_CXXFLAGS) -o $$@ $$< |
Daniel Dunbar | 48464e0 | 2010-01-18 06:49:33 +0000 | [diff] [blame] | 234 | .PRECIOUS: $(Tmp.ObjPath)/.dir |
| 235 | |
| 236 | endef |
| 237 | |
| 238 | # Run templates. |
| 239 | $(foreach key,$(PlatformKeys),\ |
| 240 | $(eval $(call PerPlatform_template,$(key)))) |
| 241 | |
| 242 | ### |
Daniel Dunbar | 78cfbc5 | 2010-01-18 06:48:56 +0000 | [diff] [blame] | 243 | |
Daniel Dunbar | faf0150 | 2010-01-18 06:48:33 +0000 | [diff] [blame] | 244 | ifneq ($(DEBUGMAKE),) |
| 245 | $(info MAKE: Done processing Makefile) |
| 246 | $(info ) |
| 247 | endif |