aboutsummaryrefslogtreecommitdiff
path: root/pw_toolchain/clang_tools.gni
diff options
context:
space:
mode:
Diffstat (limited to 'pw_toolchain/clang_tools.gni')
-rw-r--r--pw_toolchain/clang_tools.gni88
1 files changed, 75 insertions, 13 deletions
diff --git a/pw_toolchain/clang_tools.gni b/pw_toolchain/clang_tools.gni
index 56796f4e4..5b438a594 100644
--- a/pw_toolchain/clang_tools.gni
+++ b/pw_toolchain/clang_tools.gni
@@ -15,17 +15,54 @@ import("//build_overrides/pigweed.gni")
import("//build_overrides/pigweed_environment.gni")
import("$dir_pw_toolchain/rbe.gni")
+_default_llvm_prefix = ""
+_default_rust_prefix = ""
+
+# If Pigweed's CIPD environment setup was run, assume a LLVM toolchain and Rust
+# compiler are present there.
+if (defined(pw_env_setup_CIPD_PIGWEED)) {
+ _default_llvm_prefix = pw_env_setup_CIPD_PIGWEED + "/bin/"
+ _default_rust_prefix = pw_env_setup_CIPD_PIGWEED + "/bin/"
+}
+
declare_args() {
- # This flag allows you to specify the root directory of the clang, clang++,
+ # This flag allows you to specify a prefix to use for clang, clang++,
# and llvm-ar binaries to use when compiling with a clang-based toolchain.
# This is useful for debugging toolchain-related issues by building with an
# externally-provided toolchain.
- pw_toolchain_CLANG_PREFIX =
- rebase_path(pw_env_setup_CIPD_PIGWEED + "/bin/", root_build_dir)
+ #
+ # Pigweed toolchains should NOT override this variable so projects or users
+ # can control it via `.gn` or by setting it as a regular gn argument (e.g.
+ # `gn gen --args='pw_toolchain_CLANG_PREFIX=/path/to/my-llvm-'`).
+ #
+ # Examples:
+ # pw_toolchain_CLANG_PREFIX = ""
+ # command: "clang" (from PATH)
+ #
+ # pw_toolchain_CLANG_PREFIX = "my-"
+ # command: "my-clang" (from PATH)
+ #
+ # pw_toolchain_CLANG_PREFIX = "/bin/my-"
+ # command: "/bin/my-clang" (absolute path)
+ #
+ # pw_toolchain_CLANG_PREFIX = "//environment/clang_next/"
+ # command: "../environment/clang_next/clang" (relative path)
+ #
+ # GN templates should use `pw_toolchain_clang_tools.*` to get the intended
+ # command string rather than relying directly on pw_toolchain_CLANG_PREFIX.
+ #
+ # If the prefix begins with "//", it will be rebased to be relative to the
+ # root build directory.
+ pw_toolchain_CLANG_PREFIX = _default_llvm_prefix
- # This flag allows you to specify the root directory of the rustc binary.
- pw_toolchain_RUST_PREFIX =
- rebase_path(pw_env_setup_CIPD_PIGWEED + "/rust/bin/", root_build_dir)
+ # This flag allows you to specify a prefix for rustc.
+ #
+ # This follows the same rules as pw_toolchain_CLANG_PREFIX, see above for
+ # more information.
+ #
+ # If the prefix begins with "//", it will be rebased to be relative to the
+ # root build directory.
+ pw_toolchain_RUST_PREFIX = _default_rust_prefix
}
pw_toolchain_clang_tools = {
@@ -33,17 +70,42 @@ pw_toolchain_clang_tools = {
cc = "clang"
cxx = "clang++"
ld = cxx
+ llvm_cov = "llvm-cov"
+ llvm_profdata = "llvm-profdata"
rustc = "rustc"
- if (pw_toolchain_CLANG_PREFIX != "") {
- ar = pw_toolchain_CLANG_PREFIX + ar
- cc = pw_toolchain_CLANG_PREFIX + cc
- cxx = pw_toolchain_CLANG_PREFIX + cxx
- ld = pw_toolchain_CLANG_PREFIX + ld
+ _toolchain_prefix = pw_toolchain_CLANG_PREFIX
+ if (_toolchain_prefix != "") {
+ # If the prefix is a GN-absolute path, rebase it so it's relative to the
+ # root of the build directory.
+ _split_prefix = string_split(_toolchain_prefix, "//")
+ if (_split_prefix[0] == "") {
+ _toolchain_prefix = rebase_path(_toolchain_prefix, root_build_dir)
+ }
+ if (host_os == "win") {
+ _toolchain_prefix = "./" + _toolchain_prefix
+ _toolchain_prefix = string_replace(_toolchain_prefix, "/", "\\")
+ }
+ ar = _toolchain_prefix + ar
+ cc = _toolchain_prefix + cc
+ cxx = _toolchain_prefix + cxx
+ ld = _toolchain_prefix + ld
+ llvm_cov = _toolchain_prefix + llvm_cov
+ llvm_profdata = _toolchain_prefix + llvm_profdata
}
- if (pw_toolchain_RUST_PREFIX != "") {
- rustc = pw_toolchain_RUST_PREFIX + rustc
+ _rust_prefix = pw_toolchain_RUST_PREFIX
+ if (host_os == "win") {
+ _rust_prefix = string_replace(_rust_prefix, "/", "\\")
+ }
+ if (_rust_prefix != "") {
+ # If the prefix is a GN-absolute path, rebase it so it's relative to the
+ # root of the build directory.
+ _split_rust_prefix = string_split(_rust_prefix, "//")
+ if (_split_rust_prefix[0] == "") {
+ _rust_prefix = rebase_path(_rust_prefix, root_build_dir)
+ }
+ rustc = _rust_prefix + rustc
}
if (pw_toolchain_USE_RBE) {