#!/bin/bash # 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 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 # We remove the patches so they don't get applied. rm -rf "$SRCDIR"/debian/patches/* # While the build directory can be specified through DH_OPTIONS, the default one is hardcoded everywhere so # we have to use that. Because it is architecture dependent, we query it using dpkg-architecture first. DEB_HOST_GNU_TYPE="$(dpkg-architecture --query DEB_HOST_GNU_TYPE)" mount --mkdir --bind "$BUILDDIR" "$SRCDIR/obj-$DEB_HOST_GNU_TYPE" if [[ -d .git/ ]] && [[ -z "$(git status --porcelain)" ]]; then TS="$(git show --no-patch --format=%ct HEAD)" else TS="${SOURCE_DATE_EPOCH:-$(date +%s)}" fi # Add a new changelog entry to update the version. We use a fixed date since a dynamic one causes a full # rebuild every time. cat >debian/changelog.new < $(date --rfc-email --date "@$TS") EOF cat debian/changelog >>debian/changelog.new mv debian/changelog.new debian/changelog MKOSI_CFLAGS="-O0" if ((LLVM)); then # TODO: Remove -fno-sanitize-function when https://github.com/systemd/systemd/issues/29972 is fixed. MKOSI_CFLAGS="$MKOSI_CFLAGS -shared-libasan -fno-sanitize=function" fi MKOSI_LDFLAGS="" if ((LLVM)) && [[ -n "$SANITIZERS" ]]; then MKOSI_LDFLAGS="$MKOSI_LDFLAGS -Wl,-rpath=$(realpath "$(clang --print-runtime-dir)")" fi MKOSI_MESON_OPTIONS="-D mode=developer -D b_sanitize=${SANITIZERS:-none}" if ((WIPE)) && [[ -d "$BUILDDIR/meson-private" ]]; then MKOSI_MESON_OPTIONS="$MKOSI_MESON_OPTIONS --wipe" fi # TODO: Drop GENSYMBOLS_LEVEL once https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=986746 is fixed. build() { env \ CC="$( ((LLVM)) && echo clang || echo gcc)" \ CXX="$( ((LLVM)) && echo clang++ || echo g++)" \ CC_LD="$( ((LLVM)) && echo lld)" \ CXX_LD="$( ((LLVM)) && echo lld)" \ DEB_BUILD_OPTIONS="$(awk '$1=$1' <<<"\ $( ((WITH_TESTS)) || echo nocheck) \ $( ((WITH_DOCS)) || echo nodoc) \ $( ((WITH_DEBUG)) && echo debug || echo nostrip) \ $( ! ((MESON_VERBOSE)) && echo terse) \ optimize=-lto \ hardening=-fortify \ ")" \ DEB_BUILD_PROFILES="$(awk '$1=$1' <<<"\ $( ((WITH_TESTS)) || echo nocheck) \ $( ((WITH_DOCS)) || echo nodoc) \ pkg.systemd.upstream \ ")" \ DEB_CFLAGS_APPEND="$MKOSI_CFLAGS $CFLAGS" \ DEB_CXXFLAGS_APPEND="$MKOSI_CFLAGS $CFLAGS" \ DEB_LDFLAGS_APPEND="$MKOSI_LDFLAGS $LDFLAGS" \ DPKG_FORCE="unsafe-io" \ DPKG_DEB_COMPRESSOR_TYPE="none" \ DH_MISSING="--fail-missing" \ CONFFLAGS_UPSTREAM="$MKOSI_MESON_OPTIONS $MESON_OPTIONS" \ GENSYMBOLS_LEVEL="$( ((LLVM)) && echo 0 || echo 1)" \ dpkg-buildpackage \ --no-pre-clean \ --unsigned-changes \ --build=binary EXIT_STATUS=$? # Make sure we don't reconfigure twice. MKOSI_MESON_OPTIONS="${MKOSI_MESON_OPTIONS//"--wipe"/}" return $EXIT_STATUS } if ! build; then # debhelper installs files for each package to debian/ so we figure out which files were # packaged by querying all the package names from debian/control and running find on each of the # corresponding package directory in debian/. grep "Package:" debian/control | sed "s/Package: //" | xargs -d '\n' -I {} sh -c "[ -d debian/{} ] && (cd debian/{} && find . ! -type d ! -path "*dh-exec*" -printf '%P\n')" | # Remove compression suffix from compressed manpages as the manpages in debian/tmp will be uncompressed. sed --regexp-extended 's/([0-9])\.gz$/\1/' | sort --unique >/tmp/packaged-files # We figure out the installed files by running find on debian/tmp/ which contains the files installed # by meson install. (cd debian/tmp/ && find . ! -type d ! -path "*dh-exec*" -printf '%P\n') >/tmp/installed-files if [[ -f debian/not-installed ]]; then grep --invert-match "^#" debian/not-installed >>/tmp/installed-files fi sort --unique --output /tmp/installed-files /tmp/installed-files # We get all the installed files that were not packaged by finding entries in the installed file that are # not in the packaged file. comm -23 /tmp/installed-files /tmp/packaged-files > /tmp/unpackaged-files # If there are no unpackaged files something else went wrong. if [[ ! -s /tmp/unpackaged-files ]]; then exit 1 fi # Otherwise, we append the unpackaged files to the filelist for the systemd package and retry the build. cat /tmp/unpackaged-files >>debian/systemd.install build fi ( shopt -s nullglob rm -f "$BUILDDIR"/*.deb "$BUILDDIR"/*.ddeb cp ../*.deb ../*.ddeb "$PACKAGEDIR" cp ../*.deb ../*.ddeb "$OUTPUTDIR" cp ../*.deb ../*.ddeb "$BUILDDIR" # These conflict with the packages that we actually want to install, so remove them rm -f "$BUILDDIR"/systemd-standalone-*.deb "$BUILDDIR"/systemd-standalone-*.ddeb )