1*6dbdd20aSAndroid Build Coastguard Worker# Copyright (C) 2017 The Android Open Source Project 2*6dbdd20aSAndroid Build Coastguard Worker# 3*6dbdd20aSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 4*6dbdd20aSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 5*6dbdd20aSAndroid Build Coastguard Worker# You may obtain a copy of the License at 6*6dbdd20aSAndroid Build Coastguard Worker# 7*6dbdd20aSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 8*6dbdd20aSAndroid Build Coastguard Worker# 9*6dbdd20aSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 10*6dbdd20aSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 11*6dbdd20aSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*6dbdd20aSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 13*6dbdd20aSAndroid Build Coastguard Worker# limitations under the License. 14*6dbdd20aSAndroid Build Coastguard Worker 15*6dbdd20aSAndroid Build Coastguard Workerimport("//gn/perfetto.gni") 16*6dbdd20aSAndroid Build Coastguard Workerimport("//gn/standalone/android.gni") 17*6dbdd20aSAndroid Build Coastguard Workerimport("//gn/standalone/wasm.gni") 18*6dbdd20aSAndroid Build Coastguard Workerimport("llvm.gni") 19*6dbdd20aSAndroid Build Coastguard Workerimport("msvc.gni") 20*6dbdd20aSAndroid Build Coastguard Worker 21*6dbdd20aSAndroid Build Coastguard Worker# This file is evaluated once, within the context of the default toolchain, 22*6dbdd20aSAndroid Build Coastguard Worker# which is the target toolchain. 23*6dbdd20aSAndroid Build Coastguard Worker# Note: This means that is_android=true even on a mac when cross-compiling for 24*6dbdd20aSAndroid Build Coastguard Worker# Android. 25*6dbdd20aSAndroid Build Coastguard Workerassert(current_os == target_os && current_cpu == target_cpu, 26*6dbdd20aSAndroid Build Coastguard Worker "Assumptions on current_xxx in this file have been violated") 27*6dbdd20aSAndroid Build Coastguard Worker 28*6dbdd20aSAndroid Build Coastguard Workerdeclare_args() { 29*6dbdd20aSAndroid Build Coastguard Worker cc_wrapper = "" 30*6dbdd20aSAndroid Build Coastguard Worker 31*6dbdd20aSAndroid Build Coastguard Worker # These apply to both target and host toolchains. 32*6dbdd20aSAndroid Build Coastguard Worker extra_cflags = "" 33*6dbdd20aSAndroid Build Coastguard Worker extra_cxxflags = "" 34*6dbdd20aSAndroid Build Coastguard Worker extra_ldflags = "" 35*6dbdd20aSAndroid Build Coastguard Worker 36*6dbdd20aSAndroid Build Coastguard Worker # These apply only to the target toolchain. 37*6dbdd20aSAndroid Build Coastguard Worker extra_target_cflags = "" 38*6dbdd20aSAndroid Build Coastguard Worker extra_target_cxxflags = "" 39*6dbdd20aSAndroid Build Coastguard Worker extra_target_ldflags = "" 40*6dbdd20aSAndroid Build Coastguard Worker 41*6dbdd20aSAndroid Build Coastguard Worker # These apply only to the host toolchain. 42*6dbdd20aSAndroid Build Coastguard Worker extra_host_cflags = "" 43*6dbdd20aSAndroid Build Coastguard Worker extra_host_cxxflags = "" 44*6dbdd20aSAndroid Build Coastguard Worker extra_host_ldflags = "" 45*6dbdd20aSAndroid Build Coastguard Worker} 46*6dbdd20aSAndroid Build Coastguard Worker 47*6dbdd20aSAndroid Build Coastguard Worker# First of all determine the host toolchain. The user can override this by: 48*6dbdd20aSAndroid Build Coastguard Worker# 1. setting ar/cc/cxx vars in args.gn. 49*6dbdd20aSAndroid Build Coastguard Worker# 2. setting is_system_compiler=true in args.gn and the env vars AR/CC/CXX. 50*6dbdd20aSAndroid Build Coastguard Worker# This is used by OSSFuzz and CrOS ebuilds. 51*6dbdd20aSAndroid Build Coastguard Worker 52*6dbdd20aSAndroid Build Coastguard Worker_llvm_strip_wrapper = rebase_path("llvm-strip.py", root_build_dir) 53*6dbdd20aSAndroid Build Coastguard Worker 54*6dbdd20aSAndroid Build Coastguard Workerdeclare_args() { 55*6dbdd20aSAndroid Build Coastguard Worker sysroot = "" 56*6dbdd20aSAndroid Build Coastguard Worker gcc_toolchain = "" 57*6dbdd20aSAndroid Build Coastguard Worker ar = "ar" 58*6dbdd20aSAndroid Build Coastguard Worker linker = "" 59*6dbdd20aSAndroid Build Coastguard Worker strip = "" 60*6dbdd20aSAndroid Build Coastguard Worker 61*6dbdd20aSAndroid Build Coastguard Worker if (is_linux_host) { 62*6dbdd20aSAndroid Build Coastguard Worker linker = "gold" 63*6dbdd20aSAndroid Build Coastguard Worker if (linux_llvm_objcopy != "") { 64*6dbdd20aSAndroid Build Coastguard Worker # If we are using the hermetic clang toolchain llvm-objcopy from there as 65*6dbdd20aSAndroid Build Coastguard Worker # it works with Linux-arm cross toolchains. The |_llvm_strip_wrapper| is 66*6dbdd20aSAndroid Build Coastguard Worker # to set argv0 as llvm-strip. llvm-objcopy's frontend works differently 67*6dbdd20aSAndroid Build Coastguard Worker # when invoked as llvm-strip, pretending to be just 'strip'. 68*6dbdd20aSAndroid Build Coastguard Worker strip = "${_llvm_strip_wrapper} ${linux_llvm_objcopy}" 69*6dbdd20aSAndroid Build Coastguard Worker } else { 70*6dbdd20aSAndroid Build Coastguard Worker strip = "strip" 71*6dbdd20aSAndroid Build Coastguard Worker } 72*6dbdd20aSAndroid Build Coastguard Worker } else if (is_mac_host) { 73*6dbdd20aSAndroid Build Coastguard Worker strip = "strip -x" 74*6dbdd20aSAndroid Build Coastguard Worker } 75*6dbdd20aSAndroid Build Coastguard Worker 76*6dbdd20aSAndroid Build Coastguard Worker if (is_clang) { 77*6dbdd20aSAndroid Build Coastguard Worker if (is_linux_host && !is_system_compiler) { 78*6dbdd20aSAndroid Build Coastguard Worker cc = linux_clang_bin 79*6dbdd20aSAndroid Build Coastguard Worker cxx = linux_clangxx_bin 80*6dbdd20aSAndroid Build Coastguard Worker linker = linux_clang_linker 81*6dbdd20aSAndroid Build Coastguard Worker } else if (is_win_host && !is_system_compiler) { 82*6dbdd20aSAndroid Build Coastguard Worker cc = win_clang_bin 83*6dbdd20aSAndroid Build Coastguard Worker cxx = win_clangxx_bin 84*6dbdd20aSAndroid Build Coastguard Worker linker = win_clang_linker 85*6dbdd20aSAndroid Build Coastguard Worker } else { 86*6dbdd20aSAndroid Build Coastguard Worker cc = "clang" 87*6dbdd20aSAndroid Build Coastguard Worker cxx = "clang++" 88*6dbdd20aSAndroid Build Coastguard Worker linker = "" 89*6dbdd20aSAndroid Build Coastguard Worker } 90*6dbdd20aSAndroid Build Coastguard Worker } else if (is_win) { # MSVC 91*6dbdd20aSAndroid Build Coastguard Worker cc = "${win_msvc_bin_dir}\\cl.exe" 92*6dbdd20aSAndroid Build Coastguard Worker cxx = "${win_msvc_bin_dir}\\cl.exe" 93*6dbdd20aSAndroid Build Coastguard Worker linker = "${win_msvc_bin_dir}\\link.exe" 94*6dbdd20aSAndroid Build Coastguard Worker } else { # GCC 95*6dbdd20aSAndroid Build Coastguard Worker cc = "gcc" 96*6dbdd20aSAndroid Build Coastguard Worker cxx = "g++" 97*6dbdd20aSAndroid Build Coastguard Worker } 98*6dbdd20aSAndroid Build Coastguard Worker} 99*6dbdd20aSAndroid Build Coastguard Worker 100*6dbdd20aSAndroid Build Coastguard Worker# Then determine the target toolchain. 101*6dbdd20aSAndroid Build Coastguard Worker 102*6dbdd20aSAndroid Build Coastguard Workerdeclare_args() { 103*6dbdd20aSAndroid Build Coastguard Worker _default_target_sysroot = "" 104*6dbdd20aSAndroid Build Coastguard Worker target_gcc_toolchain = "" 105*6dbdd20aSAndroid Build Coastguard Worker 106*6dbdd20aSAndroid Build Coastguard Worker # |target_triplet| is the variable that the user can set via GN args. The user 107*6dbdd20aSAndroid Build Coastguard Worker # doesn't have to necessarily set it though. In most cases we can infer it 108*6dbdd20aSAndroid Build Coastguard Worker # by looking at target_os and target_cpu. 109*6dbdd20aSAndroid Build Coastguard Worker # |_target_triplet| is the final argument passed to the toolchain. 110*6dbdd20aSAndroid Build Coastguard Worker if (target_triplet != "") { 111*6dbdd20aSAndroid Build Coastguard Worker assert(is_cross_compiling) 112*6dbdd20aSAndroid Build Coastguard Worker 113*6dbdd20aSAndroid Build Coastguard Worker # If the user provides the target_triplet in gn args, respect that. 114*6dbdd20aSAndroid Build Coastguard Worker # Otherwise guess it looking at the target os and cpu variables. 115*6dbdd20aSAndroid Build Coastguard Worker _target_triplet = target_triplet 116*6dbdd20aSAndroid Build Coastguard Worker } else if (!is_cross_compiling) { 117*6dbdd20aSAndroid Build Coastguard Worker _target_triplet = "" 118*6dbdd20aSAndroid Build Coastguard Worker } else if (target_os == "mac" && target_cpu == "x64") { 119*6dbdd20aSAndroid Build Coastguard Worker _target_triplet = "x86_64-apple-darwin" 120*6dbdd20aSAndroid Build Coastguard Worker } else if (target_os == "mac" && target_cpu == "x86") { 121*6dbdd20aSAndroid Build Coastguard Worker _target_triplet = "i686-apple-darwin" 122*6dbdd20aSAndroid Build Coastguard Worker } else if (target_os == "mac" && target_cpu == "arm64") { 123*6dbdd20aSAndroid Build Coastguard Worker _target_triplet = "aarch64-apple-darwin" 124*6dbdd20aSAndroid Build Coastguard Worker } else if (target_os == "linux" && target_cpu == "arm64") { 125*6dbdd20aSAndroid Build Coastguard Worker _target_triplet = "aarch64-linux-gnu" 126*6dbdd20aSAndroid Build Coastguard Worker _default_target_sysroot = 127*6dbdd20aSAndroid Build Coastguard Worker rebase_path("//buildtools/debian_sid_arm64-sysroot", root_build_dir) 128*6dbdd20aSAndroid Build Coastguard Worker } else if (target_os == "linux" && target_cpu == "arm") { 129*6dbdd20aSAndroid Build Coastguard Worker _target_triplet = "arm-linux-gnueabihf" 130*6dbdd20aSAndroid Build Coastguard Worker _default_target_sysroot = 131*6dbdd20aSAndroid Build Coastguard Worker rebase_path("//buildtools/debian_sid_arm-sysroot", root_build_dir) 132*6dbdd20aSAndroid Build Coastguard Worker } else if (target_os == "linux" && target_cpu == "riscv64") { 133*6dbdd20aSAndroid Build Coastguard Worker _target_triplet = "riscv64-linux-gnu" 134*6dbdd20aSAndroid Build Coastguard Worker } else if (target_os == "linux" && target_cpu == "x64") { 135*6dbdd20aSAndroid Build Coastguard Worker _target_triplet = "x86_64-linux-gnu" 136*6dbdd20aSAndroid Build Coastguard Worker } else if (target_os == "linux" && target_cpu == "x86") { 137*6dbdd20aSAndroid Build Coastguard Worker # Chrome's packaging of clang uses i386 for x86 libs, so an i686 triplet 138*6dbdd20aSAndroid Build Coastguard Worker # fails to find the necessary sanitizer archives. 139*6dbdd20aSAndroid Build Coastguard Worker if (is_hermetic_clang && (is_asan || is_lsan)) { 140*6dbdd20aSAndroid Build Coastguard Worker _target_triplet = "i386-linux-gnu" 141*6dbdd20aSAndroid Build Coastguard Worker } else { 142*6dbdd20aSAndroid Build Coastguard Worker _target_triplet = "i686-linux-gnu" 143*6dbdd20aSAndroid Build Coastguard Worker } 144*6dbdd20aSAndroid Build Coastguard Worker } else if (target_os == "android" && target_cpu == "arm64") { 145*6dbdd20aSAndroid Build Coastguard Worker _target_triplet = "aarch64-linux-android" 146*6dbdd20aSAndroid Build Coastguard Worker } else if (target_os == "android" && target_cpu == "arm") { 147*6dbdd20aSAndroid Build Coastguard Worker _target_triplet = "arm-linux-androideabi" 148*6dbdd20aSAndroid Build Coastguard Worker } else if (target_os == "android" && target_cpu == "x86") { 149*6dbdd20aSAndroid Build Coastguard Worker _target_triplet = "i686-linux-android" 150*6dbdd20aSAndroid Build Coastguard Worker } else if (target_os == "android" && target_cpu == "x64") { 151*6dbdd20aSAndroid Build Coastguard Worker _target_triplet = "x86_64-linux-android" 152*6dbdd20aSAndroid Build Coastguard Worker } else { 153*6dbdd20aSAndroid Build Coastguard Worker assert( 154*6dbdd20aSAndroid Build Coastguard Worker false, 155*6dbdd20aSAndroid Build Coastguard Worker "Cannot guess the target triplet from the target_os and target_cpu combination. Please set the target_triplet GN arg explicitly. See https://clang.llvm.org/docs/CrossCompilation.html#target-triple") 156*6dbdd20aSAndroid Build Coastguard Worker } 157*6dbdd20aSAndroid Build Coastguard Worker} 158*6dbdd20aSAndroid Build Coastguard Worker 159*6dbdd20aSAndroid Build Coastguard Workerdeclare_args() { 160*6dbdd20aSAndroid Build Coastguard Worker if (sysroot != "") { 161*6dbdd20aSAndroid Build Coastguard Worker # If the user specifies a sysroot, use that for both host and target. 162*6dbdd20aSAndroid Build Coastguard Worker target_sysroot = sysroot 163*6dbdd20aSAndroid Build Coastguard Worker } else { 164*6dbdd20aSAndroid Build Coastguard Worker # If no explicit sysroot has been set, use the guessed sysroot from the ones 165*6dbdd20aSAndroid Build Coastguard Worker # pulled by //tools/install-build-deps (only for Linux). 166*6dbdd20aSAndroid Build Coastguard Worker target_sysroot = _default_target_sysroot 167*6dbdd20aSAndroid Build Coastguard Worker } 168*6dbdd20aSAndroid Build Coastguard Worker} 169*6dbdd20aSAndroid Build Coastguard Worker 170*6dbdd20aSAndroid Build Coastguard Workerdeclare_args() { 171*6dbdd20aSAndroid Build Coastguard Worker target_strip = "" 172*6dbdd20aSAndroid Build Coastguard Worker if (is_linux || is_android) { 173*6dbdd20aSAndroid Build Coastguard Worker target_linker = "gold" 174*6dbdd20aSAndroid Build Coastguard Worker } else { 175*6dbdd20aSAndroid Build Coastguard Worker target_linker = "" 176*6dbdd20aSAndroid Build Coastguard Worker } 177*6dbdd20aSAndroid Build Coastguard Worker 178*6dbdd20aSAndroid Build Coastguard Worker if (!is_cross_compiling || is_perfetto_build_generator || 179*6dbdd20aSAndroid Build Coastguard Worker is_system_compiler) { 180*6dbdd20aSAndroid Build Coastguard Worker target_ar = ar 181*6dbdd20aSAndroid Build Coastguard Worker target_cc = cc 182*6dbdd20aSAndroid Build Coastguard Worker target_cxx = cxx 183*6dbdd20aSAndroid Build Coastguard Worker target_linker = linker 184*6dbdd20aSAndroid Build Coastguard Worker target_strip = strip 185*6dbdd20aSAndroid Build Coastguard Worker } else { 186*6dbdd20aSAndroid Build Coastguard Worker target_ar = "ar" 187*6dbdd20aSAndroid Build Coastguard Worker if (is_android) { 188*6dbdd20aSAndroid Build Coastguard Worker target_ar = "$android_llvm_dir/bin/llvm-ar" 189*6dbdd20aSAndroid Build Coastguard Worker target_cc = "$android_llvm_dir/bin/clang" 190*6dbdd20aSAndroid Build Coastguard Worker target_cxx = "$android_llvm_dir/bin/clang++" 191*6dbdd20aSAndroid Build Coastguard Worker target_linker = "$android_llvm_dir/bin/ld.lld" 192*6dbdd20aSAndroid Build Coastguard Worker target_strip = "$android_llvm_dir/bin/llvm-strip" 193*6dbdd20aSAndroid Build Coastguard Worker } else { 194*6dbdd20aSAndroid Build Coastguard Worker assert(_target_triplet != "", 195*6dbdd20aSAndroid Build Coastguard Worker "target_triplet must be non-empty when cross-compiling") 196*6dbdd20aSAndroid Build Coastguard Worker target_strip = strip 197*6dbdd20aSAndroid Build Coastguard Worker if (is_clang) { 198*6dbdd20aSAndroid Build Coastguard Worker if (is_linux_host) { 199*6dbdd20aSAndroid Build Coastguard Worker target_cc = "${linux_clang_bin} --target=${_target_triplet}" 200*6dbdd20aSAndroid Build Coastguard Worker target_cxx = "${linux_clangxx_bin} --target=${_target_triplet}" 201*6dbdd20aSAndroid Build Coastguard Worker target_linker = "${linux_clang_linker} --target=${_target_triplet}" 202*6dbdd20aSAndroid Build Coastguard Worker } else { 203*6dbdd20aSAndroid Build Coastguard Worker target_cc = "clang --target=${_target_triplet}" 204*6dbdd20aSAndroid Build Coastguard Worker target_cxx = "clang++ --target=${_target_triplet}" 205*6dbdd20aSAndroid Build Coastguard Worker } 206*6dbdd20aSAndroid Build Coastguard Worker } else { # GCC 207*6dbdd20aSAndroid Build Coastguard Worker target_ar = "${_target_triplet}-ar" 208*6dbdd20aSAndroid Build Coastguard Worker target_cc = "${_target_triplet}-gcc" 209*6dbdd20aSAndroid Build Coastguard Worker target_cxx = "${_target_triplet}-g++" 210*6dbdd20aSAndroid Build Coastguard Worker } 211*6dbdd20aSAndroid Build Coastguard Worker } 212*6dbdd20aSAndroid Build Coastguard Worker } 213*6dbdd20aSAndroid Build Coastguard Worker} 214*6dbdd20aSAndroid Build Coastguard Worker 215*6dbdd20aSAndroid Build Coastguard Workertemplate("gcc_like_toolchain") { 216*6dbdd20aSAndroid Build Coastguard Worker toolchain(target_name) { 217*6dbdd20aSAndroid Build Coastguard Worker ar = invoker.ar 218*6dbdd20aSAndroid Build Coastguard Worker cc = invoker.cc 219*6dbdd20aSAndroid Build Coastguard Worker cxx = invoker.cxx 220*6dbdd20aSAndroid Build Coastguard Worker lib_switch = "-l" 221*6dbdd20aSAndroid Build Coastguard Worker lib_dir_switch = "-L" 222*6dbdd20aSAndroid Build Coastguard Worker ld_arg = "" 223*6dbdd20aSAndroid Build Coastguard Worker external_cflags = "" 224*6dbdd20aSAndroid Build Coastguard Worker external_cxxflags = "" 225*6dbdd20aSAndroid Build Coastguard Worker external_ldflags = "" 226*6dbdd20aSAndroid Build Coastguard Worker strip = "" 227*6dbdd20aSAndroid Build Coastguard Worker if (defined(invoker.linker) && invoker.linker != "") { 228*6dbdd20aSAndroid Build Coastguard Worker _invoker_linker = invoker.linker 229*6dbdd20aSAndroid Build Coastguard Worker ld_arg = "-fuse-ld=$_invoker_linker" 230*6dbdd20aSAndroid Build Coastguard Worker } 231*6dbdd20aSAndroid Build Coastguard Worker if (defined(invoker.sysroot) && invoker.sysroot != "") { 232*6dbdd20aSAndroid Build Coastguard Worker _invoker_sysroot = invoker.sysroot 233*6dbdd20aSAndroid Build Coastguard Worker cc = "$cc --sysroot=$_invoker_sysroot" 234*6dbdd20aSAndroid Build Coastguard Worker cxx = "$cxx --sysroot=$_invoker_sysroot" 235*6dbdd20aSAndroid Build Coastguard Worker } 236*6dbdd20aSAndroid Build Coastguard Worker if (defined(invoker.gcc_toolchain) && invoker.gcc_toolchain != "") { 237*6dbdd20aSAndroid Build Coastguard Worker assert(is_clang, "gcc_toolchain can be used only when using clang") 238*6dbdd20aSAndroid Build Coastguard Worker _invoker_gcc_toolchain = invoker.gcc_toolchain 239*6dbdd20aSAndroid Build Coastguard Worker ld_arg = "$ld_arg --gcc-toolchain=$_invoker_gcc_toolchain" 240*6dbdd20aSAndroid Build Coastguard Worker } 241*6dbdd20aSAndroid Build Coastguard Worker if (defined(invoker.external_cflags)) { 242*6dbdd20aSAndroid Build Coastguard Worker external_cflags = invoker.external_cflags 243*6dbdd20aSAndroid Build Coastguard Worker } 244*6dbdd20aSAndroid Build Coastguard Worker if (defined(invoker.external_cxxflags)) { 245*6dbdd20aSAndroid Build Coastguard Worker external_cxxflags = invoker.external_cxxflags 246*6dbdd20aSAndroid Build Coastguard Worker } 247*6dbdd20aSAndroid Build Coastguard Worker if (defined(invoker.external_ldflags)) { 248*6dbdd20aSAndroid Build Coastguard Worker external_ldflags = invoker.external_ldflags 249*6dbdd20aSAndroid Build Coastguard Worker } 250*6dbdd20aSAndroid Build Coastguard Worker if (defined(invoker.strip)) { 251*6dbdd20aSAndroid Build Coastguard Worker strip = invoker.strip 252*6dbdd20aSAndroid Build Coastguard Worker } 253*6dbdd20aSAndroid Build Coastguard Worker 254*6dbdd20aSAndroid Build Coastguard Worker tool("cc") { 255*6dbdd20aSAndroid Build Coastguard Worker depfile = "{{output}}.d" 256*6dbdd20aSAndroid Build Coastguard Worker command = "$cc_wrapper $cc -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_c}} ${external_cflags} -c {{source}} -o {{output}}" 257*6dbdd20aSAndroid Build Coastguard Worker depsformat = "gcc" 258*6dbdd20aSAndroid Build Coastguard Worker outputs = 259*6dbdd20aSAndroid Build Coastguard Worker [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ] 260*6dbdd20aSAndroid Build Coastguard Worker description = "compile {{source}}" 261*6dbdd20aSAndroid Build Coastguard Worker } 262*6dbdd20aSAndroid Build Coastguard Worker 263*6dbdd20aSAndroid Build Coastguard Worker tool("cxx") { 264*6dbdd20aSAndroid Build Coastguard Worker depfile = "{{output}}.d" 265*6dbdd20aSAndroid Build Coastguard Worker command = "$cc_wrapper $cxx -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}} ${external_cflags} ${external_cxxflags} -c {{source}} -o {{output}}" 266*6dbdd20aSAndroid Build Coastguard Worker depsformat = "gcc" 267*6dbdd20aSAndroid Build Coastguard Worker outputs = 268*6dbdd20aSAndroid Build Coastguard Worker [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ] 269*6dbdd20aSAndroid Build Coastguard Worker description = "compile {{source}}" 270*6dbdd20aSAndroid Build Coastguard Worker } 271*6dbdd20aSAndroid Build Coastguard Worker 272*6dbdd20aSAndroid Build Coastguard Worker tool("asm") { 273*6dbdd20aSAndroid Build Coastguard Worker depfile = "{{output}}.d" 274*6dbdd20aSAndroid Build Coastguard Worker command = "$cc_wrapper $cc -MMD -MF $depfile {{defines}} {{include_dirs}} {{asmflags}} -c {{source}} -o {{output}}" 275*6dbdd20aSAndroid Build Coastguard Worker depsformat = "gcc" 276*6dbdd20aSAndroid Build Coastguard Worker outputs = 277*6dbdd20aSAndroid Build Coastguard Worker [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ] 278*6dbdd20aSAndroid Build Coastguard Worker description = "assemble {{source}}" 279*6dbdd20aSAndroid Build Coastguard Worker } 280*6dbdd20aSAndroid Build Coastguard Worker 281*6dbdd20aSAndroid Build Coastguard Worker tool("alink") { 282*6dbdd20aSAndroid Build Coastguard Worker rspfile = "{{output}}.rsp" 283*6dbdd20aSAndroid Build Coastguard Worker if (is_mac && ar != "suppress_unused_ar_variable_warning") { 284*6dbdd20aSAndroid Build Coastguard Worker rspfile_content = "{{inputs_newline}}" 285*6dbdd20aSAndroid Build Coastguard Worker command = "rm -f {{output}} && libtool -static {{arflags}} -o {{output}} -filelist $rspfile" 286*6dbdd20aSAndroid Build Coastguard Worker } else { 287*6dbdd20aSAndroid Build Coastguard Worker rspfile_content = "{{inputs}}" 288*6dbdd20aSAndroid Build Coastguard Worker command = "rm -f {{output}} && $ar rcsD {{output}} @$rspfile" 289*6dbdd20aSAndroid Build Coastguard Worker } 290*6dbdd20aSAndroid Build Coastguard Worker outputs = 291*6dbdd20aSAndroid Build Coastguard Worker [ "{{root_out_dir}}/{{target_output_name}}{{output_extension}}" ] 292*6dbdd20aSAndroid Build Coastguard Worker default_output_extension = ".a" 293*6dbdd20aSAndroid Build Coastguard Worker output_prefix = "lib" 294*6dbdd20aSAndroid Build Coastguard Worker description = "link {{output}}" 295*6dbdd20aSAndroid Build Coastguard Worker } 296*6dbdd20aSAndroid Build Coastguard Worker 297*6dbdd20aSAndroid Build Coastguard Worker tool("solink") { 298*6dbdd20aSAndroid Build Coastguard Worker soname = "{{target_output_name}}{{output_extension}}" 299*6dbdd20aSAndroid Build Coastguard Worker unstripped_so = "{{root_out_dir}}/$soname" 300*6dbdd20aSAndroid Build Coastguard Worker rspfile = "$unstripped_so.rsp" 301*6dbdd20aSAndroid Build Coastguard Worker rspfile_content = "{{inputs}}" 302*6dbdd20aSAndroid Build Coastguard Worker rpath = "-Wl,-soname,$soname" 303*6dbdd20aSAndroid Build Coastguard Worker if (is_mac) { 304*6dbdd20aSAndroid Build Coastguard Worker rpath = "-Wl,-install_name,@rpath/$soname" 305*6dbdd20aSAndroid Build Coastguard Worker } 306*6dbdd20aSAndroid Build Coastguard Worker command = "$cc_wrapper $cxx $ld_arg -shared {{ldflags}} ${external_ldflags} @$rspfile {{solibs}} {{libs}} $rpath -o $unstripped_so" 307*6dbdd20aSAndroid Build Coastguard Worker outputs = [ unstripped_so ] 308*6dbdd20aSAndroid Build Coastguard Worker output_prefix = "lib" 309*6dbdd20aSAndroid Build Coastguard Worker default_output_extension = ".so" 310*6dbdd20aSAndroid Build Coastguard Worker description = "link $unstripped_so" 311*6dbdd20aSAndroid Build Coastguard Worker if (strip != "") { 312*6dbdd20aSAndroid Build Coastguard Worker stripped_so = "{{root_out_dir}}/stripped/$soname" 313*6dbdd20aSAndroid Build Coastguard Worker outputs += [ stripped_so ] 314*6dbdd20aSAndroid Build Coastguard Worker command += " && $strip -o $stripped_so $unstripped_so" 315*6dbdd20aSAndroid Build Coastguard Worker } 316*6dbdd20aSAndroid Build Coastguard Worker } 317*6dbdd20aSAndroid Build Coastguard Worker 318*6dbdd20aSAndroid Build Coastguard Worker tool("link") { 319*6dbdd20aSAndroid Build Coastguard Worker unstripped_exe = 320*6dbdd20aSAndroid Build Coastguard Worker "{{root_out_dir}}/{{target_output_name}}{{output_extension}}" 321*6dbdd20aSAndroid Build Coastguard Worker rspfile = "$unstripped_exe.rsp" 322*6dbdd20aSAndroid Build Coastguard Worker rspfile_content = "{{inputs}}" 323*6dbdd20aSAndroid Build Coastguard Worker command = "$cc_wrapper $cxx $ld_arg {{ldflags}} ${external_ldflags} @$rspfile {{solibs}} {{libs}} -o $unstripped_exe" 324*6dbdd20aSAndroid Build Coastguard Worker outputs = [ unstripped_exe ] 325*6dbdd20aSAndroid Build Coastguard Worker description = "link $unstripped_exe" 326*6dbdd20aSAndroid Build Coastguard Worker if (strip != "") { 327*6dbdd20aSAndroid Build Coastguard Worker stripped_exe = "{{root_out_dir}}/stripped/{{target_output_name}}{{output_extension}}" 328*6dbdd20aSAndroid Build Coastguard Worker outputs += [ stripped_exe ] 329*6dbdd20aSAndroid Build Coastguard Worker command += " && $strip -o $stripped_exe $unstripped_exe" 330*6dbdd20aSAndroid Build Coastguard Worker } 331*6dbdd20aSAndroid Build Coastguard Worker } 332*6dbdd20aSAndroid Build Coastguard Worker 333*6dbdd20aSAndroid Build Coastguard Worker tool("stamp") { 334*6dbdd20aSAndroid Build Coastguard Worker command = "touch {{output}}" 335*6dbdd20aSAndroid Build Coastguard Worker description = "stamp {{output}}" 336*6dbdd20aSAndroid Build Coastguard Worker } 337*6dbdd20aSAndroid Build Coastguard Worker 338*6dbdd20aSAndroid Build Coastguard Worker tool("copy") { 339*6dbdd20aSAndroid Build Coastguard Worker command = "cp -af {{source}} {{output}}" 340*6dbdd20aSAndroid Build Coastguard Worker description = "COPY {{source}} {{output}}" 341*6dbdd20aSAndroid Build Coastguard Worker } 342*6dbdd20aSAndroid Build Coastguard Worker 343*6dbdd20aSAndroid Build Coastguard Worker toolchain_args = { 344*6dbdd20aSAndroid Build Coastguard Worker current_cpu = invoker.cpu 345*6dbdd20aSAndroid Build Coastguard Worker current_os = invoker.os 346*6dbdd20aSAndroid Build Coastguard Worker } 347*6dbdd20aSAndroid Build Coastguard Worker } 348*6dbdd20aSAndroid Build Coastguard Worker} 349*6dbdd20aSAndroid Build Coastguard Worker 350*6dbdd20aSAndroid Build Coastguard Workergcc_like_toolchain("gcc_like") { 351*6dbdd20aSAndroid Build Coastguard Worker cpu = current_cpu 352*6dbdd20aSAndroid Build Coastguard Worker os = current_os 353*6dbdd20aSAndroid Build Coastguard Worker ar = target_ar 354*6dbdd20aSAndroid Build Coastguard Worker cc = target_cc 355*6dbdd20aSAndroid Build Coastguard Worker cxx = target_cxx 356*6dbdd20aSAndroid Build Coastguard Worker linker = target_linker 357*6dbdd20aSAndroid Build Coastguard Worker strip = target_strip 358*6dbdd20aSAndroid Build Coastguard Worker sysroot = target_sysroot 359*6dbdd20aSAndroid Build Coastguard Worker gcc_toolchain = target_gcc_toolchain 360*6dbdd20aSAndroid Build Coastguard Worker external_cflags = string_join(" ", 361*6dbdd20aSAndroid Build Coastguard Worker [ 362*6dbdd20aSAndroid Build Coastguard Worker extra_cflags, 363*6dbdd20aSAndroid Build Coastguard Worker extra_target_cflags, 364*6dbdd20aSAndroid Build Coastguard Worker ]) 365*6dbdd20aSAndroid Build Coastguard Worker external_cxxflags = string_join(" ", 366*6dbdd20aSAndroid Build Coastguard Worker [ 367*6dbdd20aSAndroid Build Coastguard Worker extra_cxxflags, 368*6dbdd20aSAndroid Build Coastguard Worker extra_target_cxxflags, 369*6dbdd20aSAndroid Build Coastguard Worker ]) 370*6dbdd20aSAndroid Build Coastguard Worker external_ldflags = string_join(" ", 371*6dbdd20aSAndroid Build Coastguard Worker [ 372*6dbdd20aSAndroid Build Coastguard Worker extra_ldflags, 373*6dbdd20aSAndroid Build Coastguard Worker extra_target_ldflags, 374*6dbdd20aSAndroid Build Coastguard Worker ]) 375*6dbdd20aSAndroid Build Coastguard Worker} 376*6dbdd20aSAndroid Build Coastguard Worker 377*6dbdd20aSAndroid Build Coastguard Workergcc_like_toolchain("gcc_like_host") { 378*6dbdd20aSAndroid Build Coastguard Worker cpu = host_cpu 379*6dbdd20aSAndroid Build Coastguard Worker os = host_os 380*6dbdd20aSAndroid Build Coastguard Worker ar = ar 381*6dbdd20aSAndroid Build Coastguard Worker cc = cc 382*6dbdd20aSAndroid Build Coastguard Worker cxx = cxx 383*6dbdd20aSAndroid Build Coastguard Worker linker = linker 384*6dbdd20aSAndroid Build Coastguard Worker strip = strip 385*6dbdd20aSAndroid Build Coastguard Worker sysroot = sysroot 386*6dbdd20aSAndroid Build Coastguard Worker gcc_toolchain = gcc_toolchain 387*6dbdd20aSAndroid Build Coastguard Worker external_cflags = string_join(" ", 388*6dbdd20aSAndroid Build Coastguard Worker [ 389*6dbdd20aSAndroid Build Coastguard Worker extra_cflags, 390*6dbdd20aSAndroid Build Coastguard Worker extra_host_cflags, 391*6dbdd20aSAndroid Build Coastguard Worker ]) 392*6dbdd20aSAndroid Build Coastguard Worker external_cxxflags = string_join(" ", 393*6dbdd20aSAndroid Build Coastguard Worker [ 394*6dbdd20aSAndroid Build Coastguard Worker extra_cxxflags, 395*6dbdd20aSAndroid Build Coastguard Worker extra_host_cxxflags, 396*6dbdd20aSAndroid Build Coastguard Worker ]) 397*6dbdd20aSAndroid Build Coastguard Worker external_ldflags = string_join(" ", 398*6dbdd20aSAndroid Build Coastguard Worker [ 399*6dbdd20aSAndroid Build Coastguard Worker extra_ldflags, 400*6dbdd20aSAndroid Build Coastguard Worker extra_host_ldflags, 401*6dbdd20aSAndroid Build Coastguard Worker ]) 402*6dbdd20aSAndroid Build Coastguard Worker} 403*6dbdd20aSAndroid Build Coastguard Worker 404*6dbdd20aSAndroid Build Coastguard Workergcc_like_toolchain("wasm") { 405*6dbdd20aSAndroid Build Coastguard Worker # emsdk_dir and em_config are defined in wasm.gni. 406*6dbdd20aSAndroid Build Coastguard Worker cpu = host_cpu 407*6dbdd20aSAndroid Build Coastguard Worker os = host_os 408*6dbdd20aSAndroid Build Coastguard Worker ar = "$emsdk_dir/emscripten/emar --em-config $em_config" 409*6dbdd20aSAndroid Build Coastguard Worker cc = "$emsdk_dir/emscripten/emcc --em-config $em_config" 410*6dbdd20aSAndroid Build Coastguard Worker cxx = "$emsdk_dir/emscripten/em++ --em-config $em_config" 411*6dbdd20aSAndroid Build Coastguard Worker strip = "" 412*6dbdd20aSAndroid Build Coastguard Worker} 413*6dbdd20aSAndroid Build Coastguard Worker 414*6dbdd20aSAndroid Build Coastguard Worker# This is used both for MSVC anc clang-cl. clang-cl cmdline interface pretends 415*6dbdd20aSAndroid Build Coastguard Worker# to be MSVC's cl.exe. 416*6dbdd20aSAndroid Build Coastguard Workertoolchain("msvc") { 417*6dbdd20aSAndroid Build Coastguard Worker lib_switch = "" 418*6dbdd20aSAndroid Build Coastguard Worker lib_dir_switch = "/LIBPATH:" 419*6dbdd20aSAndroid Build Coastguard Worker sys_lib_flags = string_join(" ", win_msvc_sys_lib_flags) 420*6dbdd20aSAndroid Build Coastguard Worker external_cflags = string_join(" ", 421*6dbdd20aSAndroid Build Coastguard Worker [ 422*6dbdd20aSAndroid Build Coastguard Worker extra_cflags, 423*6dbdd20aSAndroid Build Coastguard Worker extra_host_cflags, 424*6dbdd20aSAndroid Build Coastguard Worker ]) 425*6dbdd20aSAndroid Build Coastguard Worker 426*6dbdd20aSAndroid Build Coastguard Worker # Note: /showIncludes below is required for ninja, to build a complete 427*6dbdd20aSAndroid Build Coastguard Worker # dependency graph for headers. Removing it breaks incremental builds. 428*6dbdd20aSAndroid Build Coastguard Worker 429*6dbdd20aSAndroid Build Coastguard Worker tool("cc") { 430*6dbdd20aSAndroid Build Coastguard Worker precompiled_header_type = "msvc" 431*6dbdd20aSAndroid Build Coastguard Worker pdbname = "{{target_out_dir}}/{{label_name}}_c.pdb" 432*6dbdd20aSAndroid Build Coastguard Worker command = "$cc_wrapper $cc /nologo /showIncludes /FC {{defines}} {{include_dirs}} {{cflags}} {{cflags_c}} ${external_cflags} /c {{source}} /Fo{{output}} /Fd\"$pdbname\" /guard:cf /ZH:SHA_256" 433*6dbdd20aSAndroid Build Coastguard Worker depsformat = "msvc" 434*6dbdd20aSAndroid Build Coastguard Worker outputs = 435*6dbdd20aSAndroid Build Coastguard Worker [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.obj" ] 436*6dbdd20aSAndroid Build Coastguard Worker description = "compile {{source}}" 437*6dbdd20aSAndroid Build Coastguard Worker } 438*6dbdd20aSAndroid Build Coastguard Worker 439*6dbdd20aSAndroid Build Coastguard Worker tool("cxx") { 440*6dbdd20aSAndroid Build Coastguard Worker precompiled_header_type = "msvc" 441*6dbdd20aSAndroid Build Coastguard Worker pdbname = "{{target_out_dir}}/{{label_name}}_c.pdb" 442*6dbdd20aSAndroid Build Coastguard Worker command = "$cc_wrapper $cxx /nologo /showIncludes /FC {{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}} ${external_cflags} /c {{source}} /Fo{{output}} /Fd\"$pdbname\" /guard:cf /ZH:SHA_256" 443*6dbdd20aSAndroid Build Coastguard Worker depsformat = "msvc" 444*6dbdd20aSAndroid Build Coastguard Worker outputs = 445*6dbdd20aSAndroid Build Coastguard Worker [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.obj" ] 446*6dbdd20aSAndroid Build Coastguard Worker description = "compile {{source}}" 447*6dbdd20aSAndroid Build Coastguard Worker } 448*6dbdd20aSAndroid Build Coastguard Worker 449*6dbdd20aSAndroid Build Coastguard Worker tool("alink") { 450*6dbdd20aSAndroid Build Coastguard Worker rspfile = "{{output}}.rsp" 451*6dbdd20aSAndroid Build Coastguard Worker command = "$linker /lib /nologo /ignore:4221 {{arflags}} /OUT:{{output}} @$rspfile" 452*6dbdd20aSAndroid Build Coastguard Worker outputs = [ 453*6dbdd20aSAndroid Build Coastguard Worker # Ignore {{output_extension}} and always use .lib, there's no reason to 454*6dbdd20aSAndroid Build Coastguard Worker # allow targets to override this extension on Windows. 455*6dbdd20aSAndroid Build Coastguard Worker "{{root_out_dir}}/{{target_output_name}}{{output_extension}}", 456*6dbdd20aSAndroid Build Coastguard Worker ] 457*6dbdd20aSAndroid Build Coastguard Worker default_output_extension = ".lib" 458*6dbdd20aSAndroid Build Coastguard Worker default_output_dir = "{{target_out_dir}}" 459*6dbdd20aSAndroid Build Coastguard Worker 460*6dbdd20aSAndroid Build Coastguard Worker # inputs_newline works around a fixed per-line buffer size in the linker. 461*6dbdd20aSAndroid Build Coastguard Worker rspfile_content = "{{inputs_newline}}" 462*6dbdd20aSAndroid Build Coastguard Worker description = "link {{output}}" 463*6dbdd20aSAndroid Build Coastguard Worker } 464*6dbdd20aSAndroid Build Coastguard Worker 465*6dbdd20aSAndroid Build Coastguard Worker tool("solink") { 466*6dbdd20aSAndroid Build Coastguard Worker dllname = "{{output_dir}}/{{target_output_name}}{{output_extension}}" 467*6dbdd20aSAndroid Build Coastguard Worker libname = "${dllname}.lib" 468*6dbdd20aSAndroid Build Coastguard Worker pdbname = "${dllname}.pdb" 469*6dbdd20aSAndroid Build Coastguard Worker rspfile = "${dllname}.rsp" 470*6dbdd20aSAndroid Build Coastguard Worker 471*6dbdd20aSAndroid Build Coastguard Worker command = "$linker /nologo /IMPLIB:$libname ${sys_lib_flags} /DLL /OUT:$dllname /PDB:$pdbname @$rspfile" 472*6dbdd20aSAndroid Build Coastguard Worker outputs = [ 473*6dbdd20aSAndroid Build Coastguard Worker dllname, 474*6dbdd20aSAndroid Build Coastguard Worker libname, 475*6dbdd20aSAndroid Build Coastguard Worker pdbname, 476*6dbdd20aSAndroid Build Coastguard Worker ] 477*6dbdd20aSAndroid Build Coastguard Worker default_output_extension = ".dll" 478*6dbdd20aSAndroid Build Coastguard Worker default_output_dir = "{{root_out_dir}}" 479*6dbdd20aSAndroid Build Coastguard Worker 480*6dbdd20aSAndroid Build Coastguard Worker link_output = libname 481*6dbdd20aSAndroid Build Coastguard Worker depend_output = libname 482*6dbdd20aSAndroid Build Coastguard Worker runtime_outputs = [ 483*6dbdd20aSAndroid Build Coastguard Worker dllname, 484*6dbdd20aSAndroid Build Coastguard Worker pdbname, 485*6dbdd20aSAndroid Build Coastguard Worker ] 486*6dbdd20aSAndroid Build Coastguard Worker 487*6dbdd20aSAndroid Build Coastguard Worker # Since the above commands only updates the .lib file when it changes, ask 488*6dbdd20aSAndroid Build Coastguard Worker # Ninja to check if the timestamp actually changed to know if downstream 489*6dbdd20aSAndroid Build Coastguard Worker # dependencies should be recompiled. 490*6dbdd20aSAndroid Build Coastguard Worker restat = true 491*6dbdd20aSAndroid Build Coastguard Worker 492*6dbdd20aSAndroid Build Coastguard Worker # inputs_newline works around a fixed per-line buffer size in the linker. 493*6dbdd20aSAndroid Build Coastguard Worker rspfile_content = "{{inputs_newline}} {{libs}} {{solibs}} {{ldflags}}" 494*6dbdd20aSAndroid Build Coastguard Worker description = "link {{output}}" 495*6dbdd20aSAndroid Build Coastguard Worker } 496*6dbdd20aSAndroid Build Coastguard Worker 497*6dbdd20aSAndroid Build Coastguard Worker tool("link") { 498*6dbdd20aSAndroid Build Coastguard Worker exename = "{{root_out_dir}}/{{target_output_name}}{{output_extension}}" 499*6dbdd20aSAndroid Build Coastguard Worker pdbname = "$exename.pdb" 500*6dbdd20aSAndroid Build Coastguard Worker rspfile = "$exename.rsp" 501*6dbdd20aSAndroid Build Coastguard Worker 502*6dbdd20aSAndroid Build Coastguard Worker command = "$linker /nologo /guard:cf /DYNAMICBASE /OUT:$exename ${sys_lib_flags} /DEBUG /PDB:$pdbname @$rspfile" 503*6dbdd20aSAndroid Build Coastguard Worker default_output_extension = ".exe" 504*6dbdd20aSAndroid Build Coastguard Worker default_output_dir = "{{root_out_dir}}" 505*6dbdd20aSAndroid Build Coastguard Worker outputs = [ exename ] 506*6dbdd20aSAndroid Build Coastguard Worker 507*6dbdd20aSAndroid Build Coastguard Worker # inputs_newline works around a fixed per-line buffer size in the linker. 508*6dbdd20aSAndroid Build Coastguard Worker rspfile_content = "{{inputs_newline}} {{libs}} {{solibs}} {{ldflags}}" 509*6dbdd20aSAndroid Build Coastguard Worker description = "link {{output}}" 510*6dbdd20aSAndroid Build Coastguard Worker } 511*6dbdd20aSAndroid Build Coastguard Worker 512*6dbdd20aSAndroid Build Coastguard Worker tool("stamp") { 513*6dbdd20aSAndroid Build Coastguard Worker command = "cmd /c type nul > \"{{output}}\"" 514*6dbdd20aSAndroid Build Coastguard Worker description = "stamp {{output}}" 515*6dbdd20aSAndroid Build Coastguard Worker } 516*6dbdd20aSAndroid Build Coastguard Worker 517*6dbdd20aSAndroid Build Coastguard Worker tool("copy") { 518*6dbdd20aSAndroid Build Coastguard Worker cp_py = rebase_path("../cp.py") 519*6dbdd20aSAndroid Build Coastguard Worker command = "cmd.exe /c python \"$cp_py\" {{source}} {{output}}" 520*6dbdd20aSAndroid Build Coastguard Worker description = "copy {{source}} {{output}}" 521*6dbdd20aSAndroid Build Coastguard Worker } 522*6dbdd20aSAndroid Build Coastguard Worker} 523