[toolchain] Packaging llvm-lib.exe for WASM builds (#36708)
This PR is part of a broader work to get the WASM build to use the build tools it is expected to use: the ones provided as part of the Chromium sync, the ones provided as hermetic if any, and the ones in the rust wasm toolchain. This change adds `llvm-lib.exe` to the rust wasm toolchain packaging, so we can have a proper librarian on Windows, which will make the build gn source simpler than if we use `lld-link.exe` as the AR. Bug: https://github.com/brave/brave-browser/issues/55812
This commit is contained in:
@@ -82,6 +82,14 @@ LLD = 'lld' + ('.exe' if sys.platform == 'win32' else '')
|
|||||||
# Name under which the LLD binary is stored inside the output archive.
|
# Name under which the LLD binary is stored inside the output archive.
|
||||||
RUST_LLD = f'rust-{LLD}'
|
RUST_LLD = f'rust-{LLD}'
|
||||||
|
|
||||||
|
# Filename of the standalone MSVC-style librarian produced by the LLVM build.
|
||||||
|
# Shipped (Windows only) so that `cc-rs`-driven cargo invocations have an AR
|
||||||
|
# they can call directly without flag-injection workarounds. Chromium's
|
||||||
|
# distributed clang package strips this (see tools/clang/scripts/package.py),
|
||||||
|
# but RUST_HOST_LLVM_INSTALL_DIR has it. Mirrors what upstream
|
||||||
|
# tools/rust/config.toml.template references via `$LLVM_BIN/llvm-lib.exe`.
|
||||||
|
LLVM_LIB = 'llvm-lib.exe'
|
||||||
|
|
||||||
# Rust target triple for the bare-metal WebAssembly target. Included in the
|
# Rust target triple for the bare-metal WebAssembly target. Included in the
|
||||||
# build so that Chromium can compile Rust code targeting WebAssembly.
|
# build so that Chromium can compile Rust code targeting WebAssembly.
|
||||||
WASM32_UNKNOWN_UNKNOWN = 'wasm32-unknown-unknown'
|
WASM32_UNKNOWN_UNKNOWN = 'wasm32-unknown-unknown'
|
||||||
@@ -417,8 +425,7 @@ class ToolchainBuilder:
|
|||||||
def _create_archive(self):
|
def _create_archive(self):
|
||||||
"""Write the output .tar.xz archive to `self.out_dir`.
|
"""Write the output .tar.xz archive to `self.out_dir`.
|
||||||
|
|
||||||
The archive (named via `_package_name()`) contains exactly two
|
The archive (named via `_package_name()`) contains:
|
||||||
entries:
|
|
||||||
|
|
||||||
* `rust-lld` — the LLD linker binary from
|
* `rust-lld` — the LLD linker binary from
|
||||||
`RUST_HOST_LLVM_INSTALL_DIR/bin/lld[.exe]`. Rust's toolchain
|
`RUST_HOST_LLVM_INSTALL_DIR/bin/lld[.exe]`. Rust's toolchain
|
||||||
@@ -430,19 +437,27 @@ class ToolchainBuilder:
|
|||||||
This directory contains the precompiled `core`, `alloc`, and
|
This directory contains the precompiled `core`, `alloc`, and
|
||||||
`std` libraries needed to compile Rust code for the bare-metal
|
`std` libraries needed to compile Rust code for the bare-metal
|
||||||
WebAssembly target.
|
WebAssembly target.
|
||||||
|
* `llvm-lib.exe` (Windows only) — the standalone MSVC-style
|
||||||
|
librarian from `RUST_HOST_LLVM_INSTALL_DIR/bin/llvm-lib.exe`.
|
||||||
|
Shipping this binary allows us to point AR straight at it,
|
||||||
|
matching the upstream `tools/rust/config.toml.template` pattern
|
||||||
|
(`ar = "$LLVM_BIN/llvm-lib.exe"`).
|
||||||
"""
|
"""
|
||||||
target_triple = self.build_rust_module.RustTargetTriple()
|
target_triple = self.build_rust_module.RustTargetTriple()
|
||||||
stage1_output_path = (Path(self.build_rust_module.RUST_BUILD_DIR) /
|
stage1_output_path = (Path(self.build_rust_module.RUST_BUILD_DIR) /
|
||||||
target_triple / STAGE1_RUSTLIB)
|
target_triple / STAGE1_RUSTLIB)
|
||||||
output_archive = self.out_dir / self._package_name()
|
output_archive = self.out_dir / self._package_name()
|
||||||
|
|
||||||
|
llvm_bin = Path(
|
||||||
|
self.build_rust_module.RUST_HOST_LLVM_INSTALL_DIR) / 'bin'
|
||||||
|
|
||||||
logging.info('Creating output archive at %s', output_archive)
|
logging.info('Creating output archive at %s', output_archive)
|
||||||
with tarfile.open(output_archive, 'w:xz') as tar:
|
with tarfile.open(output_archive, 'w:xz') as tar:
|
||||||
tar.add(Path(self.build_rust_module.RUST_HOST_LLVM_INSTALL_DIR) /
|
tar.add(llvm_bin / LLD, arcname=RUST_LLD)
|
||||||
'bin' / LLD,
|
|
||||||
arcname=RUST_LLD)
|
|
||||||
tar.add(stage1_output_path / WASM32_UNKNOWN_UNKNOWN,
|
tar.add(stage1_output_path / WASM32_UNKNOWN_UNKNOWN,
|
||||||
arcname=WASM32_UNKNOWN_UNKNOWN)
|
arcname=WASM32_UNKNOWN_UNKNOWN)
|
||||||
|
if sys.platform == 'win32':
|
||||||
|
tar.add(llvm_bin / LLVM_LIB, arcname=LLVM_LIB)
|
||||||
|
|
||||||
def _bootstrap_depot_tools(self):
|
def _bootstrap_depot_tools(self):
|
||||||
"""Ensure `depot_tools` is on PATH if no existing install is found.
|
"""Ensure `depot_tools` is on PATH if no existing install is found.
|
||||||
|
|||||||
Reference in New Issue
Block a user