From b9087332571ba1805d9dc67bdf460b429506a8b5 Mon Sep 17 00:00:00 2001 From: "Dustin C. Hatch" Date: Fri, 13 Dec 2024 19:45:47 -0600 Subject: [PATCH 1/4] Install Firefox Attempting to cross-compile Firefox will be rather challenging. It has loads of dependencies, written in a variety of languages. Some issues are more interesting than others. Notably, _dev-libs/nss_ needs to be installed on the host in order to cross-compile itself, but its ebuild does not specify this ([Bug 759127][0]). Also the build system for _gnome-base/librsvg_ is broken: [Gentoo Bug 835758][1], [GNOME Issue #810][2]. Cross-compiling _dev-libs/gobject-introspection_ is also broken ([Bug 759127][3], [850895][4]). With all of these changes, we can get to the point where Portage starts building Firefox, it will take hours and all of my machine's resources, so I haven't tested if will actually build. We shall see once Jenkins tries it... [0]: https://bugs.gentoo.org/759127 [1]: https://bugs.gentoo.org/835758 [2]: https://gitlab.gnome.org/GNOME/librsvg/-/issues/810 [3]: https://bugs.gentoo.org/850895 [4]: https://bugs.gentoo.org/751325 --- install.packages | 1 + portage/make.conf/60-use.conf | 1 + portage/make.conf/introspection.conf | 4 ++ portage/make.conf/videocore.conf | 1 + portage/make.conf/wayland.conf | 1 + portage/package.accept_keywords/firefox | 1 + portage/package.use/firefox | 6 +++ .../librsvg/do-not-build-rsvg-convert.patch | 48 +++++++++++++++++++ prepare.sh | 11 +++++ 9 files changed, 74 insertions(+) create mode 100644 portage/make.conf/60-use.conf create mode 100644 portage/make.conf/introspection.conf create mode 100644 portage/make.conf/videocore.conf create mode 100644 portage/make.conf/wayland.conf create mode 100644 portage/package.accept_keywords/firefox create mode 100644 portage/package.use/firefox create mode 100644 portage/patches/gnome-base/librsvg/do-not-build-rsvg-convert.patch diff --git a/install.packages b/install.packages index 31638b0..5c67a29 100644 --- a/install.packages +++ b/install.packages @@ -1 +1,2 @@ net-wireless/wpa_supplicant +www-client/firefox diff --git a/portage/make.conf/60-use.conf b/portage/make.conf/60-use.conf new file mode 100644 index 0000000..ad110bb --- /dev/null +++ b/portage/make.conf/60-use.conf @@ -0,0 +1 @@ +USE="${USE} -python -readline" diff --git a/portage/make.conf/introspection.conf b/portage/make.conf/introspection.conf new file mode 100644 index 0000000..63c418a --- /dev/null +++ b/portage/make.conf/introspection.conf @@ -0,0 +1,4 @@ +# Disable GObject introspection because it cannot be cross-compiled +# https://bugs.gentoo.org/850895 +# https://bugs.gentoo.org/751325 +USE="${USE} -introspection -vala" diff --git a/portage/make.conf/videocore.conf b/portage/make.conf/videocore.conf new file mode 100644 index 0000000..05c0c2b --- /dev/null +++ b/portage/make.conf/videocore.conf @@ -0,0 +1 @@ +VIDEO_CARDS='v3d vc4' diff --git a/portage/make.conf/wayland.conf b/portage/make.conf/wayland.conf new file mode 100644 index 0000000..71d123e --- /dev/null +++ b/portage/make.conf/wayland.conf @@ -0,0 +1 @@ +USE="${USE} -X wayland" diff --git a/portage/package.accept_keywords/firefox b/portage/package.accept_keywords/firefox new file mode 100644 index 0000000..f0cbd3b --- /dev/null +++ b/portage/package.accept_keywords/firefox @@ -0,0 +1 @@ +dev-libs/nss ~amd64 diff --git a/portage/package.use/firefox b/portage/package.use/firefox new file mode 100644 index 0000000..3580b88 --- /dev/null +++ b/portage/package.use/firefox @@ -0,0 +1,6 @@ +media-libs/harfbuzz -cairo +media-libs/libvpx postproc +media-libs/mesa -llvm wayland +media-video/ffmpeg openssl -gnutls +www-client/firefox -telemetry dbus wayland +x11-libs/gtk+ wayland diff --git a/portage/patches/gnome-base/librsvg/do-not-build-rsvg-convert.patch b/portage/patches/gnome-base/librsvg/do-not-build-rsvg-convert.patch new file mode 100644 index 0000000..4e2775e --- /dev/null +++ b/portage/patches/gnome-base/librsvg/do-not-build-rsvg-convert.patch @@ -0,0 +1,48 @@ +--- a/Makefile.in 2024-12-13 12:17:08.339616211 -0600 ++++ b/Makefile.in 2024-12-13 12:18:30.301517960 -0600 +@@ -641,12 +641,6 @@ + rsvg/src/test_utils/reference_utils.rs \ + rsvg-bench/Cargo.toml \ + rsvg-bench/src/main.rs \ +- rsvg_convert/tests/internal_predicates/file.rs \ +- rsvg_convert/tests/internal_predicates/mod.rs \ +- rsvg_convert/tests/internal_predicates/pdf.rs \ +- rsvg_convert/tests/internal_predicates/png.rs \ +- rsvg_convert/tests/internal_predicates/svg.rs \ +- rsvg_convert/tests/rsvg_convert.rs \ + librsvg-c/tests/legacy_sizing.rs \ + gdk-pixbuf-loader/Cargo.toml \ + gdk-pixbuf-loader/src/lib.rs \ +@@ -685,15 +679,6 @@ + librsvgincdir = $(includedir)/librsvg-$(RSVG_API_VERSION)/librsvg + librsvginc_HEADERS = $(librsvg_public_headers) + +-# Use SCRIPTS instead of PROGRAMS since we build it on our own +-bin_SCRIPTS = rsvg-convert$(EXEEXT) +-RSVG_CONVERT_BIN = $(CARGO_TARGET_DIR)/$(RUST_TARGET_SUBDIR)/rsvg-convert$(EXEEXT) +-RSVG_CONVERT_SRC = \ +- rsvg_convert/Cargo.toml \ +- rsvg_convert/build.rs \ +- rsvg_convert/src/main.rs \ +- $(NULL) +- + @HAVE_RST2MAN_TRUE@man1_MANS = rsvg-convert.1 + dist_doc_DATA = \ + README.md \ +@@ -1643,16 +1628,6 @@ + $(CARGO) --locked build $(CARGO_VERBOSE) $(CARGO_TARGET_ARGS) $(CARGO_RELEASE_ARGS) --package librsvg-c \ + && cd $(LIBRSVG_BUILD_DIR) && $(LINK) $< && cp $(RUST_LIB) .libs/librsvg_c_api.a + +-$(RSVG_CONVERT_BIN): $(RSVG_CONVERT_SRC) | librsvg_c_api.la +- +cd $(top_srcdir) && \ +- PKG_CONFIG_ALLOW_CROSS=1 \ +- PKG_CONFIG='$(PKG_CONFIG)' \ +- CARGO_TARGET_DIR=$(CARGO_TARGET_DIR) \ +- $(CARGO) --locked build $(CARGO_VERBOSE) $(CARGO_TARGET_ARGS) $(CARGO_RELEASE_ARGS) --package rsvg_convert +- +-rsvg-convert$(EXEEXT): $(RSVG_CONVERT_BIN) +- cd $(LIBRSVG_BUILD_DIR) && cp $(RSVG_CONVERT_BIN) rsvg-convert$(EXEEXT) +- + rsvg-convert.1: rsvg-convert.rst + @HAVE_RST2MAN_TRUE@ $(RST2MAN) $(top_srcdir)/rsvg-convert.rst rsvg-convert.1 + @HAVE_RST2MAN_FALSE@ @echo "========================================" diff --git a/prepare.sh b/prepare.sh index aa4d100..919d248 100644 --- a/prepare.sh +++ b/prepare.sh @@ -6,3 +6,14 @@ fi if [ "$(find /var/db/repos/gentoo/metadata -newermt '-24 hours' | wc -l)" -eq 0 ]; then emaint sync fi + +mkdir -p /etc/portage/package.use +mkdir -p /etc/portage/make.conf +cp portage/package.use/firefox /etc/portage/package.use/ +cp portage/make.conf/introspection.conf /etc/portage/make.conf/ +cp portage/make.conf/wayland.conf /etc/portage/make.conf/ +echo 'VIDEO_CARDS=""' > /etc/portage/make.conf/videocards.conf + +xargs -r emerge -vbknuUj --rebuilt-binaries=y --color=y < Date: Mon, 23 Dec 2024 08:41:04 -0600 Subject: [PATCH 2/4] Build Firefox w/ gcc Building _www-client/firefox_ fails fairly early with an error about not being able to find `aarch64-unknown-linux-gnu-clang-19` to use as `CC`. I have not been able to determine what is supposed to provide this program/symlink, nor much information at all about cross-compiling with Clang, really. We shall try building Firefox with GCC, since we know that toolchain is complete. --- portage/package.use/firefox | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/portage/package.use/firefox b/portage/package.use/firefox index 3580b88..a07789a 100644 --- a/portage/package.use/firefox +++ b/portage/package.use/firefox @@ -2,5 +2,5 @@ media-libs/harfbuzz -cairo media-libs/libvpx postproc media-libs/mesa -llvm wayland media-video/ffmpeg openssl -gnutls -www-client/firefox -telemetry dbus wayland +www-client/firefox -clang -telemetry dbus wayland x11-libs/gtk+ wayland -- 2.51.0 From c93bceeb563b3ff6e7c1a711e1e38ee6d4f90ce3 Mon Sep 17 00:00:00 2001 From: "Dustin C. Hatch" Date: Mon, 23 Dec 2024 16:20:17 -0600 Subject: [PATCH 3/4] Install Firefox from Gentoo binpkg MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Unfortunately, even building Firefox with GCC fails: > 3:30.02 [gecko-profiler 0.1.0] /../lib/gcc/aarch64-unknown-linux-gnu/14/include/g++-v14/cstdlib:79:15: fatal error: 'stdlib.h' file not found > 3:30.02 [gecko-profiler 0.1.0] thread 'main' panicked at tools/profiler/rust-api/build.rs:104:10: > 3:30.02 [gecko-profiler 0.1.0] Unable to generate bindings: ClangDiagnostic("/../lib/gcc/aarch64-unknown-linux-gnu/14/include/g++-v14/cstdlib:79:15: fatal error: 'stdlib.h' file not found\n") Clearly, something is misconfigured, because `stdlib.h` does indeed exist. I am not sure what, though, and I am getting tired of messing with this. Fortunately, the official Gentoo binary package project has a build of _www-client/firefox_ for ARM64. It has a rather different USE flag configuration than what we did, though, so we have to pull in quite a few more dependencies. We can't just add _www-client/firefox_ to `install.packages` because Aimee OS runs `emerge` with `--getbinpkgonly`, which implies `--binpkg-changed-deps=y`. This since we want to build everything _except_ Firefox locally, the dependency graph is quite a bit different, so Portage ignores the binary package and will try to build _www-client/firefox_ from source. To work around this limitation, we need to install Firefox manually in the `customize.sh` script in two phases. First, we install all of its dependencies in the build root (`/usr/aarch64-…`), but not Firefox itself, to get binpkgs for them. Then, we install _www-client/firefox_ in the target root (`/mnt/gentoo`) with the `--getbinpkg` and `--usepkgonly` flags. Hopefully, one day I can figure out how to cross-compile Firefox (and it doesn't take days to build once I do), and we can remove this hackery. --- build.packages | 3 +++ customize.sh | 10 ++++++++++ install.packages | 2 +- portage/make.conf/wayland.conf | 2 +- portage/package.accept_keywords/firefox | 1 - portage/package.use/firefox | 11 ++++++++++- prepare.sh | 5 +++++ 7 files changed, 30 insertions(+), 4 deletions(-) delete mode 100644 portage/package.accept_keywords/firefox diff --git a/build.packages b/build.packages index 9677552..26ab468 100644 --- a/build.packages +++ b/build.packages @@ -1,2 +1,5 @@ sys-boot/raspberrypi-firmware sys-boot/u-boot +x11-libs/gtk+ +media-libs/mesa +media-video/ffmpeg diff --git a/customize.sh b/customize.sh index f0bc12a..57ba6d7 100755 --- a/customize.sh +++ b/customize.sh @@ -1,6 +1,16 @@ #!/bin/sh # vim: set sw=4 ts=4 sts=4 et : +. "${CONFIGDIR:=${PWD}}"/config + +O=$1 + +export PORTAGE_CONFIGROOT="$O"/portage + +${target}-emerge -vbknuUDj --onlydeps --with-bdeps=n www-client/firefox:esr +PORTAGE_BINHOST=https://distfiles.gentoo.org/releases/arm64/binpackages/23.0/arm64 \ +${target}-emerge -vgKnj --root=/mnt/gentoo www-client/firefox:esr + passwd -R /mnt/gentoo -d root systemctl --root=/mnt/gentoo enable wpa_supplicant@wlan0 diff --git a/install.packages b/install.packages index 5c67a29..7998e21 100644 --- a/install.packages +++ b/install.packages @@ -1,2 +1,2 @@ net-wireless/wpa_supplicant -www-client/firefox +media-video/pipewire diff --git a/portage/make.conf/wayland.conf b/portage/make.conf/wayland.conf index 71d123e..624b840 100644 --- a/portage/make.conf/wayland.conf +++ b/portage/make.conf/wayland.conf @@ -1 +1 @@ -USE="${USE} -X wayland" +USE="${USE} wayland" diff --git a/portage/package.accept_keywords/firefox b/portage/package.accept_keywords/firefox deleted file mode 100644 index f0cbd3b..0000000 --- a/portage/package.accept_keywords/firefox +++ /dev/null @@ -1 +0,0 @@ -dev-libs/nss ~amd64 diff --git a/portage/package.use/firefox b/portage/package.use/firefox index a07789a..d877364 100644 --- a/portage/package.use/firefox +++ b/portage/package.use/firefox @@ -2,5 +2,14 @@ media-libs/harfbuzz -cairo media-libs/libvpx postproc media-libs/mesa -llvm wayland media-video/ffmpeg openssl -gnutls -www-client/firefox -clang -telemetry dbus wayland + +# Must match USE flags of the www-client/firefox package on the +# offical Gentoo binhost +www-client/firefox X clang dbus gmp-autoupdate gnome-shell jumbo-build pulseaudio system-av1 system-harfbuzz system-icu system-jpeg system-libevent system-libvpx system-webp telemetry wayland LLVM_SLOT: 19 -17 -18 +x11-libs/cairo X x11-libs/gtk+ wayland +media-libs/libglvnd X + +# Firefox requires a PulseAudio-compatible sound server; we use Pipewire +media-video/pipewire sound-server +media-libs/libcanberra udev alsa diff --git a/prepare.sh b/prepare.sh index 919d248..9c6dd89 100644 --- a/prepare.sh +++ b/prepare.sh @@ -1,5 +1,7 @@ #!/bin/sh +. "${CONFIGDIR:=${PWD}}"/config + if [ ! -f /var/db/repos/gentoo/metadata/timestamp ]; then emerge-webrsync fi @@ -9,6 +11,7 @@ fi mkdir -p /etc/portage/package.use mkdir -p /etc/portage/make.conf +echo 'virtual/libudev systemd' >> /etc/portage/package.use/systemd cp portage/package.use/firefox /etc/portage/package.use/ cp portage/make.conf/introspection.conf /etc/portage/make.conf/ cp portage/make.conf/wayland.conf /etc/portage/make.conf/ @@ -17,3 +20,5 @@ echo 'VIDEO_CARDS=""' > /etc/portage/make.conf/videocards.conf xargs -r emerge -vbknuUj --rebuilt-binaries=y --color=y < Date: Sun, 29 Dec 2024 12:08:09 -0600 Subject: [PATCH 4/4] ci: archive build logs on failure --- ci/Jenkinsfile | 5 +++++ ci/podTemplate.yaml | 3 +++ 2 files changed, 8 insertions(+) diff --git a/ci/Jenkinsfile b/ci/Jenkinsfile index 1270b8c..adcf8e4 100644 --- a/ci/Jenkinsfile +++ b/ci/Jenkinsfile @@ -29,5 +29,10 @@ pipeline { archiveArtifacts '*' } } + failure { + dir('/var/tmp/portage') { + archiveArtifacts '*/*/temp/*.log' + } + } } } diff --git a/ci/podTemplate.yaml b/ci/podTemplate.yaml index 51cd9d8..a0f1c5c 100644 --- a/ci/podTemplate.yaml +++ b/ci/podTemplate.yaml @@ -32,6 +32,9 @@ spec: subPath: distfiles - mountPath: /var/db/repos/gentoo name: portage + - mountPath: /var/tmp + name: workspace-volume + subPath: tmp hostUsers: false volumes: - name: binpkgs -- 2.51.0