3 # Set default rule before anything else.
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".
11 include make
/AppleBI.mk
14 # Make sure we don't build with a missing ProjObjRoot.
15 ifeq ($(ProjObjRoot
),)
16 $(error Refusing to build with empty ProjObjRoot variable
)
27 # FIXME: Document the available subtargets.
29 @echo
"usage: make [{VARIABLE=VALUE}*] target"
31 @echo
"User variables:"
32 @echo
" VERBOSE=1: Use to show all commands [default=0]"
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"
39 @echo
" info-platforms: list available platforms"
40 @echo
" help-devel: print additional help for developers"
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"
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"
58 @echo
"Debugging targets:"
59 @echo
" make-print-FOO: print information on the variable 'FOO'"
63 @echo
"compiler-rt Available Functions"
65 @echo
"All Functions: $(AvailableFunctions)"
66 @
$(foreach fn
,$(AvailableFunctions
),\
67 printf
" %-20s - available in (%s)\n" $(fn
)\
68 "$(foreach key,$(AvailableIn.$(fn)),$($(key).Dir))";)
71 @echo
"compiler-rt Available 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)";)
79 # Provide default clean target which is extended by other templates.
86 cd
test/Unit
&& .
/test
89 # Directory handling magic.
91 # Create directories as needed, and timestamp their creation.
93 $(Summary
) " MKDIR: $*"
94 $(Verb
) $(MKDIR
) $* > /dev
/null
95 $(Verb
) echo
'Created.' > $@
102 # Include child makefile fragments
105 include make
/subdir.mk
106 include make
/lib_info.mk
107 include make
/lib_util.mk
108 include make
/lib_platforms.mk
111 # Define Platform Rules
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
))
119 # Top-Level Platform Target
120 $(Tmp.Name
):: $(Tmp.Configs
:%=$(Tmp.Name
)-%)
124 $(Verb
) rm -rf
$(Tmp.ObjPath
)
126 # Per-Config Libraries
127 $(foreach config
,$(Tmp.Configs
),\
128 $(call PerPlatformConfig_template
,$(config
)))
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
))))
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
))
144 # Compute the archs to build, depending on whether this is a universal build or
146 $(call Set
,Tmp.ArchsToBuild
,\
147 $(if
$(call IsDefined
,$(Tmp.Key
).UniversalArchs
),\
149 $(or
$($(Tmp.Key
).UniversalArchs.
$(Tmp.Config
)),\
150 $($(Tmp.Key
).UniversalArchs
))),\
151 $(call VarOrDefault
,$(Tmp.Key
).Arch.
$(Tmp.Config
),$($(Tmp.Key
).Arch
))))
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): $$@"
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
164 $(Tmp.Name
)-$(Tmp.Config
):: $(Tmp.ObjPath
)/libcompiler_rt.
$(Tmp.LibrarySuffix
)
165 .PHONY
: $(Tmp.Name
)-$(Tmp.Config
)
167 # Per-Config-Arch Libraries
168 $(foreach arch
,$(Tmp.ArchsToBuild
),\
169 $(call PerPlatformConfigArch_template
,$(arch
)))
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
))))
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
))
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): $$@"
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
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
)
225 # Per-Config-Arch-SubDir Objects
226 $(foreach key
,$(SubDirKeys
),\
227 $(call PerPlatformConfigArchSubDir_template
,$(key
)))
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
))))
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
) $(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
267 $(foreach key
,$(PlatformKeys
),\
268 $(eval
$(call PerPlatform_template
,$(key
))))
272 ifneq ($(DEBUGMAKE
),)
273 $(info MAKE
: Done processing Makefile
)