summaryrefslogtreecommitdiffstats
path: root/mkosi.images/build/mkosi.conf.d/debian-ubuntu/mkosi.build.chroot
blob: fc9c796ad27858f12fe80b9adf830db6ff13b746 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#!/bin/bash
# SPDX-License-Identifier: LGPL-2.1-or-later
set -e

# 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/$ID/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 <<EOF
systemd ($(cat meson.version)-$(date "+%Y%m%d%H%M%S" --date "@$TS")) UNRELEASED; urgency=low

  * Automatic build from mkosi

 -- systemd test <systemd-devel@lists.freedesktop.org>  $(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/<package> 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
)