xref: /aosp_15_r20/external/perfetto/gn/standalone/toolchain/BUILD.gn (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
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