#!/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
