1*c8dee2aaSAndroid Build Coastguard Workerif (is_wasm) { 2*c8dee2aaSAndroid Build Coastguard Worker import("wasm.gni") 3*c8dee2aaSAndroid Build Coastguard Worker} 4*c8dee2aaSAndroid Build Coastguard Workerif (is_fuchsia) { 5*c8dee2aaSAndroid Build Coastguard Worker import("//build/fuchsia/sdk.gni") 6*c8dee2aaSAndroid Build Coastguard Worker} 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Workerdeclare_args() { 9*c8dee2aaSAndroid Build Coastguard Worker host_ar = ar 10*c8dee2aaSAndroid Build Coastguard Worker host_cc = cc 11*c8dee2aaSAndroid Build Coastguard Worker host_cxx = cxx 12*c8dee2aaSAndroid Build Coastguard Worker 13*c8dee2aaSAndroid Build Coastguard Worker if (is_android) { 14*c8dee2aaSAndroid Build Coastguard Worker _prefix = "$ndk/toolchains/llvm/prebuilt/$ndk_host/bin" 15*c8dee2aaSAndroid Build Coastguard Worker if (host_os == "win") { 16*c8dee2aaSAndroid Build Coastguard Worker target_ar = "$_prefix/llvm-ar.exe" 17*c8dee2aaSAndroid Build Coastguard Worker target_cc = "$_prefix/clang.exe --target=$ndk_target$ndk_api -fno-addrsig" 18*c8dee2aaSAndroid Build Coastguard Worker target_cxx = 19*c8dee2aaSAndroid Build Coastguard Worker "$_prefix/clang++.exe --target=$ndk_target$ndk_api -fno-addrsig" 20*c8dee2aaSAndroid Build Coastguard Worker } else { 21*c8dee2aaSAndroid Build Coastguard Worker target_ar = "$_prefix/llvm-ar" 22*c8dee2aaSAndroid Build Coastguard Worker target_cc = "$_prefix/$ndk_target$ndk_api-clang" 23*c8dee2aaSAndroid Build Coastguard Worker target_cxx = "$_prefix/$ndk_target$ndk_api-clang++" 24*c8dee2aaSAndroid Build Coastguard Worker } 25*c8dee2aaSAndroid Build Coastguard Worker } else if (is_fuchsia && using_fuchsia_sdk) { 26*c8dee2aaSAndroid Build Coastguard Worker target_ar = rebase_path("$fuchsia_toolchain_path/bin/llvm-ar") 27*c8dee2aaSAndroid Build Coastguard Worker target_cc = rebase_path("$fuchsia_toolchain_path/bin/clang") 28*c8dee2aaSAndroid Build Coastguard Worker target_cxx = rebase_path("$fuchsia_toolchain_path/bin/clang++") 29*c8dee2aaSAndroid Build Coastguard Worker cflags = "--sysroot=" + 30*c8dee2aaSAndroid Build Coastguard Worker rebase_path("$fuchsia_toolchain_path/$target_cpu/sysroot") 31*c8dee2aaSAndroid Build Coastguard Worker link = rebase_path("$fuchsia_toolchain_path/bin/ld.lld") 32*c8dee2aaSAndroid Build Coastguard Worker } else { 33*c8dee2aaSAndroid Build Coastguard Worker target_ar = ar 34*c8dee2aaSAndroid Build Coastguard Worker target_cc = cc 35*c8dee2aaSAndroid Build Coastguard Worker target_cxx = cxx 36*c8dee2aaSAndroid Build Coastguard Worker } 37*c8dee2aaSAndroid Build Coastguard Worker 38*c8dee2aaSAndroid Build Coastguard Worker cc_wrapper = "" 39*c8dee2aaSAndroid Build Coastguard Worker 40*c8dee2aaSAndroid Build Coastguard Worker # dsymutil seems to kill the machine when too many processes are run in 41*c8dee2aaSAndroid Build Coastguard Worker # parallel, so we need to use a pool to limit the concurrency when passing 42*c8dee2aaSAndroid Build Coastguard Worker # large -j to Ninja (e.g. Goma build). Unfortunately this is also one of the 43*c8dee2aaSAndroid Build Coastguard Worker # slowest steps in a build, so we don't want to limit too much. Use the number 44*c8dee2aaSAndroid Build Coastguard Worker # of CPUs as a default. 45*c8dee2aaSAndroid Build Coastguard Worker dlsymutil_pool_depth = exec_script("num_cpus.py", [], "value") 46*c8dee2aaSAndroid Build Coastguard Worker 47*c8dee2aaSAndroid Build Coastguard Worker # Too many linkers running at once causes issues for some builders. Allow 48*c8dee2aaSAndroid Build Coastguard Worker # such builders to limit the number of concurrent link steps. 49*c8dee2aaSAndroid Build Coastguard Worker # link_pool_depth < 0 means no pool, 0 means cpu count, > 0 sets pool size. 50*c8dee2aaSAndroid Build Coastguard Worker link_pool_depth = -1 51*c8dee2aaSAndroid Build Coastguard Worker} 52*c8dee2aaSAndroid Build Coastguard Worker 53*c8dee2aaSAndroid Build Coastguard Workerdeclare_args() { 54*c8dee2aaSAndroid Build Coastguard Worker host_link = host_cxx 55*c8dee2aaSAndroid Build Coastguard Worker target_link = target_cxx 56*c8dee2aaSAndroid Build Coastguard Worker} 57*c8dee2aaSAndroid Build Coastguard Worker 58*c8dee2aaSAndroid Build Coastguard Worker# For 'shell' see https://ninja-build.org/manual.html#ref_rule_command 59*c8dee2aaSAndroid Build Coastguard Workerif (host_os == "win") { 60*c8dee2aaSAndroid Build Coastguard Worker shell = "cmd.exe /c " 61*c8dee2aaSAndroid Build Coastguard Worker stamp = "$shell echo >" 62*c8dee2aaSAndroid Build Coastguard Worker} else { 63*c8dee2aaSAndroid Build Coastguard Worker shell = "" 64*c8dee2aaSAndroid Build Coastguard Worker stamp = "touch" 65*c8dee2aaSAndroid Build Coastguard Worker} 66*c8dee2aaSAndroid Build Coastguard Worker 67*c8dee2aaSAndroid Build Coastguard Workerif (current_toolchain == default_toolchain) { 68*c8dee2aaSAndroid Build Coastguard Worker pool("dsymutil_pool") { 69*c8dee2aaSAndroid Build Coastguard Worker depth = dlsymutil_pool_depth 70*c8dee2aaSAndroid Build Coastguard Worker } 71*c8dee2aaSAndroid Build Coastguard Worker if (0 <= link_pool_depth) { 72*c8dee2aaSAndroid Build Coastguard Worker pool("link_pool") { 73*c8dee2aaSAndroid Build Coastguard Worker if (link_pool_depth == 0) { 74*c8dee2aaSAndroid Build Coastguard Worker depth = exec_script("num_cpus.py", [], "value") 75*c8dee2aaSAndroid Build Coastguard Worker } else { 76*c8dee2aaSAndroid Build Coastguard Worker depth = link_pool_depth 77*c8dee2aaSAndroid Build Coastguard Worker } 78*c8dee2aaSAndroid Build Coastguard Worker } 79*c8dee2aaSAndroid Build Coastguard Worker } 80*c8dee2aaSAndroid Build Coastguard Worker} 81*c8dee2aaSAndroid Build Coastguard Worker 82*c8dee2aaSAndroid Build Coastguard Workertemplate("msvc_toolchain") { 83*c8dee2aaSAndroid Build Coastguard Worker toolchain(target_name) { 84*c8dee2aaSAndroid Build Coastguard Worker toolchain_target_cpu = invoker.cpu 85*c8dee2aaSAndroid Build Coastguard Worker lib_switch = "" 86*c8dee2aaSAndroid Build Coastguard Worker lib_dir_switch = "/LIBPATH:" 87*c8dee2aaSAndroid Build Coastguard Worker 88*c8dee2aaSAndroid Build Coastguard Worker bin = "$win_vc/Tools/MSVC/$win_toolchain_version/bin/HostX64/$toolchain_target_cpu" 89*c8dee2aaSAndroid Build Coastguard Worker 90*c8dee2aaSAndroid Build Coastguard Worker env_setup = "" 91*c8dee2aaSAndroid Build Coastguard Worker if (toolchain_target_cpu == "x86") { 92*c8dee2aaSAndroid Build Coastguard Worker # Toolchain asset includes a script that configures for x86 building. 93*c8dee2aaSAndroid Build Coastguard Worker # We don't support x86 builds with local MSVC installations. 94*c8dee2aaSAndroid Build Coastguard Worker env_setup = "$shell $win_sdk/bin/SetEnv.cmd /x86 && " 95*c8dee2aaSAndroid Build Coastguard Worker } else if (toolchain_target_cpu == "arm64") { 96*c8dee2aaSAndroid Build Coastguard Worker # ARM64 compiler is incomplete - it relies on DLLs located in the host toolchain directory. 97*c8dee2aaSAndroid Build Coastguard Worker env_setup = "$shell set \"PATH=%PATH%;$win_vc\\Tools\\MSVC\\$win_toolchain_version\\bin\\HostX64\\x64\" && " 98*c8dee2aaSAndroid Build Coastguard Worker } 99*c8dee2aaSAndroid Build Coastguard Worker 100*c8dee2aaSAndroid Build Coastguard Worker cl_m32_flag = "" 101*c8dee2aaSAndroid Build Coastguard Worker 102*c8dee2aaSAndroid Build Coastguard Worker if (clang_win != "") { 103*c8dee2aaSAndroid Build Coastguard Worker if (toolchain_target_cpu == "x86") { 104*c8dee2aaSAndroid Build Coastguard Worker # cl.exe knows implicitly by the choice of executable that it's targeting 105*c8dee2aaSAndroid Build Coastguard Worker # x86, but clang-cl.exe needs to be told when targeting non-host 106*c8dee2aaSAndroid Build Coastguard Worker # platforms. (All our builders are x86-64, so x86 is always non-host.) 107*c8dee2aaSAndroid Build Coastguard Worker cl_m32_flag = "-m32" 108*c8dee2aaSAndroid Build Coastguard Worker } 109*c8dee2aaSAndroid Build Coastguard Worker if (host_os == "win") { 110*c8dee2aaSAndroid Build Coastguard Worker cl = "\"$clang_win/bin/clang-cl.exe\"" 111*c8dee2aaSAndroid Build Coastguard Worker lib = "\"$clang_win/bin/lld-link.exe\" /lib" 112*c8dee2aaSAndroid Build Coastguard Worker link = "\"$clang_win/bin/lld-link.exe\"" 113*c8dee2aaSAndroid Build Coastguard Worker } else { 114*c8dee2aaSAndroid Build Coastguard Worker cl = "\"$clang_win/bin/clang-cl\"" 115*c8dee2aaSAndroid Build Coastguard Worker lib = "\"$clang_win/bin/lld-link\" /lib" 116*c8dee2aaSAndroid Build Coastguard Worker link = "\"$clang_win/bin/lld-link\"" 117*c8dee2aaSAndroid Build Coastguard Worker } 118*c8dee2aaSAndroid Build Coastguard Worker } else { 119*c8dee2aaSAndroid Build Coastguard Worker cl = "\"$bin/cl.exe\"" 120*c8dee2aaSAndroid Build Coastguard Worker lib = "\"$bin/lib.exe\"" 121*c8dee2aaSAndroid Build Coastguard Worker link = "\"$bin/link.exe\"" 122*c8dee2aaSAndroid Build Coastguard Worker } 123*c8dee2aaSAndroid Build Coastguard Worker 124*c8dee2aaSAndroid Build Coastguard Worker tool("asm") { 125*c8dee2aaSAndroid Build Coastguard Worker _ml = "ml" 126*c8dee2aaSAndroid Build Coastguard Worker if (toolchain_target_cpu == "x64") { 127*c8dee2aaSAndroid Build Coastguard Worker _ml += "64" 128*c8dee2aaSAndroid Build Coastguard Worker } 129*c8dee2aaSAndroid Build Coastguard Worker command = "$env_setup \"$bin/$_ml.exe\" {{asmflags}} /nologo /c /Fo {{output}} {{source}}" 130*c8dee2aaSAndroid Build Coastguard Worker outputs = [ 131*c8dee2aaSAndroid Build Coastguard Worker "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.obj", 132*c8dee2aaSAndroid Build Coastguard Worker ] 133*c8dee2aaSAndroid Build Coastguard Worker description = "assemble {{source}}" 134*c8dee2aaSAndroid Build Coastguard Worker } 135*c8dee2aaSAndroid Build Coastguard Worker 136*c8dee2aaSAndroid Build Coastguard Worker tool("cc") { 137*c8dee2aaSAndroid Build Coastguard Worker precompiled_header_type = "msvc" 138*c8dee2aaSAndroid Build Coastguard Worker pdbname = "{{target_out_dir}}/{{label_name}}_c.pdb" 139*c8dee2aaSAndroid Build Coastguard Worker 140*c8dee2aaSAndroid Build Coastguard Worker # Label names may have spaces so pdbname must be quoted. 141*c8dee2aaSAndroid Build Coastguard Worker command = "$env_setup $cc_wrapper $cl /nologo /showIncludes /FC {{defines}} {{include_dirs}} {{cflags}} $cl_m32_flag {{cflags_c}} /c {{source}} /Fo{{output}} /Fd\"$pdbname\"" 142*c8dee2aaSAndroid Build Coastguard Worker depsformat = "msvc" 143*c8dee2aaSAndroid Build Coastguard Worker outputs = [ 144*c8dee2aaSAndroid Build Coastguard Worker "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.obj", 145*c8dee2aaSAndroid Build Coastguard Worker ] 146*c8dee2aaSAndroid Build Coastguard Worker description = "compile {{source}}" 147*c8dee2aaSAndroid Build Coastguard Worker } 148*c8dee2aaSAndroid Build Coastguard Worker 149*c8dee2aaSAndroid Build Coastguard Worker tool("cxx") { 150*c8dee2aaSAndroid Build Coastguard Worker precompiled_header_type = "msvc" 151*c8dee2aaSAndroid Build Coastguard Worker pdbname = "{{target_out_dir}}/{{label_name}}_c.pdb" 152*c8dee2aaSAndroid Build Coastguard Worker 153*c8dee2aaSAndroid Build Coastguard Worker # Label names may have spaces so pdbname must be quoted. 154*c8dee2aaSAndroid Build Coastguard Worker command = "$env_setup $cc_wrapper $cl /nologo /showIncludes /FC {{defines}} {{include_dirs}} {{cflags}} $cl_m32_flag {{cflags_cc}} /c {{source}} /Fo{{output}} /Fd\"$pdbname\"" 155*c8dee2aaSAndroid Build Coastguard Worker depsformat = "msvc" 156*c8dee2aaSAndroid Build Coastguard Worker outputs = [ 157*c8dee2aaSAndroid Build Coastguard Worker "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.obj", 158*c8dee2aaSAndroid Build Coastguard Worker ] 159*c8dee2aaSAndroid Build Coastguard Worker description = "compile {{source}}" 160*c8dee2aaSAndroid Build Coastguard Worker } 161*c8dee2aaSAndroid Build Coastguard Worker 162*c8dee2aaSAndroid Build Coastguard Worker tool("alink") { 163*c8dee2aaSAndroid Build Coastguard Worker rspfile = "{{output}}.rsp" 164*c8dee2aaSAndroid Build Coastguard Worker 165*c8dee2aaSAndroid Build Coastguard Worker command = "$env_setup $lib /nologo /ignore:4221 {{arflags}} /OUT:{{output}} @$rspfile" 166*c8dee2aaSAndroid Build Coastguard Worker outputs = [ 167*c8dee2aaSAndroid Build Coastguard Worker # Ignore {{output_extension}} and always use .lib, there's no reason to 168*c8dee2aaSAndroid Build Coastguard Worker # allow targets to override this extension on Windows. 169*c8dee2aaSAndroid Build Coastguard Worker "{{root_out_dir}}/{{target_output_name}}{{output_extension}}", 170*c8dee2aaSAndroid Build Coastguard Worker ] 171*c8dee2aaSAndroid Build Coastguard Worker default_output_extension = ".lib" 172*c8dee2aaSAndroid Build Coastguard Worker default_output_dir = "{{target_out_dir}}" 173*c8dee2aaSAndroid Build Coastguard Worker 174*c8dee2aaSAndroid Build Coastguard Worker # inputs_newline works around a fixed per-line buffer size in the linker. 175*c8dee2aaSAndroid Build Coastguard Worker rspfile_content = "{{inputs_newline}}" 176*c8dee2aaSAndroid Build Coastguard Worker description = "link {{output}}" 177*c8dee2aaSAndroid Build Coastguard Worker if (0 <= link_pool_depth) { 178*c8dee2aaSAndroid Build Coastguard Worker pool = ":link_pool($default_toolchain)" 179*c8dee2aaSAndroid Build Coastguard Worker } 180*c8dee2aaSAndroid Build Coastguard Worker } 181*c8dee2aaSAndroid Build Coastguard Worker 182*c8dee2aaSAndroid Build Coastguard Worker tool("solink") { 183*c8dee2aaSAndroid Build Coastguard Worker dllname = "{{output_dir}}/{{target_output_name}}{{output_extension}}" 184*c8dee2aaSAndroid Build Coastguard Worker libname = "${dllname}.lib" 185*c8dee2aaSAndroid Build Coastguard Worker pdbname = "${dllname}.pdb" 186*c8dee2aaSAndroid Build Coastguard Worker rspfile = "${dllname}.rsp" 187*c8dee2aaSAndroid Build Coastguard Worker 188*c8dee2aaSAndroid Build Coastguard Worker command = "$env_setup $link /nologo /IMPLIB:$libname /DLL /OUT:$dllname /PDB:$pdbname @$rspfile" 189*c8dee2aaSAndroid Build Coastguard Worker outputs = [ 190*c8dee2aaSAndroid Build Coastguard Worker dllname, 191*c8dee2aaSAndroid Build Coastguard Worker libname, 192*c8dee2aaSAndroid Build Coastguard Worker pdbname, 193*c8dee2aaSAndroid Build Coastguard Worker ] 194*c8dee2aaSAndroid Build Coastguard Worker default_output_extension = ".dll" 195*c8dee2aaSAndroid Build Coastguard Worker default_output_dir = "{{root_out_dir}}" 196*c8dee2aaSAndroid Build Coastguard Worker 197*c8dee2aaSAndroid Build Coastguard Worker link_output = libname 198*c8dee2aaSAndroid Build Coastguard Worker depend_output = libname 199*c8dee2aaSAndroid Build Coastguard Worker runtime_outputs = [ 200*c8dee2aaSAndroid Build Coastguard Worker dllname, 201*c8dee2aaSAndroid Build Coastguard Worker pdbname, 202*c8dee2aaSAndroid Build Coastguard Worker ] 203*c8dee2aaSAndroid Build Coastguard Worker 204*c8dee2aaSAndroid Build Coastguard Worker # I don't quite understand this. Aping Chrome's toolchain/win/BUILD.gn. 205*c8dee2aaSAndroid Build Coastguard Worker restat = true 206*c8dee2aaSAndroid Build Coastguard Worker 207*c8dee2aaSAndroid Build Coastguard Worker # inputs_newline works around a fixed per-line buffer size in the linker. 208*c8dee2aaSAndroid Build Coastguard Worker rspfile_content = "{{inputs_newline}} {{libs}} {{solibs}} {{ldflags}}" 209*c8dee2aaSAndroid Build Coastguard Worker description = "link {{output}}" 210*c8dee2aaSAndroid Build Coastguard Worker if (0 <= link_pool_depth) { 211*c8dee2aaSAndroid Build Coastguard Worker pool = ":link_pool($default_toolchain)" 212*c8dee2aaSAndroid Build Coastguard Worker } 213*c8dee2aaSAndroid Build Coastguard Worker } 214*c8dee2aaSAndroid Build Coastguard Worker 215*c8dee2aaSAndroid Build Coastguard Worker tool("link") { 216*c8dee2aaSAndroid Build Coastguard Worker exename = "{{root_out_dir}}/{{target_output_name}}{{output_extension}}" 217*c8dee2aaSAndroid Build Coastguard Worker pdbname = "$exename.pdb" 218*c8dee2aaSAndroid Build Coastguard Worker rspfile = "$exename.rsp" 219*c8dee2aaSAndroid Build Coastguard Worker 220*c8dee2aaSAndroid Build Coastguard Worker command = "$env_setup $link /nologo /OUT:$exename /PDB:$pdbname @$rspfile" 221*c8dee2aaSAndroid Build Coastguard Worker default_output_extension = ".exe" 222*c8dee2aaSAndroid Build Coastguard Worker default_output_dir = "{{root_out_dir}}" 223*c8dee2aaSAndroid Build Coastguard Worker outputs = [ exename ] 224*c8dee2aaSAndroid Build Coastguard Worker 225*c8dee2aaSAndroid Build Coastguard Worker # inputs_newline works around a fixed per-line buffer size in the linker. 226*c8dee2aaSAndroid Build Coastguard Worker rspfile_content = "{{inputs_newline}} {{libs}} {{solibs}} {{ldflags}}" 227*c8dee2aaSAndroid Build Coastguard Worker description = "link {{output}}" 228*c8dee2aaSAndroid Build Coastguard Worker if (0 <= link_pool_depth) { 229*c8dee2aaSAndroid Build Coastguard Worker pool = ":link_pool($default_toolchain)" 230*c8dee2aaSAndroid Build Coastguard Worker } 231*c8dee2aaSAndroid Build Coastguard Worker } 232*c8dee2aaSAndroid Build Coastguard Worker 233*c8dee2aaSAndroid Build Coastguard Worker tool("stamp") { 234*c8dee2aaSAndroid Build Coastguard Worker command = "$stamp {{output}}" 235*c8dee2aaSAndroid Build Coastguard Worker description = "stamp {{output}}" 236*c8dee2aaSAndroid Build Coastguard Worker } 237*c8dee2aaSAndroid Build Coastguard Worker 238*c8dee2aaSAndroid Build Coastguard Worker tool("copy") { 239*c8dee2aaSAndroid Build Coastguard Worker cp_py = rebase_path("../cp.py") 240*c8dee2aaSAndroid Build Coastguard Worker command = "$shell python3 \"$cp_py\" {{source}} {{output}}" 241*c8dee2aaSAndroid Build Coastguard Worker description = "copy {{source}} {{output}}" 242*c8dee2aaSAndroid Build Coastguard Worker } 243*c8dee2aaSAndroid Build Coastguard Worker 244*c8dee2aaSAndroid Build Coastguard Worker toolchain_args = { 245*c8dee2aaSAndroid Build Coastguard Worker current_cpu = invoker.cpu 246*c8dee2aaSAndroid Build Coastguard Worker current_os = invoker.os 247*c8dee2aaSAndroid Build Coastguard Worker } 248*c8dee2aaSAndroid Build Coastguard Worker } 249*c8dee2aaSAndroid Build Coastguard Worker} 250*c8dee2aaSAndroid Build Coastguard Worker 251*c8dee2aaSAndroid Build Coastguard Workermsvc_toolchain("msvc") { 252*c8dee2aaSAndroid Build Coastguard Worker cpu = current_cpu 253*c8dee2aaSAndroid Build Coastguard Worker os = current_os 254*c8dee2aaSAndroid Build Coastguard Worker} 255*c8dee2aaSAndroid Build Coastguard Worker 256*c8dee2aaSAndroid Build Coastguard Workermsvc_toolchain("msvc_host") { 257*c8dee2aaSAndroid Build Coastguard Worker cpu = host_cpu 258*c8dee2aaSAndroid Build Coastguard Worker os = host_os 259*c8dee2aaSAndroid Build Coastguard Worker} 260*c8dee2aaSAndroid Build Coastguard Worker 261*c8dee2aaSAndroid Build Coastguard Workertemplate("gcc_like_toolchain") { 262*c8dee2aaSAndroid Build Coastguard Worker toolchain(target_name) { 263*c8dee2aaSAndroid Build Coastguard Worker ar = invoker.ar 264*c8dee2aaSAndroid Build Coastguard Worker cc = invoker.cc 265*c8dee2aaSAndroid Build Coastguard Worker cxx = invoker.cxx 266*c8dee2aaSAndroid Build Coastguard Worker link = invoker.link 267*c8dee2aaSAndroid Build Coastguard Worker lib_switch = "-l" 268*c8dee2aaSAndroid Build Coastguard Worker lib_dir_switch = "-L" 269*c8dee2aaSAndroid Build Coastguard Worker 270*c8dee2aaSAndroid Build Coastguard Worker tool("cc") { 271*c8dee2aaSAndroid Build Coastguard Worker depfile = "{{output}}.d" 272*c8dee2aaSAndroid Build Coastguard Worker command = "$cc_wrapper $cc -MD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_c}} -c {{source}} -o {{output}}" 273*c8dee2aaSAndroid Build Coastguard Worker depsformat = "gcc" 274*c8dee2aaSAndroid Build Coastguard Worker outputs = 275*c8dee2aaSAndroid Build Coastguard Worker [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ] 276*c8dee2aaSAndroid Build Coastguard Worker description = "compile {{source}}" 277*c8dee2aaSAndroid Build Coastguard Worker } 278*c8dee2aaSAndroid Build Coastguard Worker 279*c8dee2aaSAndroid Build Coastguard Worker tool("cxx") { 280*c8dee2aaSAndroid Build Coastguard Worker depfile = "{{output}}.d" 281*c8dee2aaSAndroid Build Coastguard Worker command = "$cc_wrapper $cxx -MD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}} -c {{source}} -o {{output}}" 282*c8dee2aaSAndroid Build Coastguard Worker depsformat = "gcc" 283*c8dee2aaSAndroid Build Coastguard Worker outputs = 284*c8dee2aaSAndroid Build Coastguard Worker [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ] 285*c8dee2aaSAndroid Build Coastguard Worker description = "compile {{source}}" 286*c8dee2aaSAndroid Build Coastguard Worker } 287*c8dee2aaSAndroid Build Coastguard Worker 288*c8dee2aaSAndroid Build Coastguard Worker tool("objc") { 289*c8dee2aaSAndroid Build Coastguard Worker depfile = "{{output}}.d" 290*c8dee2aaSAndroid Build Coastguard Worker command = "$cc_wrapper $cc -MD -MF $depfile {{defines}} {{include_dirs}} {{framework_dirs}} {{cflags}} {{cflags_objc}} -c {{source}} -o {{output}}" 291*c8dee2aaSAndroid Build Coastguard Worker depsformat = "gcc" 292*c8dee2aaSAndroid Build Coastguard Worker outputs = 293*c8dee2aaSAndroid Build Coastguard Worker [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ] 294*c8dee2aaSAndroid Build Coastguard Worker description = "compile {{source}}" 295*c8dee2aaSAndroid Build Coastguard Worker } 296*c8dee2aaSAndroid Build Coastguard Worker 297*c8dee2aaSAndroid Build Coastguard Worker tool("objcxx") { 298*c8dee2aaSAndroid Build Coastguard Worker depfile = "{{output}}.d" 299*c8dee2aaSAndroid Build Coastguard Worker command = "$cc_wrapper $cxx -MD -MF $depfile {{defines}} {{include_dirs}} {{framework_dirs}} {{cflags}} {{cflags_objcc}} -c {{source}} -o {{output}}" 300*c8dee2aaSAndroid Build Coastguard Worker depsformat = "gcc" 301*c8dee2aaSAndroid Build Coastguard Worker outputs = 302*c8dee2aaSAndroid Build Coastguard Worker [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ] 303*c8dee2aaSAndroid Build Coastguard Worker description = "compile {{source}}" 304*c8dee2aaSAndroid Build Coastguard Worker } 305*c8dee2aaSAndroid Build Coastguard Worker 306*c8dee2aaSAndroid Build Coastguard Worker tool("asm") { 307*c8dee2aaSAndroid Build Coastguard Worker depfile = "{{output}}.d" 308*c8dee2aaSAndroid Build Coastguard Worker command = "$cc_wrapper $cc -MD -MF $depfile {{defines}} {{include_dirs}} {{asmflags}} -c {{source}} -o {{output}}" 309*c8dee2aaSAndroid Build Coastguard Worker depsformat = "gcc" 310*c8dee2aaSAndroid Build Coastguard Worker outputs = 311*c8dee2aaSAndroid Build Coastguard Worker [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ] 312*c8dee2aaSAndroid Build Coastguard Worker description = "assemble {{source}}" 313*c8dee2aaSAndroid Build Coastguard Worker } 314*c8dee2aaSAndroid Build Coastguard Worker 315*c8dee2aaSAndroid Build Coastguard Worker if (is_mac || is_ios) { 316*c8dee2aaSAndroid Build Coastguard Worker not_needed([ "ar" ]) # We use libtool instead. 317*c8dee2aaSAndroid Build Coastguard Worker } 318*c8dee2aaSAndroid Build Coastguard Worker 319*c8dee2aaSAndroid Build Coastguard Worker tool("alink") { 320*c8dee2aaSAndroid Build Coastguard Worker if (is_mac || is_ios) { 321*c8dee2aaSAndroid Build Coastguard Worker command = "libtool -static -o {{output}} -no_warning_for_no_symbols {{inputs}}" 322*c8dee2aaSAndroid Build Coastguard Worker } else { 323*c8dee2aaSAndroid Build Coastguard Worker rspfile = "{{output}}.rsp" 324*c8dee2aaSAndroid Build Coastguard Worker rspfile_content = "{{inputs}}" 325*c8dee2aaSAndroid Build Coastguard Worker rm_py = rebase_path("../rm.py") 326*c8dee2aaSAndroid Build Coastguard Worker command = "$shell python3 \"$rm_py\" \"{{output}}\" && $ar rcs {{output}} @$rspfile" 327*c8dee2aaSAndroid Build Coastguard Worker } 328*c8dee2aaSAndroid Build Coastguard Worker 329*c8dee2aaSAndroid Build Coastguard Worker outputs = 330*c8dee2aaSAndroid Build Coastguard Worker [ "{{root_out_dir}}/{{target_output_name}}{{output_extension}}" ] 331*c8dee2aaSAndroid Build Coastguard Worker default_output_extension = ".a" 332*c8dee2aaSAndroid Build Coastguard Worker output_prefix = "lib" 333*c8dee2aaSAndroid Build Coastguard Worker description = "link {{output}}" 334*c8dee2aaSAndroid Build Coastguard Worker if (0 <= link_pool_depth) { 335*c8dee2aaSAndroid Build Coastguard Worker pool = ":link_pool($default_toolchain)" 336*c8dee2aaSAndroid Build Coastguard Worker } 337*c8dee2aaSAndroid Build Coastguard Worker } 338*c8dee2aaSAndroid Build Coastguard Worker 339*c8dee2aaSAndroid Build Coastguard Worker tool("solink") { 340*c8dee2aaSAndroid Build Coastguard Worker soname = "{{target_output_name}}{{output_extension}}" 341*c8dee2aaSAndroid Build Coastguard Worker 342*c8dee2aaSAndroid Build Coastguard Worker rpath = "-Wl,-soname,$soname" 343*c8dee2aaSAndroid Build Coastguard Worker if (is_mac || is_ios) { 344*c8dee2aaSAndroid Build Coastguard Worker rpath = "-Wl,-install_name,@rpath/$soname" 345*c8dee2aaSAndroid Build Coastguard Worker } 346*c8dee2aaSAndroid Build Coastguard Worker 347*c8dee2aaSAndroid Build Coastguard Worker rspfile = "{{output}}.rsp" 348*c8dee2aaSAndroid Build Coastguard Worker rspfile_content = "{{inputs}}" 349*c8dee2aaSAndroid Build Coastguard Worker 350*c8dee2aaSAndroid Build Coastguard Worker # --start-group/--end-group let us link multiple .a {{inputs}} 351*c8dee2aaSAndroid Build Coastguard Worker # without worrying about their relative order on the link line. 352*c8dee2aaSAndroid Build Coastguard Worker # 353*c8dee2aaSAndroid Build Coastguard Worker # This is mostly important for traditional linkers like GNU ld and Gold. 354*c8dee2aaSAndroid Build Coastguard Worker # The Mac/iOS linker neither needs nor accepts these flags. 355*c8dee2aaSAndroid Build Coastguard Worker # LLD doesn't need these flags, but accepts and ignores them. 356*c8dee2aaSAndroid Build Coastguard Worker _start_group = "-Wl,--start-group" 357*c8dee2aaSAndroid Build Coastguard Worker _end_group = "-Wl,--end-group" 358*c8dee2aaSAndroid Build Coastguard Worker if (is_mac || is_ios || is_fuchsia) { 359*c8dee2aaSAndroid Build Coastguard Worker _start_group = "" 360*c8dee2aaSAndroid Build Coastguard Worker _end_group = "" 361*c8dee2aaSAndroid Build Coastguard Worker } 362*c8dee2aaSAndroid Build Coastguard Worker 363*c8dee2aaSAndroid Build Coastguard Worker command = "$link -shared {{ldflags}} $_start_group @$rspfile {{frameworks}} {{solibs}} $_end_group {{libs}} $rpath -o {{output}}" 364*c8dee2aaSAndroid Build Coastguard Worker outputs = [ "{{root_out_dir}}/$soname" ] 365*c8dee2aaSAndroid Build Coastguard Worker output_prefix = "lib" 366*c8dee2aaSAndroid Build Coastguard Worker if (is_mac || is_ios) { 367*c8dee2aaSAndroid Build Coastguard Worker default_output_extension = ".dylib" 368*c8dee2aaSAndroid Build Coastguard Worker } else { 369*c8dee2aaSAndroid Build Coastguard Worker default_output_extension = ".so" 370*c8dee2aaSAndroid Build Coastguard Worker } 371*c8dee2aaSAndroid Build Coastguard Worker description = "link {{output}}" 372*c8dee2aaSAndroid Build Coastguard Worker if (0 <= link_pool_depth) { 373*c8dee2aaSAndroid Build Coastguard Worker pool = ":link_pool($default_toolchain)" 374*c8dee2aaSAndroid Build Coastguard Worker } 375*c8dee2aaSAndroid Build Coastguard Worker } 376*c8dee2aaSAndroid Build Coastguard Worker 377*c8dee2aaSAndroid Build Coastguard Worker tool("link") { 378*c8dee2aaSAndroid Build Coastguard Worker exe_name = "{{root_out_dir}}/{{target_output_name}}{{output_extension}}" 379*c8dee2aaSAndroid Build Coastguard Worker rspfile = "$exe_name.rsp" 380*c8dee2aaSAndroid Build Coastguard Worker rspfile_content = "{{inputs}}" 381*c8dee2aaSAndroid Build Coastguard Worker 382*c8dee2aaSAndroid Build Coastguard Worker # --start-group/--end-group let us link multiple .a {{inputs}} 383*c8dee2aaSAndroid Build Coastguard Worker # without worrying about their relative order on the link line. 384*c8dee2aaSAndroid Build Coastguard Worker # 385*c8dee2aaSAndroid Build Coastguard Worker # This is mostly important for traditional linkers like GNU ld and Gold. 386*c8dee2aaSAndroid Build Coastguard Worker # The Mac/iOS linker neither needs nor accepts these flags. 387*c8dee2aaSAndroid Build Coastguard Worker # LLD doesn't need these flags, but accepts and ignores them. 388*c8dee2aaSAndroid Build Coastguard Worker _start_group = "-Wl,--start-group" 389*c8dee2aaSAndroid Build Coastguard Worker _end_group = "-Wl,--end-group" 390*c8dee2aaSAndroid Build Coastguard Worker if (is_mac || is_ios || is_fuchsia) { 391*c8dee2aaSAndroid Build Coastguard Worker _start_group = "" 392*c8dee2aaSAndroid Build Coastguard Worker _end_group = "" 393*c8dee2aaSAndroid Build Coastguard Worker } 394*c8dee2aaSAndroid Build Coastguard Worker command = "$link {{ldflags}} $_start_group @$rspfile {{frameworks}} {{solibs}} $_end_group {{libs}} -o $exe_name" 395*c8dee2aaSAndroid Build Coastguard Worker 396*c8dee2aaSAndroid Build Coastguard Worker outputs = [ "$exe_name" ] 397*c8dee2aaSAndroid Build Coastguard Worker description = "link {{output}}" 398*c8dee2aaSAndroid Build Coastguard Worker if (0 <= link_pool_depth) { 399*c8dee2aaSAndroid Build Coastguard Worker pool = ":link_pool($default_toolchain)" 400*c8dee2aaSAndroid Build Coastguard Worker } 401*c8dee2aaSAndroid Build Coastguard Worker } 402*c8dee2aaSAndroid Build Coastguard Worker 403*c8dee2aaSAndroid Build Coastguard Worker tool("stamp") { 404*c8dee2aaSAndroid Build Coastguard Worker command = "$stamp {{output}}" 405*c8dee2aaSAndroid Build Coastguard Worker description = "stamp {{output}}" 406*c8dee2aaSAndroid Build Coastguard Worker } 407*c8dee2aaSAndroid Build Coastguard Worker 408*c8dee2aaSAndroid Build Coastguard Worker tool("copy") { 409*c8dee2aaSAndroid Build Coastguard Worker cp_py = rebase_path("../cp.py") 410*c8dee2aaSAndroid Build Coastguard Worker command = "python3 \"$cp_py\" {{source}} {{output}}" 411*c8dee2aaSAndroid Build Coastguard Worker description = "copy {{source}} {{output}}" 412*c8dee2aaSAndroid Build Coastguard Worker } 413*c8dee2aaSAndroid Build Coastguard Worker 414*c8dee2aaSAndroid Build Coastguard Worker tool("copy_bundle_data") { 415*c8dee2aaSAndroid Build Coastguard Worker cp_py = rebase_path("../cp.py") 416*c8dee2aaSAndroid Build Coastguard Worker command = "python3 \"$cp_py\" {{source}} {{output}}" 417*c8dee2aaSAndroid Build Coastguard Worker description = "copy_bundle_data {{source}} {{output}}" 418*c8dee2aaSAndroid Build Coastguard Worker } 419*c8dee2aaSAndroid Build Coastguard Worker 420*c8dee2aaSAndroid Build Coastguard Worker # We don't currently have any xcasset files so make this a NOP 421*c8dee2aaSAndroid Build Coastguard Worker tool("compile_xcassets") { 422*c8dee2aaSAndroid Build Coastguard Worker command = "true" 423*c8dee2aaSAndroid Build Coastguard Worker description = "compile_xcassets {{output}}" 424*c8dee2aaSAndroid Build Coastguard Worker } 425*c8dee2aaSAndroid Build Coastguard Worker 426*c8dee2aaSAndroid Build Coastguard Worker toolchain_args = { 427*c8dee2aaSAndroid Build Coastguard Worker current_cpu = invoker.cpu 428*c8dee2aaSAndroid Build Coastguard Worker current_os = invoker.os 429*c8dee2aaSAndroid Build Coastguard Worker } 430*c8dee2aaSAndroid Build Coastguard Worker } 431*c8dee2aaSAndroid Build Coastguard Worker} 432*c8dee2aaSAndroid Build Coastguard Worker 433*c8dee2aaSAndroid Build Coastguard Workergcc_like_toolchain("gcc_like") { 434*c8dee2aaSAndroid Build Coastguard Worker cpu = current_cpu 435*c8dee2aaSAndroid Build Coastguard Worker os = current_os 436*c8dee2aaSAndroid Build Coastguard Worker ar = target_ar 437*c8dee2aaSAndroid Build Coastguard Worker cc = target_cc 438*c8dee2aaSAndroid Build Coastguard Worker cxx = target_cxx 439*c8dee2aaSAndroid Build Coastguard Worker link = target_link 440*c8dee2aaSAndroid Build Coastguard Worker} 441*c8dee2aaSAndroid Build Coastguard Worker 442*c8dee2aaSAndroid Build Coastguard Workergcc_like_toolchain("gcc_like_host") { 443*c8dee2aaSAndroid Build Coastguard Worker cpu = host_cpu 444*c8dee2aaSAndroid Build Coastguard Worker os = host_os 445*c8dee2aaSAndroid Build Coastguard Worker ar = host_ar 446*c8dee2aaSAndroid Build Coastguard Worker cc = host_cc 447*c8dee2aaSAndroid Build Coastguard Worker cxx = host_cxx 448*c8dee2aaSAndroid Build Coastguard Worker link = host_link 449*c8dee2aaSAndroid Build Coastguard Worker} 450*c8dee2aaSAndroid Build Coastguard Worker 451*c8dee2aaSAndroid Build Coastguard Worker# Only define this toolchain if actually building for wasm. 452*c8dee2aaSAndroid Build Coastguard Workerif (is_wasm) { 453*c8dee2aaSAndroid Build Coastguard Worker gcc_like_toolchain("wasm") { 454*c8dee2aaSAndroid Build Coastguard Worker cpu = "wasm" 455*c8dee2aaSAndroid Build Coastguard Worker os = "wasm" 456*c8dee2aaSAndroid Build Coastguard Worker if (host_os == "win") { 457*c8dee2aaSAndroid Build Coastguard Worker ar = "$skia_emsdk_dir/upstream/emscripten/emar.bat" 458*c8dee2aaSAndroid Build Coastguard Worker cc = "$skia_emsdk_dir/upstream/emscripten/emcc.bat" 459*c8dee2aaSAndroid Build Coastguard Worker cxx = "$skia_emsdk_dir/upstream/emscripten/em++.bat" 460*c8dee2aaSAndroid Build Coastguard Worker } else { 461*c8dee2aaSAndroid Build Coastguard Worker ar = "$skia_emsdk_dir/upstream/emscripten/emar" 462*c8dee2aaSAndroid Build Coastguard Worker cc = "$skia_emsdk_dir/upstream/emscripten/emcc" 463*c8dee2aaSAndroid Build Coastguard Worker cxx = "$skia_emsdk_dir/upstream/emscripten/em++" 464*c8dee2aaSAndroid Build Coastguard Worker } 465*c8dee2aaSAndroid Build Coastguard Worker link = cxx 466*c8dee2aaSAndroid Build Coastguard Worker } 467*c8dee2aaSAndroid Build Coastguard Worker} 468