]>
Commit | Line | Data |
---|---|---|
1a4d82fc JJ |
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 | ||
85aaf69f SL |
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 $$@ $$< | |
92a42be0 SL |
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 $$@ $$< | |
1a4d82fc JJ |
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 |