1SubDirs := lib
2
3# Set default rule before anything else.
4all: help
5
6include make/config.mk
7include 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".
10ifdef SRCROOT
11  include make/AppleBI.mk
12endif
13
14# Make sure we don't build with a missing ProjObjRoot.
15ifeq ($(ProjObjRoot),)
16$(error Refusing to build with empty ProjObjRoot variable)
17endif
18
19##############
20
21###
22# Rules
23
24###
25# Top level targets
26
27# FIXME: Document the available subtargets.
28help:
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
43help-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
53help-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
62info-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
70info-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
81clean::
82
83# Test
84.PHONY: test
85test:
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
104Dir := .
105include make/subdir.mk
106include make/lib_info.mk
107include make/lib_util.mk
108include make/lib_platforms.mk
109
110###
111# Define Platform Rules
112
113define 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
123clean::
124	$(Verb) rm -rf $(Tmp.ObjPath)
125
126# Per-Config Libraries
127$(foreach config,$(Tmp.Configs),\
128  $(call PerPlatformConfig_template,$(config)))
129endef
130
131define 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)))
170endef
171
172define 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)))
228endef
229
230define 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
264endef
265
266# Run templates.
267$(foreach key,$(PlatformKeys),\
268  $(eval $(call PerPlatform_template,$(key))))
269
270###
271
272ifneq ($(DEBUGMAKE),)
273  $(info MAKE: Done processing Makefile)
274  $(info  )
275endif
276