[lit] Improve lit.Run class
[llvm-complete.git] / utils / gn / build / toolchain / BUILD.gn
blobc36579f28e432517769984b7c54b7f5b64aaa03b
1 import("//llvm/utils/gn/build/toolchain/compiler.gni")
3 declare_args() {
4   # If is_goma is true, the location of the goma client install.
5   if (host_os == "win") {
6     goma_dir = "c:\src\goma\goma-win64"
7   } else {
8     goma_dir = getenv("HOME") + "/goma"
9   }
12 template("unix_toolchain") {
13   toolchain(target_name) {
14     forward_variables_from(invoker, "*")
16     tool("cc") {
17       depfile = "{{output}}.d"
18       command = "$cc -MMD -MF $depfile -o {{output}} -c {{source}} {{defines}} {{include_dirs}} {{cflags}} {{cflags_c}}"
19       depsformat = "gcc"
20       description = "CC {{output}}"
21       outputs = [
22         "{{source_out_dir}}/{{label_name}}.{{source_name_part}}.o",
23       ]
24     }
26     tool("cxx") {
27       depfile = "{{output}}.d"
28       command = "$cxx -MMD -MF $depfile -o {{output}} -c {{source}} {{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}}"
29       depsformat = "gcc"
30       description = "CXX {{output}}"
31       outputs = [
32         "{{source_out_dir}}/{{label_name}}.{{source_name_part}}.o",
33       ]
34     }
36     tool("asm") {
37       depfile = "{{output}}.d"
38       command = "$cc -MMD -MF $depfile -o {{output}} -c {{source}} {{defines}} {{include_dirs}} {{asmflags}}"
39       depsformat = "gcc"
40       description = "ASM {{output}}"
41       outputs = [
42         "{{source_out_dir}}/{{label_name}}.{{source_name_part}}.o",
43       ]
44     }
46     tool("alink") {
47       if (current_os == "mac") {
48         command = "libtool -static -no_warning_for_no_symbols {{arflags}} -o {{output}} {{inputs}}"
49       } else {
50         # Remove the output file first so that ar doesn't try to modify the
51         # existing file.
52         command =
53             "rm -f {{output}} && $ar rcsD {{arflags}} {{output}} {{inputs}}"
54       }
55       description = "AR {{output}}"
56       outputs = [
57         "{{output_dir}}/{{target_output_name}}.a",
58       ]
59       output_prefix = "lib"
60       default_output_dir = "{{root_out_dir}}/lib"
61     }
63     tool("solink") {
64       outfile = "{{output_dir}}/{{target_output_name}}{{output_extension}}"
65       if (current_os == "mac") {
66         command = "$ld -shared {{ldflags}} -o $outfile {{libs}} {{inputs}}"
67         default_output_extension = ".dylib"
68       } else {
69         command = "$ld -shared {{ldflags}} -Wl,-z,defs -Wl,-soname,{{target_output_name}}{{output_extension}} -o $outfile {{libs}} {{inputs}}"
70         default_output_extension = ".so"
71       }
72       description = "SOLINK $outfile"
73       outputs = [
74         outfile,
75       ]
76       lib_switch = "-l"
77       output_prefix = "lib"
78       default_output_dir = "{{root_out_dir}}/lib"
79     }
81     tool("solink_module") {
82       outfile = "{{output_dir}}/{{target_output_name}}{{output_extension}}"
83       if (current_os == "mac") {
84         command = "$ld -shared {{ldflags}} -Wl,-flat_namespace -Wl,-undefined,suppress -o $outfile {{libs}} {{inputs}}"
85         default_output_extension = ".dylib"
86       } else {
87         command = "$ld -shared {{ldflags}} -Wl,-soname,{{target_output_name}}{{output_extension}} -o $outfile {{libs}} {{inputs}}"
88         default_output_extension = ".so"
89       }
90       description = "SOLINK $outfile"
91       outputs = [
92         outfile,
93       ]
94       lib_switch = "-l"
95       default_output_dir = "{{root_out_dir}}/lib"
96     }
98     tool("link") {
99       outfile = "{{output_dir}}/{{target_output_name}}{{output_extension}}"
100       if (current_os == "mac") {
101         command = "$ld {{ldflags}} -o $outfile {{libs}} {{inputs}}"
102       } else {
103         command = "$ld {{ldflags}} -o $outfile {{libs}} -Wl,--start-group {{inputs}} -Wl,--end-group"
104       }
105       description = "LINK $outfile"
106       outputs = [
107         outfile,
108       ]
109       lib_switch = "-l"
111       # Setting this allows targets to override the default executable output by
112       # setting output_dir.
113       default_output_dir = "{{root_out_dir}}/bin"
114     }
116     copy_command = "ln -f {{source}} {{output}} 2>/dev/null || (rm -rf {{output}} && cp -af {{source}} {{output}})"
117     tool("copy") {
118       command = copy_command
119       description = "COPY {{source}} {{output}}"
120     }
122     if (current_os == "mac") {
123       tool("copy_bundle_data") {
124         # http://serverfault.com/q/209888/43689
125         _copydir = "mkdir -p {{output}} && cd {{source}} && " +
126                    "pax -rwl . \"\$OLDPWD\"/{{output}}"
127         command = "rm -rf {{output}} && if [[ -d {{source}} ]]; then " +
128                   _copydir + "; else " + copy_command + "; fi"
129         description = "COPY_BUNDLE_DATA {{source}} {{output}}"
130       }
131       tool("compile_xcassets") {
132         command = "false"
133         description = "The LLVM build doesn't use any xcasset files"
134       }
135     }
137     tool("stamp") {
138       command = "touch {{output}}"
139       description = "STAMP {{output}}"
140     }
141   }
144 unix_toolchain("unix") {
145   cc = "cc"
146   cxx = "c++"
148   if (clang_base_path != "") {
149     cc = "$clang_base_path/bin/clang"
150     cxx = "$clang_base_path/bin/clang++"
151   }
153   ld = cxx  # Don't use goma wrapper for linking.
154   if (use_goma) {
155     cc = "$goma_dir/gomacc $cc"
156     cxx = "$goma_dir/gomacc $cxx"
157   }
159   if (current_os != "mac") {
160     ar = "ar"
161   }
163   toolchain_args = {
164     current_os = host_os
165     current_cpu = host_cpu
166   }
169 # This template defines a toolchain that uses just-built clang and lld
170 # as compiler and linker.
171 template("stage2_unix_toolchain") {
172   unix_toolchain(target_name) {
173     forward_variables_from(invoker, "*")
175     cc = "bin/clang"
176     cxx = "bin/clang++"
177     ld = cxx
178     if (current_os != "mac") {
179       ar = "bin/llvm-ar"
180     }
182     deps = [
183       "//:clang($host_toolchain)",
184       "//:lld($host_toolchain)",
185     ]
186     if (current_os != "mac") {
187       deps += [ "//:llvm-ar($host_toolchain)" ]
188     }
189   }
192 stage2_unix_toolchain("stage2_unix") {
193   toolchain_args = {
194     current_os = host_os
195     current_cpu = host_cpu
196     is_clang = true
197     use_lld = host_os != "mac"
198   }
201 if (android_ndk_path != "") {
202   stage2_unix_toolchain("stage2_android_aarch64") {
203     toolchain_args = {
204       current_os = "android"
205       current_cpu = "arm64"
206       is_clang = true
207       use_lld = true
208     }
209   }
212 toolchain("win") {
213   cl = "cl"
214   link = "link"
216   if (clang_base_path != "") {
217     cl = "$clang_base_path/bin/clang-cl"
218     if (use_lld) {
219       link = "$clang_base_path/bin/lld-link"
220     }
221   }
223   if (use_goma) {
224     cl = "$goma_dir/gomacc $cl"
225   }
227   tool("cc") {
228     command = "$cl /nologo /showIncludes /Fo{{output}} /c {{source}} {{defines}} {{include_dirs}} {{cflags}} {{cflags_c}}"
229     depsformat = "msvc"
230     description = "CC {{output}}"
231     outputs = [
232       "{{source_out_dir}}/{{label_name}}.{{source_name_part}}.obj",
233     ]
234   }
236   tool("cxx") {
237     command = "$cl /nologo /showIncludes /Fo{{output}} /c {{source}} {{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}}"
238     depsformat = "msvc"
239     description = "CXX {{output}}"
240     outputs = [
241       "{{source_out_dir}}/{{label_name}}.{{source_name_part}}.obj",
242     ]
243   }
245   tool("alink") {
246     command = "$link /lib /nologo {{arflags}} /out:{{output}} {{inputs}}"
247     description = "LIB {{output}}"
248     outputs = [
249       "{{output_dir}}/{{target_output_name}}.lib",
250     ]
251     default_output_dir = "{{root_out_dir}}/lib"
252   }
254   tool("solink") {
255     outprefix = "{{output_dir}}/{{target_output_name}}"
256     dllfile = "$outprefix{{output_extension}}"
257     libfile = "$outprefix.lib"
258     pdbfile = "$outprefix.pdb"
259     command = "$link /nologo /dll {{ldflags}} /out:$dllfile /implib:$libfile /pdb:$pdbfile {{libs}} {{inputs}}"
260     description = "LINK $dllfile"
261     link_output = libfile
262     depend_output = libfile
263     runtime_outputs = [ dllfile ]
264     outputs = [
265       dllfile,
266       libfile,
267     ]
268     lib_switch = ""
269     default_output_extension = ".dll"
270     restat = true
272     # Put dlls next to the executables in bin/ on Windows, since Windows
273     # doesn't have a configurable rpath. This matches initialization of
274     # module_dir to bin/ in AddLLVM.cmake's set_output_directory().
275     default_output_dir = "{{root_out_dir}}/bin"
276   }
278   # Plugins for opt and clang and so on don't work in LLVM's Windows build
279   # since the code doesn't have export annotations, but there are a few
280   # standalone loadable modules used for unit-testing LLVM's dynamic library
281   # loading code.
282   tool("solink_module") {
283     outprefix = "{{output_dir}}/{{target_output_name}}"
284     dllfile = "$outprefix{{output_extension}}"
285     pdbfile = "$outprefix.pdb"
286     command = "$link /nologo /dll {{ldflags}} /out:$dllfile /pdb:$pdbfile {{libs}} {{inputs}}"
287     description = "LINK_MODULE $dllfile"
288     outputs = [
289       dllfile,
290     ]
291     lib_switch = ""
292     runtime_outputs = outputs
293     default_output_extension = ".dll"
295     # No default_output_dir, all clients set output_dir.
296   }
298   tool("link") {
299     outprefix = "{{output_dir}}/{{target_output_name}}"
300     outfile = "$outprefix{{output_extension}}"
301     pdbfile = "$outprefix.pdb"
302     command = "$link /nologo {{ldflags}} /out:$outfile /pdb:$pdbfile {{libs}} {{inputs}}"
303     description = "LINK $outfile"
304     outputs = [
305       outfile,
306     ]
307     lib_switch = ""
308     default_output_extension = ".exe"
310     # Setting this allows targets to override the default executable output by
311     # setting output_dir.
312     default_output_dir = "{{root_out_dir}}/bin"
313   }
315   tool("copy") {
316     # GN hands out slash-using paths, but cmd's copy needs backslashes.
317     # Use cmd's %foo:a=b% substitution feature to convert.
318     command = "cmd /c set source=\"{{source}}\" & set output=\"{{output}}\" & call copy /Y %source:/=\% %output:\=/% > nul"
319     description = "COPY {{source}} {{output}}"
320   }
322   tool("stamp") {
323     command = "cmd /c type nul > {{output}}"
324     description = "STAMP {{output}}"
325   }
327   toolchain_args = {
328     current_os = "win"
329     current_cpu = host_cpu
330   }