mirror of
https://github.com/systemd/systemd-stable.git
synced 2024-12-23 17:34:00 +03:00
f533cda5a8
If it's passed into the build, use it, so that the mkosi build version is propagated into the image itself.
167 lines
6.2 KiB
Bash
Executable File
167 lines
6.2 KiB
Bash
Executable File
#!/bin/sh
|
|
set -e
|
|
|
|
# This is a build script for OS image generation using mkosi (https://github.com/systemd/mkosi).
|
|
# Simply invoke "mkosi" in the project directory to build an OS image.
|
|
|
|
# Reset the permissions of the tree. Since Meson keeps the permissions
|
|
# all the way to the installed files, reset them to one of 0644 or 0755
|
|
# so the files keep those permissions, otherwise details of what umask
|
|
# was set at the time the git tree was cloned will leak all the way
|
|
# through. Also set umask explicitly during the build.
|
|
if ! mountpoint -q "$SRCDIR"; then
|
|
chmod -R u+w,go-w,a+rX .
|
|
umask 022
|
|
fi
|
|
|
|
# On Fedora "ld" is (unfortunately — if you ask me) managed via
|
|
# "alternatives". Since we'd like to support building images in environments
|
|
# with only /usr/ around (e.g. mkosi's UsrOnly=1 option), we have the problem
|
|
# that /usr/bin/ld is a symlink that points to a non-existing file in
|
|
# /etc/alternative/ in this mode. Let's work around this for now by manually
|
|
# redirect "ld" to "ld.bfd", i.e. circumventing the /usr/bin/ld symlink.
|
|
if [ ! -x /usr/bin/ld -a -x /usr/bin/ld.bfd ] ; then
|
|
mkdir -p "$HOME"/bin
|
|
ln -s /usr/bin/ld.bfd "$HOME"/bin/ld
|
|
PATH="$HOME/bin:$PATH"
|
|
fi
|
|
|
|
# If mkosi.builddir/ exists mkosi will set $BUILDDIR to it, let's then use it
|
|
# as out-of-tree build dir. Otherwise, let's make up our own builddir.
|
|
[ -z "$BUILDDIR" ] && BUILDDIR=build
|
|
|
|
# Meson uses Python 3 and requires a locale with an UTF-8 character map.
|
|
# Not running under UTF-8 makes the `ninja test` step break with a CodecError.
|
|
# So let's ensure we're running under UTF-8.
|
|
#
|
|
# If our current locale already is UTF-8, then we don't need to do anything:
|
|
if [ "$(locale charmap 2> /dev/null)" != "UTF-8" ] ; then
|
|
# Try using C.UTF-8 locale, if available. This locale is not shipped
|
|
# by upstream glibc, so it's not available in all distros.
|
|
# (In particular, it's not available in Arch Linux.)
|
|
if locale -a | grep -q -E "C.UTF-8|C.utf8"; then
|
|
export LC_CTYPE=C.UTF-8
|
|
# Finally, try something like en_US.UTF-8, which should be
|
|
# available in Arch Linux, but is not present in Debian's
|
|
# minimal image in our mkosi config.
|
|
elif locale -a | grep -q en_US.utf8; then
|
|
export LC_CTYPE=en_US.UTF-8
|
|
else
|
|
# If nothing works, fail early.
|
|
echo "*** Could not find a valid locale that supports UTF-8. ***" >&2
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
if [ ! -f "$BUILDDIR"/build.ninja ] ; then
|
|
sysvinit_path=`realpath /etc/init.d`
|
|
|
|
init_path=`realpath /sbin/init 2>/dev/null`
|
|
if [ -z "$init_path" ] ; then
|
|
rootprefix=""
|
|
else
|
|
rootprefix=${init_path%/lib/systemd/systemd}
|
|
rootprefix=/${rootprefix#/}
|
|
fi
|
|
|
|
nobody_user=`id -u -n 65534 2> /dev/null`
|
|
if [ "$nobody_user" != "" ] ; then
|
|
# Validate that we can translate forth and back
|
|
if [ "`id -u $nobody_user`" != 65534 ] ; then
|
|
nobody_user=""
|
|
fi
|
|
fi
|
|
if [ "$nobody_user" = "" ] ; then
|
|
if id -u nobody 2> /dev/null ; then
|
|
# The "nobody" user is defined already for something else, pick the Fedora name
|
|
nobody_user=nfsnobody
|
|
else
|
|
# The "nobody" user name is free, use it
|
|
nobody_user=nobody
|
|
fi
|
|
fi
|
|
|
|
nobody_group=`id -g -n 65534 2> /dev/null`
|
|
if [ "$nobody_group" != "" ] ; then
|
|
# Validate that we can translate forth and back
|
|
if [ "`id -g $nobody_group`" != 65534 ] ; then
|
|
nobody_group=""
|
|
fi
|
|
fi
|
|
if [ "$nobody_group" = "" ] ; then
|
|
if id -u nobody 2> /dev/null ; then
|
|
# The "nobody" group is defined already for something else, pick the Fedora name
|
|
nobody_group=nfsnobody
|
|
else
|
|
# The "nobody" group name is free, use it
|
|
nobody_group=nobody
|
|
fi
|
|
fi
|
|
|
|
meson "$BUILDDIR" \
|
|
-D "sysvinit-path=$sysvinit_path" \
|
|
-D "rootprefix=$rootprefix" \
|
|
-D man=false \
|
|
-D "nobody-user=$nobody_user" \
|
|
-D "nobody-group=$nobody_group" \
|
|
-D translations=false \
|
|
-D version-tag="${VERSION_TAG}"
|
|
fi
|
|
|
|
cd "$BUILDDIR"
|
|
ninja "$@"
|
|
if [ "$WITH_TESTS" = 1 ] ; then
|
|
for id in 1 2 3; do
|
|
getent group $id > /dev/null || groupadd -g $id testgroup$id
|
|
done
|
|
|
|
ninja test
|
|
fi
|
|
cd "$SRCDIR"
|
|
|
|
# Ubuntu Focal is stuck with meson 0.53.0.
|
|
if [ "$(meson -v | cut -d . -f 2)" -gt 53 ] ; then
|
|
meson install -C "$BUILDDIR" --quiet --no-rebuild --only-changed
|
|
else
|
|
meson install -C "$BUILDDIR" --no-rebuild --only-changed
|
|
fi
|
|
|
|
mkdir -p "$DESTDIR"/etc
|
|
|
|
cat > "$DESTDIR"/etc/issue <<EOF
|
|
\S (built from systemd tree)
|
|
Kernel \r on an \m (\l)
|
|
|
|
EOF
|
|
|
|
if [ -n "$IMAGE_ID" ] ; then
|
|
mkdir -p "$DESTDIR"/usr/lib
|
|
sed -n \
|
|
-e '/^IMAGE_ID=/!p' \
|
|
-e '$aIMAGE_ID='$IMAGE_ID < /usr/lib/os-release > "$DESTDIR"/usr/lib/os-release
|
|
|
|
OSRELEASEFILE="$DESTDIR"/usr/lib/os-release
|
|
else
|
|
OSRELEASEFILE=/usr/lib/os-release
|
|
fi
|
|
|
|
|
|
if [ -n "$IMAGE_VERSION" ] ; then
|
|
mkdir -p "$DESTDIR"/usr/lib
|
|
sed -n \
|
|
-e '/^IMAGE_VERSION=/!p' \
|
|
-e '$aIMAGE_VERSION='$IMAGE_VERSION < $OSRELEASEFILE > /tmp/os-release.tmp
|
|
|
|
cat /tmp/os-release.tmp > "$DESTDIR"/usr/lib/os-release
|
|
rm /tmp/os-release.tmp
|
|
fi
|
|
|
|
# Manually update the boot loader from the one we just built
|
|
mkdir -p "$DESTDIR"/boot/efi/EFI/systemd "$DESTDIR"/boot/efi/EFI/BOOT
|
|
cp "$DESTDIR"/usr/lib/systemd/boot/efi/systemd-bootx64.efi "$DESTDIR"/boot/efi/EFI/systemd/systemd-bootx64.efi
|
|
cp "$DESTDIR"/usr/lib/systemd/boot/efi/systemd-bootx64.efi "$DESTDIR"/boot/efi/EFI/BOOT/bootx64.efi
|
|
|
|
mkdir -p "$DESTDIR"/efi/EFI/systemd "$DESTDIR"/efi/EFI/BOOT
|
|
cp "$DESTDIR"/usr/lib/systemd/boot/efi/systemd-bootx64.efi "$DESTDIR"/efi/EFI/systemd/systemd-bootx64.efi
|
|
cp "$DESTDIR"/usr/lib/systemd/boot/efi/systemd-bootx64.efi "$DESTDIR"/efi/EFI/BOOT/bootx64.efi
|