Skip to content

Commit

Permalink
chromium: Depend on libstd-rs instead of rust
Browse files Browse the repository at this point in the history
Fixes OSSystems#792.

Build and patch changes:
------------------------

In OSSystems#782, we decided to depend on rust instead of libstd-rs, because the
latter didn't include libprofiler_builtins and also used a naming scheme
that trips up Chromium.

However, in OSSystems#791 we decided to patch Chromium so that it doesn't need
libprofiler_builtins any more, because the master version of the rust
recipe also doesn't include it.

Finally, while investigating OSSystems#792 it turned out that our approach breaks
as soon as we have something that depends on libstd-rs in our dependency
graph. In that scenario, both libstd-rs and rust (the latter due to our
bbappend file) install Rust libraries to /usr/lib/rustlib. This first
leads to Chromium build system errors (due to libstd-rs's naming
scheme), and after fixing these to Rust compiler errors due to multiple
versions being present.

The conclusion is now that we can depend on libstd-rs we should do so.
This only requires a small change to Chromium's Rust build scripts to
adapt them to the slightly different naming scheme.

License changes:
----------------

Added licenses: none.

Removed licenses: none.

Updated licenses: none.

Test-built:
-----------

* chromium-wayland:
 - nanbield, clang, MACHINE=qemuarm64

* chromium-x11:
 - master, clang,   MACHINE=qemuarm

Signed-off-by: Max Ihlenfeldt <max@igalia.com>
  • Loading branch information
MaxIhlenfeldt committed May 8, 2024
1 parent ab76411 commit ae6d371
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 26 deletions.
2 changes: 1 addition & 1 deletion meta-chromium/recipes-browser/chromium/chromium-gn.inc
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ DEPENDS += " \
jpeg \
libdrm \
libffi \
libstd-rs \
libwebp \
libxkbcommon \
libxslt \
Expand All @@ -86,7 +87,6 @@ DEPENDS += " \
pkgconfig-native \
${@bb.utils.contains('DISTRO_FEATURES', 'pulseaudio', 'pulseaudio', '', d)} \
qemu-native \
rust \
rust-native \
virtual/libgl \
"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,11 @@ Signed-off-by: Max Ihlenfeldt <max@igalia.com>
build/config/rust.gni | 24 +++++++++++++++++------
build/rust/rustc_wrapper.py | 1 +
build/rust/std/BUILD.gn | 33 ++++++++++++++++++++++++--------
build/rust/std/find_std_rlibs.py | 13 ++++++++++---
4 files changed, 54 insertions(+), 17 deletions(-)
build/rust/std/find_std_rlibs.py | 17 +++++++++++-----
4 files changed, 56 insertions(+), 19 deletions(-)

diff --git a/build/config/rust.gni b/build/config/rust.gni
index e98d913..6213b72 100644
index e98d9139f65a9..6213b728e6d70 100644
--- a/build/config/rust.gni
+++ b/build/config/rust.gni
@@ -87,6 +87,11 @@ declare_args() {
Expand Down Expand Up @@ -79,7 +79,7 @@ index e98d913..6213b72 100644
} else if (is_android) {
import("//build/config/android/abi.gni")
diff --git a/build/rust/rustc_wrapper.py b/build/rust/rustc_wrapper.py
index b8e490d..d22cf08 100755
index b8e490da27f2d..d22cf08aadf1d 100755
--- a/build/rust/rustc_wrapper.py
+++ b/build/rust/rustc_wrapper.py
@@ -160,6 +160,7 @@ def main():
Expand All @@ -91,7 +91,7 @@ index b8e490d..d22cf08 100755
abs_build_root = os.getcwd().replace('\\', '/') + '/'
is_windows = sys.platform == 'win32' or args.target_windows
diff --git a/build/rust/std/BUILD.gn b/build/rust/std/BUILD.gn
index 77f4b8c..8a25798 100644
index 77f4b8c38d76f..8a25798f9158d 100644
--- a/build/rust/std/BUILD.gn
+++ b/build/rust/std/BUILD.gn
@@ -188,7 +188,8 @@ if (toolchain_has_rust) {
Expand Down Expand Up @@ -166,9 +166,18 @@ index 77f4b8c..8a25798 100644
# The host builds tools toolchain supports Rust only and does not use
# the allocator remapping to point it to PartitionAlloc.
diff --git a/build/rust/std/find_std_rlibs.py b/build/rust/std/find_std_rlibs.py
index 386258f..25fdedc 100755
index 386258f890c01..3bb6a41a40c56 100755
--- a/build/rust/std/find_std_rlibs.py
+++ b/build/rust/std/find_std_rlibs.py
@@ -17,7 +17,7 @@ import re
from collections import defaultdict

EXPECTED_STDLIB_INPUT_REGEX = re.compile(r"([0-9a-z_]+)(?:-([0-9]+))?$")
-RLIB_NAME_REGEX = re.compile(r"lib([0-9a-z_]+)-([0-9a-f]+)\.rlib$")
+RLIB_NAME_REGEX = re.compile(r"lib([0-9a-z_]+)(-([0-9a-f]+))?\.rlib$")


def main():
@@ -52,6 +52,8 @@ def main():
rustc_args.extend(["--target", args.target])
rustlib_dir = subprocess.check_output(rustc_args).rstrip().decode()
Expand All @@ -187,6 +196,15 @@ index 386258f..25fdedc 100755

def copy_file(infile, outfile):
depfile.write(f" {infile}")
@@ -99,7 +101,7 @@ def main():
# the correct file path to our linker invocations, we don't need
# that, and it would prevent us having the predictable filenames
# which we need for statically computable gn dependency rules.
- (crate_name, metadata) = RLIB_NAME_REGEX.match(f).group(1, 2)
+ (crate_name, metadata) = RLIB_NAME_REGEX.match(f).group(1, 3)

# Use the number of times we've seen this name to disambiguate the output
# filenames. Since we sort the input filenames including the metadata,
@@ -117,14 +119,19 @@ def main():
output_filename = f"lib{concise_name}.rlib"

Expand Down
9 changes: 9 additions & 0 deletions meta-chromium/recipes-browser/chromium/libstd-rs_%.bbappend
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
FILES:${PN} += "${libdir}/rustlib/*/target.json"

# Without this, rustc fails with "could not find specification for target ...".
do_install:append() {
target_dir=`realpath ${D}${rustlibdir}/..`
target_triple=`basename ${target_dir}`
target_json="${target_dir}/target.json"
RUSTC_BOOTSTRAP=1 rustc -Z unstable-options --print target-spec-json --target "${target_triple}" > "${target_json}"
}
19 changes: 0 additions & 19 deletions meta-chromium/recipes-browser/chromium/rust_%.bbappend
Original file line number Diff line number Diff line change
Expand Up @@ -5,22 +5,3 @@
rust_do_install:append() {
install -m 0644 ${WORKDIR}/rust-targets/${RUST_TARGET_SYS}.json ${D}${libdir}/rustlib/${RUST_TARGET_SYS}/target.json
}

# This makes sure that all .rlib files that Chromium needs get installed. The
# libraries installed by libstd-rs don't include e.g. libprofiler_builtins.
# Additionally, libstd and libtest installed by libstd-rs don't follow the usual
# naming scheme, which would trip up Chromium.
rust_do_install:class-target:append() {
mkdir -p _dist
rlib_path="rust-std-${PV}-${RUST_TARGET_SYS}/rust-std-${RUST_TARGET_SYS}/lib/rustlib"
tar -C _dist -xf build/dist/rust-std-${PV}-${RUST_TARGET_SYS}.tar.xz $rlib_path

target_dir=${D}${libdir}/rustlib
install -d $target_dir
cp -r _dist/$rlib_path/${RUST_TARGET_SYS} $target_dir
rm -rf _dist
}

# Override the default dependency on libstd-rs, as we copy the libraries
# manually above.
RUSTLIB_DEP = ""

0 comments on commit ae6d371

Please sign in to comment.