mkosi: Make scripts more generic

We might want to run the build scripts outside of mkosi as well at
some point, e.g. to build an rpm after booting the image, so let's
make them more generic by using /usr/lib/os-release to figure out
which pkg specs we should use instead of $PKG_SUBDIR. To make ubuntu
use the debian pkg spec, we add a symlink pkg/ubuntu which points to
debian/ in the same directory.
This commit is contained in:
Daan De Meyer 2024-04-08 12:52:56 +02:00
parent 0e4eba6fcb
commit d6f206b944
15 changed files with 72 additions and 53 deletions

View file

@ -2,17 +2,20 @@
# SPDX-License-Identifier: LGPL-2.1-or-later
set -ex
if [ ! -f "pkg/$PKG_SUBDIR/PKGBUILD" ]; then
echo "PKGBUILD not found at pkg/$PKG_SUBDIR/PKGBUILD, run mkosi once with -ff to make sure the PKGBUILD is cloned" >&2
# shellcheck source=/dev/null
. /usr/lib/os-release
if [ ! -f "pkg/$ID/PKGBUILD" ]; then
echo "PKGBUILD not found at pkg/$ID/PKGBUILD, run mkosi once with -ff to make sure the PKGBUILD is cloned" >&2
exit 1
fi
# We can't configure the source or build directory so we use bind mounts instead to make sure they are in the
# expected locations.
mount --mkdir --bind "$SRCDIR" "pkg/$PKG_SUBDIR/systemd-stable/"
mount --mkdir --bind "$BUILDDIR" "pkg/$PKG_SUBDIR/build/"
mount --mkdir --bind "$SRCDIR" "pkg/$ID/systemd-stable/"
mount --mkdir --bind "$BUILDDIR" "pkg/$ID/build/"
# Because we run with --noextract we are responsible for making sure the source files appear in src/.
mount --mkdir --rbind "$PWD/pkg/$PKG_SUBDIR" "pkg/$PKG_SUBDIR/src/"
mount --mkdir --rbind "$PWD/pkg/$ID" "pkg/$ID/src/"
# shellcheck source=/dev/null
. /etc/makepkg.conf
@ -35,13 +38,13 @@ else
TS="${SOURCE_DATE_EPOCH:-$(date +%s)}"
fi
sed --in-place "pkg/$PKG_SUBDIR/PKGBUILD" \
sed --in-place "pkg/$ID/PKGBUILD" \
--expression "s/^_tag=.*/_tag=$(cat meson.version)/" \
--expression "s/^pkgrel=.*/pkgrel=$(date "+%Y%m%d%H%M%S" --date "@$TS")/"
# We get around makepkg's root check by setting EUID to something else.
# shellcheck disable=SC2046
env --chdir="pkg/$PKG_SUBDIR" \
env --chdir="pkg/$ID" \
EUID=123 \
makepkg \
--noextract \
@ -49,7 +52,7 @@ env --chdir="pkg/$PKG_SUBDIR" \
--force \
_systemd_UPSTREAM=1 \
_systemd_QUIET=1 \
BUILDDIR="$PWD/pkg/$PKG_SUBDIR" \
BUILDDIR="$PWD/pkg/$ID" \
PKGDEST="$OUTPUTDIR" \
PKGEXT=".pkg.tar" \
MESON_EXTRA_CONFIGURE_OPTIONS="-D mode=developer -D b_sanitize=${SANITIZERS:-none}"

View file

@ -10,7 +10,6 @@ InitrdInclude=initrd/
# https://gitlab.archlinux.org/archlinux/packaging/packages/systemd/-/merge_requests/8 is merged.
[Content]
Environment=
PKG_SUBDIR="arch"
SYSTEMD_PACKAGES="systemd systemd-ukify systemd-sysvcompat systemd-resolvconf systemd-tests"
Packages=

View file

@ -6,13 +6,16 @@ if [ "$1" = "build" ]; then
exit 0
fi
if [ ! -f "pkg/$PKG_SUBDIR/PKGBUILD" ]; then
echo "PKGBUILD not found at pkg/$PKG_SUBDIR/PKGBUILD, run mkosi once with -ff to make sure the PKGBUILD is cloned" >&2
# shellcheck source=/dev/null
. "$BUILDROOT/usr/lib/os-release"
if [ ! -f "pkg/$ID/PKGBUILD" ]; then
echo "PKGBUILD not found at pkg/$ID/PKGBUILD, run mkosi once with -ff to make sure the PKGBUILD is cloned" >&2
exit 1
fi
# We get depends and optdepends from .SRCINFO as getting them from the PKGBUILD is rather complex.
sed --expression 's/^[ \t]*//' "pkg/$PKG_SUBDIR/.SRCINFO" |
sed --expression 's/^[ \t]*//' "pkg/$ID/.SRCINFO" |
grep --regexp '^depends =' --regexp '^optdepends =' |
sed --expression 's/^depends = //' --expression 's/^optdepends = //' --expression 's/:.*//' |
xargs --delimiter '\n' mkosi-install
@ -20,7 +23,7 @@ sed --expression 's/^[ \t]*//' "pkg/$PKG_SUBDIR/.SRCINFO" |
# We get makedepends from the PKGBUILD as .SRCINFO can't encode conditional dependencies depending on
# whether some environment variable is set or not.
# shellcheck source=/dev/null
_systemd_UPSTREAM=1 . "pkg/$PKG_SUBDIR/PKGBUILD"
_systemd_UPSTREAM=1 . "pkg/$ID/PKGBUILD"
# shellcheck disable=SC2154
mkosi-install "${makedepends[@]}"

View file

@ -2,8 +2,11 @@
# SPDX-License-Identifier: LGPL-2.1-or-later
set -e
if [ ! -f "pkg/$PKG_SUBDIR/systemd.spec" ]; then
echo "spec not found at pkg/$PKG_SUBDIR/systemd.spec, run mkosi once with -ff to make sure the spec is cloned" >&2
# shellcheck source=/dev/null
. /usr/lib/os-release
if [ ! -f "pkg/$ID/systemd.spec" ]; then
echo "spec not found at pkg/$ID/systemd.spec, run mkosi once with -ff to make sure the spec is cloned" >&2
exit 1
fi
@ -23,7 +26,7 @@ rpmbuild \
$( ((WITH_TESTS)) || echo "--nocheck") \
$( ((WITH_DOCS)) || echo "--without docs") \
--define "_topdir /var/tmp" \
--define "_sourcedir pkg/$PKG_SUBDIR" \
--define "_sourcedir pkg/$ID" \
--define "_rpmdir $OUTPUTDIR" \
${BUILDDIR:+--define} \
${BUILDDIR:+"_vpath_builddir $BUILDDIR"} \
@ -45,6 +48,6 @@ rpmbuild \
--define "__elf_exclude_path ^/usr/lib/systemd/tests/unit-tests/.*$" \
--define "__script_requires %{nil}" \
--undefine _lto_cflags \
"pkg/$PKG_SUBDIR/systemd.spec"
"pkg/$ID/systemd.spec"
cp "$OUTPUTDIR"/*.rpm "$PACKAGEDIR"

View file

@ -6,8 +6,11 @@ if [ "$1" = "build" ]; then
exit 0
fi
if [ ! -f "pkg/$PKG_SUBDIR/systemd.spec" ]; then
echo "spec not found at pkg/$PKG_SUBDIR/systemd.spec, run mkosi with -ff to make sure the spec is cloned" >&2
# shellcheck source=/dev/null
. "$BUILDROOT/usr/lib/os-release"
if [ ! -f "pkg/$ID/systemd.spec" ]; then
echo "spec not found at pkg/$ID/systemd.spec, run mkosi with -ff to make sure the spec is cloned" >&2
exit 1
fi
@ -18,8 +21,8 @@ for DEPS in --requires --buildrequires; do
--query \
"$DEPS" \
--define "_topdir /var/tmp" \
--define "_sourcedir pkg/$PKG_SUBDIR" \
"pkg/$PKG_SUBDIR/systemd.spec" |
--define "_sourcedir pkg/$ID" \
"pkg/$ID/systemd.spec" |
grep --invert-match --regexp systemd --regexp /bin/sh --regexp "rpmlib(" --regexp udev |
sort --unique |
tee /tmp/buildrequires |
@ -29,7 +32,7 @@ done
# rpmbuild -br tries to build a source package which means all source files have to exist which isn't the
# case when using --build-in-place so we get rid of the source file that doesn't exist to make it happy.
# TODO: Use -bd instead of -br and get rid of this once we don't need to build on CentOS Stream 9 anymore.
sed '/Source0/d' --in-place "pkg/$PKG_SUBDIR/systemd.spec"
sed '/Source0/d' --in-place "pkg/$ID/systemd.spec"
until mkosi-chroot \
rpmbuild \
@ -37,9 +40,9 @@ until mkosi-chroot \
--build-in-place \
--with upstream \
--define "_topdir /var/tmp" \
--define "_sourcedir pkg/$PKG_SUBDIR" \
--define "_sourcedir pkg/$ID" \
--define "_build_name_fmt %%{NAME}-%%{VERSION}-%%{RELEASE}.%%{ARCH}.rpm" \
"pkg/$PKG_SUBDIR/systemd.spec"
"pkg/$ID/systemd.spec"
do
EXIT_STATUS=$?
if [ $EXIT_STATUS -ne 11 ]; then

View file

@ -4,9 +4,6 @@
Distribution=centos
[Content]
Environment=
PKG_SUBDIR="centos"
Packages=
kernel-modules # For squashfs support
rpmautospec-rpm-macros

View file

@ -2,13 +2,16 @@
# SPDX-License-Identifier: LGPL-2.1-or-later
set -e
if [ ! -d "pkg/$PKG_SUBDIR/debian" ]; then
echo "deb rules not found at pkg/$PKG_SUBDIR/debian, run mkosi once with -ff to make sure the rules are cloned" >&2
# shellcheck source=/dev/null
. /usr/lib/os-release
if [ ! -d "pkg/$ID/debian" ]; then
echo "deb rules not found at pkg/$ID/debian, run mkosi once with -ff to make sure the rules are cloned" >&2
exit 1
fi
# We transplant the debian/ folder from the deb package sources into the upstream sources.
mount --mkdir --bind "$SRCDIR/pkg/$PKG_SUBDIR/debian" "$SRCDIR"/debian
mount --mkdir --bind "$SRCDIR/pkg/$ID/debian" "$SRCDIR"/debian
# We hide the patches/ directory by mounting an empty directory on top so they don't get applied.
TMP=$(mktemp -d)

View file

@ -9,7 +9,6 @@ InitrdInclude=initrd/
[Content]
Environment=
PKG_SUBDIR="debian"
SYSTEMD_PACKAGES="systemd
systemd-userdbd
systemd-oomd

View file

@ -6,10 +6,13 @@ if [ "$1" = "build" ]; then
exit 0
fi
if [ ! -d "pkg/$PKG_SUBDIR/debian" ]; then
echo "deb rules not found at pkg/$PKG_SUBDIR/debian, run mkosi once with -ff to make sure the rules are cloned" >&2
# shellcheck source=/dev/null
. "$BUILDROOT/usr/lib/os-release"
if [ ! -d "pkg/$ID/debian" ]; then
echo "deb rules not found at pkg/$ID/debian, run mkosi once with -ff to make sure the rules are cloned" >&2
exit 1
fi
cd "pkg/$PKG_SUBDIR"
cd "pkg/$ID"
DEB_BUILD_PROFILES="pkg.systemd.upstream" apt-get build-dep .

View file

@ -4,9 +4,6 @@
Distribution=fedora
[Content]
Environment=
PKG_SUBDIR="fedora"
Packages=
btrfs-progs
compsize

View file

@ -2,8 +2,12 @@
# SPDX-License-Identifier: LGPL-2.1-or-later
set -e
if [ ! -f "pkg/$PKG_SUBDIR/systemd.spec" ]; then
echo "spec not found at pkg/$PKG_SUBDIR/systemd.spec, run mkosi once with -ff to make sure the spec is cloned" >&2
# shellcheck source=/dev/null
. /usr/lib/os-release
ID="${ID%-*}"
if [ ! -f "pkg/$ID/systemd.spec" ]; then
echo "spec not found at pkg/$ID/systemd.spec, run mkosi once with -ff to make sure the spec is cloned" >&2
exit 1
fi
@ -16,7 +20,7 @@ fi
# The openSUSE filelists hardcode the manpage compression extension. This causes rpmbuild errors since we
# disable manpage compression as the files cannot be found. Fix the issue by removing the compression
# extension.
find "pkg/$PKG_SUBDIR" -name "files.*" -exec sed --in-place 's/\.gz$//' {} \;
find "pkg/$ID" -name "files.*" -exec sed --in-place 's/\.gz$//' {} \;
build() {
# TODO: Replace meson_build and meson_install overrides with "--undefine __meson_verbose" once
@ -28,7 +32,7 @@ build() {
--with upstream \
$( ((WITH_TESTS)) || echo --nocheck) \
--define "_topdir /var/tmp" \
--define "_sourcedir pkg/$PKG_SUBDIR" \
--define "_sourcedir pkg/$ID" \
--define "_rpmdir $OUTPUTDIR" \
${BUILDDIR:+--define} \
${BUILDDIR:+"_vpath_builddir $BUILDDIR"} \
@ -46,7 +50,7 @@ build() {
--define "__elf_exclude_path ^/usr/lib/systemd/tests/unit-tests/.*$" \
--define "__script_requires %{nil}" \
"$@" \
"pkg/$PKG_SUBDIR/systemd.spec"
"pkg/$ID/systemd.spec"
}
if ! build; then
@ -58,7 +62,7 @@ if ! build; then
# warnings.
rm systemd.lang
cat /tmp/unpackaged-files >>"pkg/$PKG_SUBDIR/files.systemd"
cat /tmp/unpackaged-files >>"pkg/$ID/files.systemd"
build --noprep --nocheck
fi

View file

@ -8,7 +8,6 @@ InitrdInclude=initrd/
[Content]
Environment=
PKG_SUBDIR="opensuse"
SYSTEMD_PACKAGES="systemd
udev
systemd-experimental

View file

@ -6,8 +6,12 @@ if [ "$1" = "build" ]; then
exit 0
fi
if [ ! -f "pkg/$PKG_SUBDIR/systemd.spec" ]; then
echo "spec not found at pkg/$PKG_SUBDIR/systemd.spec, run mkosi once with -ff to make sure the spec is cloned" >&2
# shellcheck source=/dev/null
. "$BUILDROOT/usr/lib/os-release"
ID="${ID%-*}"
if [ ! -f "pkg/$ID/systemd.spec" ]; then
echo "spec not found at pkg/$ID/systemd.spec, run mkosi once with -ff to make sure the spec is cloned" >&2
exit 1
fi
@ -18,8 +22,8 @@ for DEPS in --requires --buildrequires; do
--query \
"$DEPS" \
--define "_topdir /var/tmp" \
--define "_sourcedir pkg/$PKG_SUBDIR" \
"pkg/$PKG_SUBDIR/systemd.spec" |
--define "_sourcedir pkg/$ID" \
"pkg/$ID/systemd.spec" |
grep --invert-match --regexp systemd --regexp /bin/sh --regexp "rpmlib(" --regexp udev |
sort --unique |
tee /tmp/buildrequires |
@ -32,9 +36,9 @@ until mkosi-chroot \
--build-in-place \
--with upstream \
--define "_topdir /var/tmp" \
--define "_sourcedir pkg/$PKG_SUBDIR" \
--define "_sourcedir pkg/$ID" \
--define "_build_name_fmt %%{NAME}-%%{VERSION}-%%{RELEASE}.%%{ARCH}.rpm" \
"pkg/$PKG_SUBDIR/systemd.spec"
"pkg/$ID/systemd.spec"
do
EXIT_STATUS=$?
if [ $EXIT_STATUS -ne 11 ]; then

View file

@ -2,7 +2,8 @@
# SPDX-License-Identifier: LGPL-2.1-or-later
set -e
if [ -z "$(ls --almost-all "pkg/$PKG_SUBDIR")" ] || [ -f "pkg/$PKG_SUBDIR/.git" ]; then
git submodule sync "pkg/$PKG_SUBDIR"
git submodule update --init "pkg/$PKG_SUBDIR"
if [ -z "$(ls --almost-all "pkg/$DISTRIBUTION")" ] || [ -f "pkg/$DISTRIBUTION/.git" ]; then
PKG_SUBDIR="$(realpath "pkg/$DISTRIBUTION" --relative-to "$PWD")"
git submodule sync "$PKG_SUBDIR"
git submodule update --init "$PKG_SUBDIR"
fi

1
pkg/ubuntu Symbolic link
View file

@ -0,0 +1 @@
debian