xref: /aosp_15_r20/external/pigweed/pw_toolchain/clang_tools.gni (revision 61c4878ac05f98d0ceed94b57d316916de578985)
1*61c4878aSAndroid Build Coastguard Worker# Copyright 2021 The Pigweed Authors
2*61c4878aSAndroid Build Coastguard Worker#
3*61c4878aSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); you may not
4*61c4878aSAndroid Build Coastguard Worker# use this file except in compliance with the License. You may obtain a copy of
5*61c4878aSAndroid Build Coastguard Worker# the License at
6*61c4878aSAndroid Build Coastguard Worker#
7*61c4878aSAndroid Build Coastguard Worker#     https://www.apache.org/licenses/LICENSE-2.0
8*61c4878aSAndroid Build Coastguard Worker#
9*61c4878aSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
10*61c4878aSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11*61c4878aSAndroid Build Coastguard Worker# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12*61c4878aSAndroid Build Coastguard Worker# License for the specific language governing permissions and limitations under
13*61c4878aSAndroid Build Coastguard Worker# the License.
14*61c4878aSAndroid Build Coastguard Workerimport("//build_overrides/pigweed.gni")
15*61c4878aSAndroid Build Coastguard Workerimport("//build_overrides/pigweed_environment.gni")
16*61c4878aSAndroid Build Coastguard Workerimport("$dir_pw_toolchain/rbe.gni")
17*61c4878aSAndroid Build Coastguard Worker
18*61c4878aSAndroid Build Coastguard Worker_default_llvm_prefix = ""
19*61c4878aSAndroid Build Coastguard Worker_default_rust_prefix = ""
20*61c4878aSAndroid Build Coastguard Worker
21*61c4878aSAndroid Build Coastguard Worker# If Pigweed's CIPD environment setup was run, assume a LLVM toolchain and Rust
22*61c4878aSAndroid Build Coastguard Worker# compiler are present there.
23*61c4878aSAndroid Build Coastguard Workerif (defined(pw_env_setup_CIPD_PIGWEED)) {
24*61c4878aSAndroid Build Coastguard Worker  _default_llvm_prefix = pw_env_setup_CIPD_PIGWEED + "/bin/"
25*61c4878aSAndroid Build Coastguard Worker  _default_rust_prefix = pw_env_setup_CIPD_PIGWEED + "/rust/bin/"
26*61c4878aSAndroid Build Coastguard Worker}
27*61c4878aSAndroid Build Coastguard Worker
28*61c4878aSAndroid Build Coastguard Workerdeclare_args() {
29*61c4878aSAndroid Build Coastguard Worker  # This flag allows you to specify a prefix to use for clang, clang++,
30*61c4878aSAndroid Build Coastguard Worker  # and llvm-ar binaries to use when compiling with a clang-based toolchain.
31*61c4878aSAndroid Build Coastguard Worker  # This is useful for debugging toolchain-related issues by building with an
32*61c4878aSAndroid Build Coastguard Worker  # externally-provided toolchain.
33*61c4878aSAndroid Build Coastguard Worker  #
34*61c4878aSAndroid Build Coastguard Worker  # Pigweed toolchains should NOT override this variable so projects or users
35*61c4878aSAndroid Build Coastguard Worker  # can control it via `.gn` or by setting it as a regular gn argument (e.g.
36*61c4878aSAndroid Build Coastguard Worker  # `gn gen --args='pw_toolchain_CLANG_PREFIX=/path/to/my-llvm-'`).
37*61c4878aSAndroid Build Coastguard Worker  #
38*61c4878aSAndroid Build Coastguard Worker  # Examples:
39*61c4878aSAndroid Build Coastguard Worker  #   pw_toolchain_CLANG_PREFIX = ""
40*61c4878aSAndroid Build Coastguard Worker  #   command: "clang" (from PATH)
41*61c4878aSAndroid Build Coastguard Worker  #
42*61c4878aSAndroid Build Coastguard Worker  #   pw_toolchain_CLANG_PREFIX = "my-"
43*61c4878aSAndroid Build Coastguard Worker  #   command: "my-clang" (from PATH)
44*61c4878aSAndroid Build Coastguard Worker  #
45*61c4878aSAndroid Build Coastguard Worker  #   pw_toolchain_CLANG_PREFIX = "/bin/my-"
46*61c4878aSAndroid Build Coastguard Worker  #   command: "/bin/my-clang" (absolute path)
47*61c4878aSAndroid Build Coastguard Worker  #
48*61c4878aSAndroid Build Coastguard Worker  #   pw_toolchain_CLANG_PREFIX = "//environment/clang_next/"
49*61c4878aSAndroid Build Coastguard Worker  #   command: "../environment/clang_next/clang" (relative path)
50*61c4878aSAndroid Build Coastguard Worker  #
51*61c4878aSAndroid Build Coastguard Worker  # GN templates should use `pw_toolchain_clang_tools.*` to get the intended
52*61c4878aSAndroid Build Coastguard Worker  # command string rather than relying directly on pw_toolchain_CLANG_PREFIX.
53*61c4878aSAndroid Build Coastguard Worker  #
54*61c4878aSAndroid Build Coastguard Worker  # If the prefix begins with "//", it will be rebased to be relative to the
55*61c4878aSAndroid Build Coastguard Worker  # root build directory.
56*61c4878aSAndroid Build Coastguard Worker  pw_toolchain_CLANG_PREFIX = _default_llvm_prefix
57*61c4878aSAndroid Build Coastguard Worker
58*61c4878aSAndroid Build Coastguard Worker  # This flag allows you to specify a prefix for rustc.
59*61c4878aSAndroid Build Coastguard Worker  #
60*61c4878aSAndroid Build Coastguard Worker  # This follows the same rules as pw_toolchain_CLANG_PREFIX, see above for
61*61c4878aSAndroid Build Coastguard Worker  # more information.
62*61c4878aSAndroid Build Coastguard Worker  #
63*61c4878aSAndroid Build Coastguard Worker  # If the prefix begins with "//", it will be rebased to be relative to the
64*61c4878aSAndroid Build Coastguard Worker  # root build directory.
65*61c4878aSAndroid Build Coastguard Worker  pw_toolchain_RUST_PREFIX = _default_rust_prefix
66*61c4878aSAndroid Build Coastguard Worker}
67*61c4878aSAndroid Build Coastguard Worker
68*61c4878aSAndroid Build Coastguard Workerpw_toolchain_clang_tools = {
69*61c4878aSAndroid Build Coastguard Worker  ar = "llvm-ar"
70*61c4878aSAndroid Build Coastguard Worker  cc = "clang"
71*61c4878aSAndroid Build Coastguard Worker  cxx = "clang++"
72*61c4878aSAndroid Build Coastguard Worker  ld = cxx
73*61c4878aSAndroid Build Coastguard Worker  llvm_cov = "llvm-cov"
74*61c4878aSAndroid Build Coastguard Worker  llvm_profdata = "llvm-profdata"
75*61c4878aSAndroid Build Coastguard Worker  rustc = "rustc"
76*61c4878aSAndroid Build Coastguard Worker
77*61c4878aSAndroid Build Coastguard Worker  _toolchain_prefix = pw_toolchain_CLANG_PREFIX
78*61c4878aSAndroid Build Coastguard Worker  if (_toolchain_prefix != "") {
79*61c4878aSAndroid Build Coastguard Worker    # If the prefix is a GN-absolute path, rebase it so it's relative to the
80*61c4878aSAndroid Build Coastguard Worker    # root of the build directory.
81*61c4878aSAndroid Build Coastguard Worker    _split_prefix = string_split(_toolchain_prefix, "//")
82*61c4878aSAndroid Build Coastguard Worker    if (_split_prefix[0] == "") {
83*61c4878aSAndroid Build Coastguard Worker      _toolchain_prefix = rebase_path(_toolchain_prefix, root_build_dir)
84*61c4878aSAndroid Build Coastguard Worker    }
85*61c4878aSAndroid Build Coastguard Worker    if (host_os == "win") {
86*61c4878aSAndroid Build Coastguard Worker      _toolchain_prefix = "./" + _toolchain_prefix
87*61c4878aSAndroid Build Coastguard Worker      _toolchain_prefix = string_replace(_toolchain_prefix, "/", "\\")
88*61c4878aSAndroid Build Coastguard Worker    }
89*61c4878aSAndroid Build Coastguard Worker    ar = _toolchain_prefix + ar
90*61c4878aSAndroid Build Coastguard Worker    cc = _toolchain_prefix + cc
91*61c4878aSAndroid Build Coastguard Worker    cxx = _toolchain_prefix + cxx
92*61c4878aSAndroid Build Coastguard Worker    ld = _toolchain_prefix + ld
93*61c4878aSAndroid Build Coastguard Worker    llvm_cov = _toolchain_prefix + llvm_cov
94*61c4878aSAndroid Build Coastguard Worker    llvm_profdata = _toolchain_prefix + llvm_profdata
95*61c4878aSAndroid Build Coastguard Worker  }
96*61c4878aSAndroid Build Coastguard Worker
97*61c4878aSAndroid Build Coastguard Worker  _rust_prefix = pw_toolchain_RUST_PREFIX
98*61c4878aSAndroid Build Coastguard Worker  if (host_os == "win") {
99*61c4878aSAndroid Build Coastguard Worker    _rust_prefix = string_replace(_rust_prefix, "/", "\\")
100*61c4878aSAndroid Build Coastguard Worker  }
101*61c4878aSAndroid Build Coastguard Worker  if (_rust_prefix != "") {
102*61c4878aSAndroid Build Coastguard Worker    # If the prefix is a GN-absolute path, rebase it so it's relative to the
103*61c4878aSAndroid Build Coastguard Worker    # root of the build directory.
104*61c4878aSAndroid Build Coastguard Worker    _split_rust_prefix = string_split(_rust_prefix, "//")
105*61c4878aSAndroid Build Coastguard Worker    if (_split_rust_prefix[0] == "") {
106*61c4878aSAndroid Build Coastguard Worker      _rust_prefix = rebase_path(_rust_prefix, root_build_dir)
107*61c4878aSAndroid Build Coastguard Worker    }
108*61c4878aSAndroid Build Coastguard Worker    rustc = _rust_prefix + rustc
109*61c4878aSAndroid Build Coastguard Worker  }
110*61c4878aSAndroid Build Coastguard Worker
111*61c4878aSAndroid Build Coastguard Worker  if (pw_toolchain_USE_RBE) {
112*61c4878aSAndroid Build Coastguard Worker    _rbe_debug_flag = ""
113*61c4878aSAndroid Build Coastguard Worker    if (pw_toolchain_RBE_DEBUG) {
114*61c4878aSAndroid Build Coastguard Worker      _rbe_debug_flag = " -v"
115*61c4878aSAndroid Build Coastguard Worker    }
116*61c4878aSAndroid Build Coastguard Worker    _exec_root = rebase_path("//")
117*61c4878aSAndroid Build Coastguard Worker    _rewrapper_binary = "rewrapper"
118*61c4878aSAndroid Build Coastguard Worker    _pw_rbe_config = pw_rbe_clang_config
119*61c4878aSAndroid Build Coastguard Worker    _rbe_toolchain_prefix =
120*61c4878aSAndroid Build Coastguard Worker        _rewrapper_binary +
121*61c4878aSAndroid Build Coastguard Worker        " --labels=type=compile,lang=cpp,compiler=clang --cfg=" +
122*61c4878aSAndroid Build Coastguard Worker        _pw_rbe_config + " --exec_root=" + _exec_root + " -- "
123*61c4878aSAndroid Build Coastguard Worker
124*61c4878aSAndroid Build Coastguard Worker    cc = _rbe_toolchain_prefix + cc + _rbe_debug_flag
125*61c4878aSAndroid Build Coastguard Worker    cxx = _rbe_toolchain_prefix + cxx + _rbe_debug_flag
126*61c4878aSAndroid Build Coastguard Worker  }
127*61c4878aSAndroid Build Coastguard Worker}
128