Possibly fix MSVC compilation after r256054.
[lldb.git] / compiler-rt / Makefile
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