summaryrefslogtreecommitdiffstats
path: root/mkosi.images/build/mkosi.conf.d/opensuse/mkosi.build.chroot
blob: 9043ef6746c839a52f4e2b41fd16facbfd240605 (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
#!/bin/bash
# SPDX-License-Identifier: LGPL-2.1-or-later
set -e

. mkosi.functions

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
    exit 1
fi

TS="${SOURCE_DATE_EPOCH:-$(date +%s)}"

# 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$//' {} \;

if [[ "$(rpm --eval "%{lua:print(rpm.vercmp('$(rpm --version | cut -d ' ' -f3)', '4.20'))}")" == "-1" ]]; then
    # Fix the %install override so debuginfo packages are generated.
    tee --append /usr/lib/rpm/suse/macros <<'EOF'
%install %{debug_package}\
%%install\
%{nil}
EOF
fi

VERSION="$(cat meson.version)"
RELEASE="$(date "+%Y%m%d%H%M%S" --date "@$TS")"

MKOSI_CFLAGS="-O0 -Wp,-U_FORTIFY_SOURCE"
if ((WITH_DEBUG)); then
    MKOSI_CFLAGS="$MKOSI_CFLAGS -fdebug-prefix-map=../src=/usr/src/debug/systemd"
fi
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="$(rpm --eval "%{?build_ldflags}")"
if ((LLVM)) && [[ -n "$SANITIZERS" ]]; then
    MKOSI_LDFLAGS="$MKOSI_LDFLAGS -Wl,-rpath=$(realpath "$(clang --print-runtime-dir)")"
fi

# A macro can't have an empty body and currently opensuse does not specify any of its own linker flags so
# set LDFLAGS to %{nil} if there are no linker flags.
if [[ -z "${MKOSI_LDFLAGS// }" ]]; then
    MKOSI_LDFLAGS="%{nil}"
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 when the spec is fixed (either the patch is adapted or not applied when building for upstream).
sed --in-place '/0009-pid1-handle-console-specificities-weirdness-for-s390.patch/d' "pkg/$PKG_SUBDIR/systemd.spec"

build() {
    IFS=
    # shellcheck disable=SC2046
    env \
    --unset CFLAGS \
    --unset CXXFLAGS \
    --unset LDFLAGS \
    CC="$( ((LLVM)) && echo clang || echo gcc)" \
    CXX="$( ((LLVM)) && echo clang++ || echo g++)" \
    CC_LD="$( ((LLVM)) && echo lld)" \
    CXX_LD="$( ((LLVM)) && echo lld)" \
    rpmbuild \
        -bb \
        --noprep \
        --build-in-place \
        --with upstream \
        $( ((WITH_TESTS)) || echo "--nocheck") \
        --define "_topdir /var/tmp" \
        --define "_sourcedir $PWD/pkg/$PKG_SUBDIR" \
        --define "_rpmdir $BUILDDIR" \
        ${BUILDDIR:+"--define=_vpath_builddir $BUILDDIR"} \
        --define "_build_name_fmt %%{NAME}-%%{VERSION}-%%{RELEASE}.%%{ARCH}.rpm" \
        --define "_binary_payload w.ufdio" \
        $( ((WITH_DEBUG)) || echo "--define=debug_package %{nil}") \
        --define "vendor openSUSE" \
        --define "version_override $VERSION" \
        --define "release_override $RELEASE" \
        --define "__check_files sh -c '$(rpm --define "_topdir /var/tmp" --eval %__check_files) | tee /tmp/unpackaged-files'" \
        --define "build_cflags $(rpm --eval "%{?build_cflags}") $MKOSI_CFLAGS $CFLAGS" \
        --define "build_cxxflags $(rpm --eval "%{?build_cxxflags}") $MKOSI_CFLAGS $CFLAGS" \
        --define "build_ldflags $MKOSI_LDFLAGS $LDFLAGS" \
        $( ((MESON_VERBOSE)) || echo "--undefine=__meson_verbose") \
        --define "meson_extra_configure_options $MKOSI_MESON_OPTIONS $MESON_OPTIONS" \
        --define "__os_install_post /usr/lib/rpm/brp-suse %{nil}" \
        --define "__elf_exclude_path ^/usr/lib/systemd/tests/unit-tests/.*$" \
        --define "__script_requires %{nil}" \
        --define "_find_debuginfo_dwz_opts %{nil}" \
        --define "_find_debuginfo_opts --unique-debug-src-base \"%{name}\"" \
        --noclean \
        "$@" \
        "pkg/$PKG_SUBDIR/systemd.spec"

    EXIT_STATUS=$?

    # Make sure we don't reconfigure twice.
    MKOSI_MESON_OPTIONS="${MKOSI_MESON_OPTIONS//"--wipe"/}"

    return $EXIT_STATUS
}

(
    shopt -s nullglob
    rm -f "$BUILDDIR"/*.rpm
)

if ! build; then
    if [[ ! -s /tmp/unpackaged-files ]]; then
        exit 1
    fi

    # rpm will append to any existing systemd.lang so delete it explicitly so we don't get duplicate file
    # warnings.
    rm systemd.lang

    grep -v ".debug" /tmp/unpackaged-files >>"pkg/$PKG_SUBDIR/files.systemd"
    build --noprep --nocheck
fi

cp "$BUILDDIR"/*.rpm "$PACKAGEDIR"

make_sysext_unsigned /var/tmp/BUILD/*/BUILDROOT