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