From 02bfe0fa1bd886afd472b1c5d077cb14a3bd42e9 Mon Sep 17 00:00:00 2001 From: Daan De Meyer Date: Sat, 1 Jun 2024 12:27:45 +0200 Subject: [PATCH] mkosi: Add support for building with LLVM Now you can do mkosi -E LLVM=1 to build with clang+lld. This includes support for building with sanitizers. --- mkosi.images/system/mkosi.conf | 3 ++ .../mkosi.conf.d/10-arch/mkosi.build.chroot | 19 +++++++++++- .../system/mkosi.conf.d/10-arch/mkosi.conf | 2 ++ .../10-centos-fedora/mkosi.build.chroot | 31 ++++++++++++++++--- .../mkosi.conf.d/10-centos-fedora/mkosi.conf | 1 + .../10-debian-ubuntu/mkosi.build.chroot | 21 ++++++++++++- .../mkosi.conf.d/10-debian-ubuntu/mkosi.conf | 2 ++ .../10-opensuse/mkosi.build.chroot | 28 +++++++++++++++-- .../mkosi.conf.d/10-opensuse/mkosi.conf | 3 +- 9 files changed, 99 insertions(+), 11 deletions(-) diff --git a/mkosi.images/system/mkosi.conf b/mkosi.images/system/mkosi.conf index bc4d80cc05..7a52061276 100644 --- a/mkosi.images/system/mkosi.conf +++ b/mkosi.images/system/mkosi.conf @@ -26,6 +26,7 @@ Packages= attr bash-completion bpftrace + clang coreutils curl diffutils @@ -42,6 +43,8 @@ Packages= kmod knot less + lld + llvm lvm2 man mdadm diff --git a/mkosi.images/system/mkosi.conf.d/10-arch/mkosi.build.chroot b/mkosi.images/system/mkosi.conf.d/10-arch/mkosi.build.chroot index 7df218823e..12575eef6a 100755 --- a/mkosi.images/system/mkosi.conf.d/10-arch/mkosi.build.chroot +++ b/mkosi.images/system/mkosi.conf.d/10-arch/mkosi.build.chroot @@ -24,12 +24,29 @@ ln --symbolic . "pkg/$ID/src" # shellcheck source=/dev/null . /etc/makepkg.conf +CFLAGS="-O${OPTIMIZATION:-0} -Wp,-U_FORTIFY_SOURCE" +if ((LLVM)); then + # TODO: Remove -fno-sanitize-function when https://github.com/systemd/systemd/issues/29972 is fixed. + CFLAGS="$CFLAGS -shared-libasan -fno-sanitize=function" +fi + +LDFLAGS="" +if ((LLVM)) && [[ -n "$SANITIZERS" ]]; then + LDFLAGS="$LDFLAGS -Wl,-rpath=$(clang --print-file-name="")lib/linux" +fi + # Override the default options. Disable FORTIFY_SOURCE because it doesn't work with O0. We specifically # disable "strip", "zipman" and "lto" as they slow down builds significantly. OPTIONS= cannot be overridden # on the makepkg command line so we append to /etc/makepkg.conf instead. The rootfs is overlaid with a # writable tmpfs during the build script so these changes don't end up in the image itself. tee --append /etc/makepkg.conf >/dev/null <>debian/changelog.new mv debian/changelog.new debian/changelog +CFLAGS="-O${OPTIMIZATION:-0}" +if ((LLVM)); then + # TODO: Remove -fno-sanitize-function when https://github.com/systemd/systemd/issues/29972 is fixed. + CFLAGS="$CFLAGS -shared-libasan -fno-sanitize=function" +fi + +LDFLAGS="" +if ((LLVM)) && [[ -n "$SANITIZERS" ]]; then + LDFLAGS="$LDFLAGS -Wl,-rpath=$(clang --print-file-name="")lib/linux" +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) \ @@ -59,11 +75,14 @@ build() { $( ((WITH_DOCS)) || echo nodoc) \ pkg.systemd.upstream \ ")" \ - DEB_CFLAGS_APPEND="-O${OPTIMIZATION:-0}" \ + DEB_CFLAGS_APPEND="$CFLAGS" \ + DEB_CXXFLAGS_APPEND="$CFLAGS" \ + DEB_LDFLAGS_APPEND="$LDFLAGS" \ DPKG_FORCE="unsafe-io" \ DPKG_DEB_COMPRESSOR_TYPE="none" \ DH_MISSING="--fail-missing" \ CONFFLAGS_UPSTREAM="-D mode=developer -D b_sanitize=${SANITIZERS:-none}" \ + GENSYMBOLS_LEVEL="$( ((LLVM)) && echo 0 || echo 1)" \ dpkg-buildpackage \ --no-pre-clean \ --unsigned-changes \ diff --git a/mkosi.images/system/mkosi.conf.d/10-debian-ubuntu/mkosi.conf b/mkosi.images/system/mkosi.conf.d/10-debian-ubuntu/mkosi.conf index 6c0eda2bcd..386c1923a5 100644 --- a/mkosi.images/system/mkosi.conf.d/10-debian-ubuntu/mkosi.conf +++ b/mkosi.images/system/mkosi.conf.d/10-debian-ubuntu/mkosi.conf @@ -56,6 +56,7 @@ Packages= iputils-ping isc-dhcp-server libcap-ng-utils + libclang-rt-dev libtss2-rc0 libtss2-tcti-device0 locales @@ -83,6 +84,7 @@ Packages= InitrdPackages= btrfs-progs + libclang-rt-dev tpm2-tools InitrdVolatilePackages= diff --git a/mkosi.images/system/mkosi.conf.d/10-opensuse/mkosi.build.chroot b/mkosi.images/system/mkosi.conf.d/10-opensuse/mkosi.build.chroot index 13cda4c9b8..11be720453 100755 --- a/mkosi.images/system/mkosi.conf.d/10-opensuse/mkosi.build.chroot +++ b/mkosi.images/system/mkosi.conf.d/10-opensuse/mkosi.build.chroot @@ -42,9 +42,24 @@ DIST="$(rpm --eval %dist)" ARCH="$(rpm --eval %_arch)" SRCDEST="/usr/src/debug/systemd-$VERSION-${RELEASE}${DIST}.$ARCH" -EXTRA_CFLAGS="-O${OPTIMIZATION:-0} -Wp,-U_FORTIFY_SOURCE" +CFLAGS="-O${OPTIMIZATION:-0} -Wp,-U_FORTIFY_SOURCE" if ((WITH_DEBUG)); then - EXTRA_CFLAGS="$EXTRA_CFLAGS -fdebug-prefix-map=../src=$SRCDEST" + CFLAGS="$CFLAGS -fdebug-prefix-map=../src=$SRCDEST" +fi +if ((LLVM)); then + # TODO: Remove -fno-sanitize-function when https://github.com/systemd/systemd/issues/29972 is fixed. + CFLAGS="$CFLAGS -shared-libasan -fno-sanitize=function" +fi + +LDFLAGS="$(rpm --eval "%{?build_ldflags}") $LDFLAGS" +if ((LLVM)) && [[ -n "$SANITIZERS" ]]; then + LDFLAGS="$LDFLAGS -Wl,-rpath=$(clang --print-file-name="")lib/linux" +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 "${LDFLAGS// }" ]]; then + LDFLAGS="%{nil}" fi build() { @@ -54,6 +69,11 @@ build() { # TODO: Replace __meson_auto_features override with meson_extra_configure_options once the suse spec # starts to use it. # shellcheck disable=SC2046 + env \ + CC="$( ((LLVM)) && echo clang || echo gcc)" \ + CXX="$( ((LLVM)) && echo clang++ || echo g++)" \ + CC_LD="$( ((LLVM)) && echo lld)" \ + CXX_LD="$( ((LLVM)) && echo lld)" \ rpmbuild \ -bb \ --build-in-place \ @@ -70,7 +90,9 @@ build() { --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) $EXTRA_CFLAGS" \ + --define "build_cflags $(rpm --eval "%{?build_cflags}") $CFLAGS" \ + --define "build_cxxflags $(rpm --eval "%{?build_cxxflags}") $CFLAGS" \ + --define "build_ldflags $LDFLAGS" \ --define "meson_build %{shrink:%{__meson} compile -C %{_vpath_builddir} -j %{_smp_build_ncpus} %{nil}}" \ --define "meson_install %{shrink:DESTDIR=%{buildroot} %{__meson} install -C %{_vpath_builddir} --no-rebuild --quiet %{nil}}" \ --define "__meson_auto_features auto -D mode=developer -D b_sanitize=${SANITIZERS:-none}" \ diff --git a/mkosi.images/system/mkosi.conf.d/10-opensuse/mkosi.conf b/mkosi.images/system/mkosi.conf.d/10-opensuse/mkosi.conf index 188f548643..71e315f869 100644 --- a/mkosi.images/system/mkosi.conf.d/10-opensuse/mkosi.conf +++ b/mkosi.images/system/mkosi.conf.d/10-opensuse/mkosi.conf @@ -39,8 +39,8 @@ Packages= docbook-xsl-stylesheets f2fs-tools gawk - git-core gcc-c++ + git-core glibc-locale-base gnutls grep @@ -90,6 +90,7 @@ Packages= InitrdPackages= btrfs-progs + clang kmod libkmod2 tpm2.0-tools -- 2.25.1