Compare commits

...

15 Commits

Author SHA1 Message Date
Dustin 5006ed685c Update Aimee OS 2024-12-31 07:10:11 -06:00
Dustin 5b598a8ace wip: Install Sway WM 2024-12-31 07:10:11 -06:00
Dustin 11a83a9dab ci: archive build logs on failure
dustin/photoframe2/pipeline/pr-main This commit looks good Details
2024-12-31 07:10:11 -06:00
Dustin c93bceeb56 Install Firefox from Gentoo binpkg
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.
2024-12-31 07:10:11 -06:00
Dustin faccf8200f 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.
2024-12-31 06:56:13 -06:00
Dustin b908733257 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
2024-12-31 06:43:45 -06:00
Dustin 6258df154c ci: Add CAP_CHROOT to build container
dustin/photoframe2/pipeline/head This commit looks good Details
This is needed in order to run `passwd -R` to clear the root password
in the target filesystem.
2024-12-30 17:57:04 -06:00
Dustin 735600a31f ci: Use persistent volumes for portage, binpkgs
Recompiling the entire OS for every build takes way too long for
development purposes.  Since we build binary packages anyway, let's keep
them around between builds by storing them on a Kubernetes persistent
volume.

Eventually, I want add a build parameter to wipe out the binary package
storage to force a from-scratch build.  We'll use that option for robust
periodic builds, once development has slowed down.
2024-12-30 17:57:04 -06:00
Dustin 4ded67f1f4 Update Aimee OS 2024-12-30 17:57:04 -06:00
Dustin aede5cd116 ci: Clear env to run build
We don't need any of the environment variables Jenkins sets, and some of
them (like `GIT_COMMIT`) interfere with building packages.
2024-12-30 17:57:04 -06:00
Dustin 10d2d4fd7d Update aimee-os 2024-12-30 17:57:04 -06:00
Dustin 1faeebe66d portage: Install-mask systemd-nsresourced
I don't know what this is for; I think it has something to do with
containers, possibly for `systemd-npsawn`?  It spawns a bunch of
processes and wastes several megabytes of RAM.
2024-12-30 17:57:04 -06:00
Dustin 04232e6a06 customize: Add script
Deleting the initial password for `root` so we can log in to the serial
console for debugging.

Enabling _wpa_supplicant_ to connect to WiFi automatically.
2024-12-30 17:57:04 -06:00
Dustin b7937e98a6 Add Rasperry Pi WiFi support
We need the Broadcom firmware from the _linux-firmware_ package (and
nothing else).  We also need _wpa_supplicant_, to configure the WiFi
connection.  Finally, we need to configure _systemd-networkd_ to manage
the network device.
2024-12-30 17:57:04 -06:00
Dustin 588467d31c config: Set rootflags
Need to add `rootwait` because the Raspberry Pi SD card reader is really
slow and does not initialize in time for the kernel to load the root
filesystem from it.
2024-12-30 17:57:04 -06:00
21 changed files with 210 additions and 6 deletions

@ -1 +1 @@
Subproject commit 79e69cf70df3586bd4ef4b15f577b42719380f38
Subproject commit 36429459e1f40de0989189d2b8296e73be81a602

View File

@ -1,2 +1,5 @@
sys-boot/raspberrypi-firmware
sys-boot/u-boot
x11-libs/gtk+
media-libs/mesa
media-video/ffmpeg

13
ci/Jenkinsfile vendored
View File

@ -9,9 +9,15 @@ pipeline {
}
stages {
stage('Prepare') {
steps {
sh '. ./prepare.sh'
}
}
stage('Build') {
steps {
sh 'make -C aimee-os CONFIGDIR=${PWD} O=/build'
sh 'env -i PATH="${PATH}" make -C aimee-os CONFIGDIR=${PWD} O=/build'
}
}
}
@ -23,5 +29,10 @@ pipeline {
archiveArtifacts '*'
}
}
failure {
dir('/var/tmp/portage') {
archiveArtifacts '*/*/temp/*.log'
}
}
}
}

View File

@ -13,6 +13,7 @@ spec:
capabilities:
add:
- CAP_SETFCAP
- CAP_SYS_CHROOT
volumeMounts:
- mountPath: /build
name: workspace-volume
@ -21,12 +22,24 @@ spec:
name: workspace-volume
subPath: gentoo
- mountPath: /usr/aarch64-unknown-linux-gnu/var/cache/binpkgs
name: workspace-volume
subPath: binpkgs
name: binpkgs
subPath: photoframe2
- mountPath: /var/cache/binpkgs
name: workspace-volume
subPath: binpkgs
name: binpkgs
subPath: photoframe2
- mountPath: /var/cache/distfiles
name: workspace-volume
subPath: distfiles
- mountPath: /var/db/repos/gentoo
name: portage
- mountPath: /var/tmp
name: workspace-volume
subPath: tmp
hostUsers: false
volumes:
- name: binpkgs
persistentVolumeClaim:
claimName: binpkgs
- name: portage
persistentVolumeClaim:
claimName: portage

1
config
View File

@ -3,3 +3,4 @@ profile=default/linux/arm64/23.0/systemd
kernel_pkg=sys-kernel/raspberrypi-sources
kernel_defconfig=bcm2835
device_tree=broadcom/bcm2711-rpi-4-b.dtb
rootflags='ro rootwait=4'

19
customize.sh Executable file
View File

@ -0,0 +1,19 @@
#!/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
groupadd -R /mnt/gentoo -r kiosk
useradd -R /mnt/gentoo -r -g kiosk kiosk
systemctl --root=/mnt/gentoo enable wpa_supplicant@wlan0

View File

@ -0,0 +1,3 @@
gui-wm/sway
net-wireless/wpa_supplicant
media-video/pipewire

1
installonly.packages Normal file
View File

@ -0,0 +1 @@
sys-kernel/linux-firmware

View File

@ -0,0 +1 @@
d wpa_supplicant

View File

@ -0,0 +1,11 @@
[Match]
Type=ether wlan
[Network]
DHCP=yes
[DHCPv4]
UseDomains=yes
[DHCPv6]
UseDomains=yes

View File

@ -0,0 +1,28 @@
[Unit]
After=systemd-user-sessions.service plymouth-quit-wait.service
Before=graphical.target
ConditionPathExists=/dev/tty1
Wants=dbus.socket systemd-logind.service
After=dbus.socket systemd-logind.service
Conflicts=getty@tty1.service
After=getty@tty1.service
Wants=time-sync.target
After=time-sync.target
[Service]
TemporaryFileSystem=/home
ExecStartPre=!/bin/install -o kiosk -g kiosk -d -m u=rwx,go= /home/kiosk
ExecStart=/usr/bin/sway
User=kiosk
Environment=WLR_RENDERER_ALLOW_SOFTWARE=1
Environment=WLR_LIBINPUT_NO_DEVICES=1
StandardInput=tty
StandardOutput=tty
StandardError=journal
TTYPath=/dev/tty1
TTYReset=yes
TTYVHangup=yes
TTYVTDisallocate=yes
PAMName=system-login
UtmpMode=user
UtmpIdentifier=tty1

View File

@ -0,0 +1 @@
USE="${USE} -python -readline"

View File

@ -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"

View File

@ -0,0 +1 @@
INSTALL_MASK="${INSTALL_MASK} /usr/lib/systemd/systemd-nsresourced* /usr/lib/systemd/system/systemd-nsresourced.*"

View File

@ -0,0 +1 @@
VIDEO_CARDS='v3d vc4'

View File

@ -0,0 +1 @@
USE="${USE} wayland"

View File

@ -0,0 +1 @@
sys-kernel/linux-firmware linux-fw-redistributable

View File

@ -0,0 +1,15 @@
media-libs/harfbuzz -cairo
media-libs/libvpx postproc
media-libs/mesa -llvm wayland
media-video/ffmpeg openssl -gnutls
# 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

View File

@ -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 "========================================"

View File

@ -0,0 +1,17 @@
# symlink targets have to be specified explicity
../cypress/cyfmac43455-sdio.bin
../cypress/cyfmac43455-sdio.clm_blob
brcm/brcmfmac43455-sdio.AW-CM256SM.txt
brcm/brcmfmac43455-sdio.MINIX-NEO Z83-4.txt
brcm/brcmfmac43455-sdio.Raspberry Pi Foundation-Raspberry Pi 4 Model B.txt
brcm/brcmfmac43455-sdio.Raspberry Pi Foundation-Raspberry Pi Compute Module 4.txt
brcm/brcmfmac43455-sdio.acepc-t8.txt
brcm/brcmfmac43455-sdio.beagle,am5729-beagleboneai.txt
brcm/brcmfmac43455-sdio.bin
brcm/brcmfmac43455-sdio.clm_blob
brcm/brcmfmac43455-sdio.raspberrypi,3-model-a-plus.txt
brcm/brcmfmac43455-sdio.raspberrypi,3-model-b-plus.txt
brcm/brcmfmac43455-sdio.raspberrypi,4-model-b.txt
cypress/cyfmac43455-sdio.bin
cypress/cyfmac43455-sdio.clm_blob

24
prepare.sh Normal file
View File

@ -0,0 +1,24 @@
#!/bin/sh
. "${CONFIGDIR:=${PWD}}"/config
if [ ! -f /var/db/repos/gentoo/metadata/timestamp ]; then
emerge-webrsync
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
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/
echo 'VIDEO_CARDS=""' > /etc/portage/make.conf/videocards.conf
xargs -r emerge -vbknuUj --rebuilt-binaries=y --color=y <<EOF
dev-libs/nss
EOF
[ -d /etc/portage/gnupg ] || getuto -v