blob: 4cfd886fcf1b24d7b07b310013ec24b0fa41417b [file] [log] [blame]
Ethan Nicholas762466e2017-06-29 10:03:38 -04001declare_args() {
2 host_ar = ar
3 host_cc = cc
4 host_cxx = cxx
5
6 if (is_android) {
7 if (host_os == "win") {
8 target_ar = "$ndk/toolchains/$ndk_gccdir-4.9/prebuilt/$ndk_host/$ndk_target/bin/ar.exe"
9 target_cc = "$ndk/toolchains/llvm/prebuilt/$ndk_host/bin/clang.exe"
10 target_cxx = "$ndk/toolchains/llvm/prebuilt/$ndk_host/bin/clang++.exe"
11 } else {
12 target_ar = "$ndk/toolchains/$ndk_gccdir-4.9/prebuilt/$ndk_host/$ndk_target/bin/ar"
13 target_cc = "$ndk/toolchains/llvm/prebuilt/$ndk_host/bin/clang"
14 target_cxx = "$ndk/toolchains/llvm/prebuilt/$ndk_host/bin/clang++"
15 }
16 } else {
17 target_ar = ar
18 target_cc = cc
19 target_cxx = cxx
20 }
21
22 cc_wrapper = ""
23}
24
25if (host_os == "win") {
26 python = "python.bat"
27 stamp = "cmd.exe /c echo >"
28} else {
29 python = "python"
30 stamp = "touch"
31}
32
33toolchain("msvc") {
34 lib_dir_switch = "/LIBPATH:"
35
36 if (msvc == 2015) {
Brian Osman852ca312017-12-07 16:16:21 -050037 bin = "$win_vc/bin/amd64"
Ethan Nicholas762466e2017-06-29 10:03:38 -040038 } else {
Brian Osman852ca312017-12-07 16:16:21 -050039 bin = "$win_vc/Tools/MSVC/$win_toolchain_version/bin/HostX64/$target_cpu"
40 }
41
42 env_setup = ""
43 if (target_cpu == "x86") {
44 # Toolchain asset includes a script that configures for x86 building.
45 # We don't support x86 builds with local MSVC installations.
46 env_setup = "cmd /c $win_sdk/bin/SetEnv.cmd /x86 && "
Ethan Nicholas762466e2017-06-29 10:03:38 -040047 }
48
Mike Kleinc722f792017-07-31 11:57:21 -040049 if (clang_win != "") {
50 cl = "$clang_win/bin/clang-cl.exe"
51 } else {
52 cl = "$bin/cl.exe"
53 }
54
Ethan Nicholas762466e2017-06-29 10:03:38 -040055 tool("asm") {
56 _ml = "ml"
57 if (target_cpu == "x64") {
58 _ml += "64"
59 }
Brian Osman9dd4ae12017-10-23 12:13:14 -040060 command = "$env_setup $bin/$_ml.exe /nologo /c /Fo {{output}} {{source}}"
Ethan Nicholas762466e2017-06-29 10:03:38 -040061 outputs = [
62 "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.obj",
63 ]
64 description = "assemble {{source}}"
65 }
66
67 tool("cc") {
68 rspfile = "{{output}}.rsp"
69 precompiled_header_type = "msvc"
70 pdbname = "{{target_out_dir}}/{{label_name}}_c.pdb"
71
72 # Label names may have spaces so pdbname must be quoted.
Brian Osman9dd4ae12017-10-23 12:13:14 -040073 command = "$env_setup $cc_wrapper \"$cl\" /nologo /showIncludes /FC @$rspfile /c {{source}} /Fo{{output}} /Fd\"$pdbname\""
Ethan Nicholas762466e2017-06-29 10:03:38 -040074 depsformat = "msvc"
75 outputs = [
76 "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.obj",
77 ]
78 rspfile_content = "{{defines}} {{include_dirs}} {{cflags}} {{cflags_c}}"
79 description = "compile {{source}}"
80 }
81
82 tool("cxx") {
83 rspfile = "{{output}}.rsp"
84 precompiled_header_type = "msvc"
85 pdbname = "{{target_out_dir}}/{{label_name}}_c.pdb"
86
87 # Label names may have spaces so pdbname must be quoted.
Brian Osman9dd4ae12017-10-23 12:13:14 -040088 command = "$env_setup $cc_wrapper \"$cl\" /nologo /showIncludes /FC @$rspfile /c {{source}} /Fo{{output}} /Fd\"$pdbname\""
Ethan Nicholas762466e2017-06-29 10:03:38 -040089 depsformat = "msvc"
90 outputs = [
91 "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.obj",
92 ]
93 rspfile_content = "{{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}}"
94 description = "compile {{source}}"
95 }
96
97 tool("alink") {
98 rspfile = "{{output}}.rsp"
99
Brian Osman9dd4ae12017-10-23 12:13:14 -0400100 command = "$env_setup $bin/lib.exe /nologo /ignore:4221 {{arflags}} /OUT:{{output}} @$rspfile"
Ethan Nicholas762466e2017-06-29 10:03:38 -0400101 outputs = [
102 # Ignore {{output_extension}} and always use .lib, there's no reason to
103 # allow targets to override this extension on Windows.
104 "{{root_out_dir}}/{{target_output_name}}{{output_extension}}",
105 ]
106 default_output_extension = ".lib"
107 default_output_dir = "{{target_out_dir}}"
108
109 # inputs_newline works around a fixed per-line buffer size in the linker.
110 rspfile_content = "{{inputs_newline}}"
111 description = "link {{output}}"
112 }
113
114 tool("solink") {
115 dllname = "{{output_dir}}/{{target_output_name}}{{output_extension}}"
116 libname = "${dllname}.lib"
117 pdbname = "${dllname}.pdb"
118 rspfile = "${dllname}.rsp"
119
Brian Osman9dd4ae12017-10-23 12:13:14 -0400120 command = "$env_setup $bin/link.exe /nologo /IMPLIB:$libname /DLL /OUT:$dllname /PDB:$pdbname @$rspfile"
Ethan Nicholas762466e2017-06-29 10:03:38 -0400121 outputs = [
122 dllname,
123 libname,
124 pdbname,
125 ]
126 default_output_extension = ".dll"
127 default_output_dir = "{{root_out_dir}}"
128
129 link_output = libname
130 depend_output = libname
131 runtime_outputs = [
132 dllname,
133 pdbname,
134 ]
135
136 # I don't quite understand this. Aping Chrome's toolchain/win/BUILD.gn.
137 restat = true
138
139 # inputs_newline works around a fixed per-line buffer size in the linker.
140 rspfile_content = "{{inputs_newline}} {{libs}} {{solibs}} {{ldflags}}"
141 description = "link {{output}}"
142 }
143
144 tool("link") {
145 exename = "{{root_out_dir}}/{{target_output_name}}{{output_extension}}"
146 pdbname = "$exename.pdb"
147 rspfile = "$exename.rsp"
148
149 command =
Brian Osman9dd4ae12017-10-23 12:13:14 -0400150 "$env_setup $bin/link.exe /nologo /OUT:$exename /PDB:$pdbname @$rspfile"
Ethan Nicholas762466e2017-06-29 10:03:38 -0400151
152 default_output_extension = ".exe"
153 default_output_dir = "{{root_out_dir}}"
154 outputs = [
155 exename,
156 ]
157
158 # inputs_newline works around a fixed per-line buffer size in the linker.
159 rspfile_content = "{{inputs_newline}} {{libs}} {{solibs}} {{ldflags}}"
160 description = "link {{output}}"
161 }
162
163 tool("stamp") {
164 command = "$stamp {{output}}"
165 description = "stamp {{output}}"
166 }
167
168 tool("copy") {
169 cp_py = rebase_path("../cp.py")
170 command = "$python $cp_py {{source}} {{output}}"
171 description = "copy {{source}} {{output}}"
172 }
173}
174
175template("gcc_like_toolchain") {
176 toolchain(target_name) {
177 ar = invoker.ar
178 cc = invoker.cc
179 cxx = invoker.cxx
180 lib_switch = "-l"
181 lib_dir_switch = "-L"
182
183 tool("cc") {
184 depfile = "{{output}}.d"
185 command = "$cc_wrapper $cc -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_c}} -c {{source}} -o {{output}}"
186 depsformat = "gcc"
187 outputs = [
188 "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o",
189 ]
190 description = "compile {{source}}"
191 }
192
193 tool("cxx") {
194 depfile = "{{output}}.d"
195 command = "$cc_wrapper $cxx -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}} -c {{source}} -o {{output}}"
196 depsformat = "gcc"
197 outputs = [
198 "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o",
199 ]
200 description = "compile {{source}}"
201 }
202
203 tool("objc") {
204 depfile = "{{output}}.d"
205 command = "$cc_wrapper $cc -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_objc}} -c {{source}} -o {{output}}"
206 depsformat = "gcc"
207 outputs = [
208 "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o",
209 ]
210 description = "compile {{source}}"
211 }
212
213 tool("objcxx") {
214 depfile = "{{output}}.d"
Greg Daniel6b7e0e22017-07-12 16:21:09 -0400215 command = "$cc_wrapper $cxx -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}} {{cflags_objcc}} -c {{source}} -o {{output}}"
Ethan Nicholas762466e2017-06-29 10:03:38 -0400216 depsformat = "gcc"
217 outputs = [
218 "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o",
219 ]
220 description = "compile {{source}}"
221 }
222
223 tool("asm") {
224 depfile = "{{output}}.d"
225 command = "$cc_wrapper $cc -MMD -MF $depfile {{defines}} {{include_dirs}} {{asmflags}} -c {{source}} -o {{output}}"
226 depsformat = "gcc"
227 outputs = [
228 "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o",
229 ]
230 description = "assemble {{source}}"
231 }
232
233 tool("alink") {
234 rspfile = "{{output}}.rsp"
235 rspfile_content = "{{inputs}}"
236 ar_py = rebase_path("../ar.py")
237 command = "$python $ar_py $ar {{output}} $rspfile"
238 outputs = [
239 "{{root_out_dir}}/{{target_output_name}}{{output_extension}}",
240 ]
241 default_output_extension = ".a"
242 output_prefix = "lib"
243 description = "link {{output}}"
244 }
245
246 tool("solink") {
247 soname = "{{target_output_name}}{{output_extension}}"
248
249 rpath = "-Wl,-soname,$soname"
250 if (is_mac) {
251 rpath = "-Wl,-install_name,@rpath/$soname"
252 }
253
Hal Canarye1053ea2018-02-09 14:45:09 -0500254 rspfile = "{{output}}.rsp"
255 rspfile_content = "{{inputs}}"
256 command = "$cc_wrapper $cxx -shared {{ldflags}} @$rspfile {{solibs}} {{libs}} $rpath -o {{output}}"
Ethan Nicholas762466e2017-06-29 10:03:38 -0400257 outputs = [
258 "{{root_out_dir}}/$soname",
259 ]
260 output_prefix = "lib"
261 default_output_extension = ".so"
262 description = "link {{output}}"
263 }
264
265 tool("link") {
Hal Canarye1053ea2018-02-09 14:45:09 -0500266 rspfile = "{{output}}.rsp"
267 rspfile_content = "{{inputs}}"
268 command = "$cc_wrapper $cxx {{ldflags}} @$rspfile {{solibs}} {{libs}} -o {{output}}"
Ethan Nicholas762466e2017-06-29 10:03:38 -0400269 outputs = [
270 "{{root_out_dir}}/{{target_output_name}}{{output_extension}}",
271 ]
272 description = "link {{output}}"
273 }
274
275 tool("stamp") {
276 command = "$stamp {{output}}"
277 description = "stamp {{output}}"
278 }
279
280 tool("copy") {
281 cp_py = rebase_path("../cp.py")
282 command = "$python $cp_py {{source}} {{output}}"
283 description = "copy {{source}} {{output}}"
284 }
285
Jim Van Verth443a9132017-11-28 09:45:26 -0500286 tool("copy_bundle_data") {
287 cp_py = rebase_path("../cp.py")
288 command = "$python $cp_py {{source}} {{output}}"
289 description = "copy_bundle_data {{source}} {{output}}"
290 }
291
292 # We don't currently have any xcasset files so make this a NOP
293 tool("compile_xcassets") {
294 command = "true"
295 description = "compile_xcassets {{output}}"
296 }
297
Ethan Nicholas762466e2017-06-29 10:03:38 -0400298 toolchain_args = {
299 current_cpu = invoker.cpu
300 current_os = invoker.os
301 }
302 }
303}
304
305gcc_like_toolchain("gcc_like") {
306 cpu = current_cpu
307 os = current_os
308 ar = target_ar
309 cc = target_cc
310 cxx = target_cxx
311}
312
313gcc_like_toolchain("gcc_like_host") {
314 cpu = host_cpu
315 os = host_os
316 ar = host_ar
317 cc = host_cc
318 cxx = host_cxx
319}