diff options
Diffstat (limited to 'pw_toolchain/clang_tools.gni')
-rw-r--r-- | pw_toolchain/clang_tools.gni | 88 |
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) { |