From 93c6023eb8de8b4d813f8cfadf723c17e5a464ea Mon Sep 17 00:00:00 2001 From: wangjunqiang Date: Wed, 22 Mar 2023 11:42:15 +0800 Subject: [PATCH] add clang build support backport from redhat-rpm-config-252-1.2.riscv64 use %toolchain switch gcc and clang define %toolchain in OBS project config Macros body ``` Macros: %toolchain clang %_lto_cflags %{nil} :Macros ``` set %_lto_cflags to %{nil} on all packages also, implement mixed compilation by using follow define ``` Macros: %_lto_cflags %{nil} %__toolchain_python3 gcc %package_toolchain %{expand:%%{__toolchain_%{name}}} %toolchain %["%{package_toolchain}" == "gcc" ? "gcc" : "clang" ] :Macros ``` use gcc building python3 and clang on other packages --- backport-clang-build-support.patch | 263 +++++++++++++++++++++++++++++ openEuler-rpm-config.spec | 8 +- 2 files changed, 269 insertions(+), 2 deletions(-) create mode 100644 backport-clang-build-support.patch diff --git a/backport-clang-build-support.patch b/backport-clang-build-support.patch new file mode 100644 index 0000000..b735f8a --- /dev/null +++ b/backport-clang-build-support.patch @@ -0,0 +1,263 @@ +diff --git a/brp-llvm-compile-lto-elf b/brp-llvm-compile-lto-elf +new file mode 100644 +index 0000000..93dad4c +--- /dev/null ++++ b/brp-llvm-compile-lto-elf +@@ -0,0 +1,46 @@ ++#!/bin/bash -eu ++ ++ ++if [ -z "$RPM_BUILD_ROOT" ] || [ "$RPM_BUILD_ROOT" = "/" ]; then ++ exit 0 ++fi ++ ++CLANG_FLAGS=$@ ++NCPUS=${RPM_BUILD_NCPUS:-1} ++ ++check_convert_bitcode () { ++ local file_name=$(realpath ${1}) ++ local file_type=$(file ${file_name}) ++ ++ shift ++ CLANG_FLAGS="$@" ++ ++ if [[ "${file_type}" == *"LLVM IR bitcode"* ]]; then ++ # check for an indication that the bitcode was ++ # compiled with -flto ++ llvm-bcanalyzer -dump ${file_name} | grep -xP '.*\-flto((?!-fno-lto).)*' 2>&1 > /dev/null ++ if [ $? -eq 0 ]; then ++ echo "Compiling LLVM bitcode file ${file_name}." ++ clang ${CLANG_FLAGS} -fno-lto -Wno-unused-command-line-argument \ ++ -x ir ${file_name} -c -o ${file_name} ++ fi ++ elif [[ "${file_type}" == *"current ar archive"* ]]; then ++ echo "Unpacking ar archive ${file_name} to check for LLVM bitcode components." ++ # create archive stage for objects ++ local archive_stage=$(mktemp -d) ++ local archive=${file_name} ++ pushd ${archive_stage} ++ ar x ${archive} ++ for archived_file in $(find -not -type d); do ++ check_convert_bitcode ${archived_file} ${CLANG_FLAGS} ++ echo "Repacking ${archived_file} into ${archive}." ++ ar r ${archive} ${archived_file} ++ done ++ popd ++ fi ++} ++ ++echo "Checking for LLVM bitcode artifacts" ++export -f check_convert_bitcode ++find "$RPM_BUILD_ROOT" -type f -name "*.[ao]" -print0 | \ ++ xargs -0 -r -n1 -P$NCPUS sh -c "check_convert_bitcode \$@ $CLANG_FLAGS" ARG0 +diff --git a/brp-strip-lto b/brp-strip-lto +new file mode 100644 +index 0000000..8890541 +--- /dev/null ++++ b/brp-strip-lto +@@ -0,0 +1,17 @@ ++#!/usr/bin/sh ++# If using normal root, avoid changing anything. ++if [ -z "$RPM_BUILD_ROOT" ] || [ "$RPM_BUILD_ROOT" = "/" ]; then ++ exit 0 ++fi ++ ++STRIP=${1:-strip} ++NCPUS=${RPM_BUILD_NCPUS:-1} ++ ++case `uname -a` in ++Darwin*) exit 0 ;; ++*) ;; ++esac ++ ++# Strip ELF binaries ++find "$RPM_BUILD_ROOT" -type f -name '*.[ao]' \! -regex "$RPM_BUILD_ROOT/*usr/lib/debug.*" -print0 | \ ++ eu-elfclassify --not-program --not-library --not-linux-kernel-module --stdin0 --print0 | xargs -0 -r -P$NCPUS -n32 sh -c "$STRIP -p -R .gnu.lto_* -R .gnu.debuglto_* -N __gnu_lto_v1 \"\$@\"" ARG0 +diff --git a/generic-hardened-clang.cfg b/generic-hardened-clang.cfg +new file mode 100644 +index 0000000..b570eb5 +--- /dev/null ++++ b/generic-hardened-clang.cfg +@@ -0,0 +1 @@ ++-fPIE +diff --git a/macros b/macros +index 65d1365..ac93068 100644 +--- a/macros ++++ b/macros +@@ -23,20 +23,60 @@ + + %_build_id_links none + ++# GCC toolchain ++%__cc_gcc gcc ++%__cxx_gcc g++ ++%__cpp_gcc gcc -E ++ ++# Clang toolchain ++%__cc_clang clang ++%__cxx_clang clang++ ++%__cpp_clang clang-cpp ++ ++# Default to the GCC toolchain ++%toolchain gcc ++ ++%__cc %{expand:%%{__cc_%{toolchain}}} ++%__cxx %{expand:%%{__cxx_%{toolchain}}} ++%__cpp %{expand:%%{__cpp_%{toolchain}}} ++ ++# Compiler macros to use for invoking compilers in spec files for packages that ++# want to use the default compiler and don't care which compiler that is. ++%build_cc %{__cc} ++%build_cxx %{__cxx} ++%build_cpp %{__cpp} ++ + #============================================================================== + # ---- compiler flags. + +-%build_cflags %{optflags} +-%build_cxxflags %{optflags} -fexceptions +-%build_fflags %{optflags} -fexceptions -I%{_fmoddir} +-%build_ldflags -Wl,-z,relro %{_ld_as_needed_flags} %{_ld_symbols_flags} %{_hardened_ldflags} ++%build_cflags %{optflags} %{?_distro_extra_cflags} ++%build_cxxflags %{optflags} -fexceptions %{?_distro_extra_cxxflags} ++%build_fflags %{optflags} -fexceptions -I%{_fmoddir} %{?_distro_extra_fflags} ++%_clang_extra_ldflags %{?_lto_cflags} -fno-openmp-implicit-rpath ++%build_ldflags -Wl,-z,relro %{_ld_as_needed_flags} %{_ld_symbols_flags} %{_hardened_ldflags} %[ "%{toolchain}" == "clang" ? "%{?_clang_extra_ldflags}" : "" ] %{_build_id_flags} %{?_package_note_flags} %{?_distro_extra_ldflags} + + %set_build_flags \ + CFLAGS="${CFLAGS:-%{build_cflags}}" ; export CFLAGS ; \ + CXXFLAGS="${CXXFLAGS:-%{build_cxxflags}}" ; export CXXFLAGS ; \ + FFLAGS="${FFLAGS:-%{build_fflags}}" ; export FFLAGS ; \ + FCFLAGS="${FCFLAGS:-%{build_fflags}}" ; export FCFLAGS ; \ +- LDFLAGS="${LDFLAGS:-%{build_ldflags}}" ; export LDFLAGS ++ LDFLAGS="${LDFLAGS:-%{build_ldflags}}" ; export LDFLAGS ; \ ++ LT_SYS_LIBRARY_PATH="${LT_SYS_LIBRARY_PATH:-%_libdir:}" ; export LT_SYS_LIBRARY_PATH ; \ ++ CC="${CC:-%{__cc}}" ; export CC ; \ ++ CCC="${CCC:-%{__cxx}}" ; export CCC ; \ ++ CXX="${CXX:-%{__cxx}}" ; export CXX ++ ++# Automatically use set_build_flags macro for build, check, and ++# install phases. ++# Use "%undefine _auto_set_build_flags" to disable" ++%_auto_set_build_flags 1 ++%__spec_build_pre %{___build_pre} \ ++ %{?_auto_set_build_flags:%{set_build_flags}} \ ++ %{?_generate_package_note_file} ++ ++%__spec_check_pre %{___build_pre} \ ++ %{?_auto_set_build_flags:%{set_build_flags}} \ ++ %{?_generate_package_note_file} + + #For backwards compatibility only. + %__global_cflags %{build_cflags} +@@ -65,8 +105,23 @@ + %{__cp} -fv /usr/lib/rpm/%{_vendor}/$(basename $i) $i ; \ + done ; + ++%_fix_broken_configure_for_lto \ ++ for file in $(find . -type f -name configure -print); do \ ++ %{__sed} -r --in-place=.backup 's/^char \\(\\*f\\) \\(\\) = /__attribute__ ((used)) char (*f) () = /g' $file; \ ++ diff -u $file.backup $file && mv $file.backup $file \ ++ %{__sed} -r --in-place=.backup 's/^char \\(\\*f\\) \\(\\);/__attribute__ ((used)) char (*f) ();/g' $file; \ ++ diff -u $file.backup $file && mv $file.backup $file \ ++ %{__sed} -r --in-place=.backup 's/^char \\$2 \\(\\);/__attribute__ ((used)) char \\$2 ();/g' $file; \ ++ diff -u $file.backup $file && mv $file.backup $file \ ++ %{__sed} --in-place=.backup '1{$!N;$!N};$!N;s/int x = 1;\\nint y = 0;\\nint z;\\nint nan;/volatile int x = 1; volatile int y = 0; volatile int z, nan;/;P;D' $file; \ ++ diff -u $file.backup $file && mv $file.backup $file \ ++ %{__sed} --in-place=.backup 's#^lt_cv_sys_global_symbol_to_cdecl=.*#lt_cv_sys_global_symbol_to_cdecl="sed -n -e '"'"'s/^T .* \\\\(.*\\\\)$/extern int \\\\1();/p'"'"' -e '"'"'s/^$symcode* .* \\\\(.*\\\\)$/extern char \\\\1;/p'"'"'"#' $file; \ ++ diff -u $file.backup $file && mv $file.backup $file \ ++ done ++ + %configure \ + %{set_build_flags}; \ ++ [ "%{_lto_cflags}"x != x ] && %{_fix_broken_configure_for_lto}; \ + [ "%_configure_gnuconfig_hack" = 1 ] && for i in $(find $(dirname %{_configure}) -name config.guess -o -name config.sub) ; do \ + [ -f /usr/lib/rpm/%{_vendor}/$(basename $i) ] && %{__rm} -f $i && %{__cp} -fv /usr/lib/rpm/%{_vendor}/$(basename $i) $i ; \ + done ; \ +@@ -98,6 +153,7 @@ + [ "$RPM_BUILD_ROOT" != "/" ] && rm -rf "${RPM_BUILD_ROOT}"\ + mkdir -p `dirname "$RPM_BUILD_ROOT"`\ + mkdir "$RPM_BUILD_ROOT"\ ++ %{?_auto_set_build_flags:%{set_build_flags}}\ + %{nil} + + # ---- Expanded at end of %install scriptlet. +@@ -109,11 +165,14 @@ + %__brp_ldconfig /usr/lib/rpm/brp-ldconfig + %__brp_compress /usr/lib/rpm/brp-compress + %__brp_strip /usr/lib/rpm/brp-strip %{__strip} ++%__brp_strip_lto /usr/lib/rpm/brp-strip-lto %{__strip} + %__brp_strip_comment_note /usr/lib/rpm/brp-strip-comment-note %{__strip} %{__objdump} + %__brp_strip_static_archive /usr/lib/rpm/brp-strip-static-archive %{__strip} + %__brp_python_bytecompile /usr/lib/rpm/brp-python-bytecompile "%{__python}" "%{?_python_bytecompile_errors_terminate_build}" "%{?_python_bytecompile_extra}" + %__brp_python_hardlink /usr/lib/rpm/brp-python-hardlink + ++%__brp_llvm_compile_lto_elf /usr/lib/rpm/brp-llvm-compile-lto-elf %{build_cflags} %{build_ldflags} ++ + %__os_install_post \ + %{?__brp_ldconfig} \ + %{?__brp_compress} \ +@@ -121,6 +180,7 @@ + %{?__brp_strip} \ + %{?__brp_strip_comment_note} \ + } \ ++ %{?_lto_cflags:%{?__brp_strip_lto}} \ + %{?__brp_strip_static_archive} \ + %{?py_auto_byte_compile:%{?__brp_python_bytecompile}} \ + %{?__brp_python_hardlink} \ +@@ -128,6 +188,7 @@ + %{nil} + + %__spec_install_post\ ++ [ "%{_lto_cflags}"x != x ] && %[ "%{toolchain}" == "clang" ? "%{?__brp_llvm_compile_lto_elf}" : "%{nil}" ] \ + %{?__debug_package:%{__debug_install_post}}\ + %{__arch_install_post}\ + %{__os_install_post}\ +@@ -162,8 +223,10 @@ + # secure options for rpmbuild + # + # #hardened options +-%_hardening_cflags -specs=/usr/lib/rpm/generic-hardened-cc1 +-%_hardening_ldflags -Wl,-z,now -specs=/usr/lib/rpm/generic-hardened-ld ++%_hardening_gcc_cflags -specs=/usr/lib/rpm/generic-hardened-cc1 ++%_hardening_clang_cflags --config /usr/lib/rpm/generic-hardened-clang.cfg ++%_hardening_cflags %{expand:%%{_hardening_%{toolchain}_cflags}} -fstack-protector-strong ++%_hardening_ldflags -Wl,-z,now %[ "%{toolchain}" == "gcc" ? "-specs=/usr/lib/rpm/generic-hardened-ld" : "" ] + # Use "%undefine _hardened_build" to disable. + %_hardened_build 1 + %_hardened_cflags %{?_hardened_build:%{_hardening_cflags}} +@@ -195,7 +258,18 @@ + #%_ld_as_needed 1 + %_ld_as_needed_flags %{?_ld_as_needed:-Wl,--as-needed} + +-%__global_compiler_flags -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fstack-protector-strong -grecord-gcc-switches %{_hardened_cflags} ++ ++%_gcc_lto_cflags -flto=auto -ffat-lto-objects ++%_clang_lto_cflags -flto ++%_lto_cflags %{expand:%%{_%{toolchain}_lto_cflags}} ++ ++%_build_id_flags -Wl,--build-id=sha1 ++ ++%_general_options -O2 %{?_lto_cflags} -fexceptions -g -grecord-gcc-switches -pipe ++%_warning_options -Wall -Werror=format-security ++%_preprocessor_defines -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS ++ ++%__global_compiler_flags %{_general_options} %{_warning_options} %{_preprocessor_defines} %{_hardened_cflags} + + # Automatically trim changelog entries after 2 years + %_changelog_trimtime %{lua:print(os.time() - 2 * 365 * 86400)} +diff --git a/rpmrc b/rpmrc +index 8ba756d..ed8ae60 100644 +--- a/rpmrc ++++ b/rpmrc +@@ -5,8 +5,8 @@ optflags: athlon %{__global_compiler_flags} -m32 -march=athlon -fasynchronous-un + optflags: ia64 %{__global_compiler_flags} + optflags: x86_64 %{__global_compiler_flags} -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection + +-optflags: aarch64 %{__global_compiler_flags} -fasynchronous-unwind-tables -fstack-clash-protection +-optflags: riscv64 %{__global_compiler_flags} -fasynchronous-unwind-tables -fstack-clash-protection ++optflags: aarch64 %{__global_compiler_flags} -fasynchronous-unwind-tables %[ "%{toolchain}" == "gcc" ? "-fstack-clash-protection" : "" ] ++optflags: riscv64 %{__global_compiler_flags} -fasynchronous-unwind-tables %[ "%{toolchain}" == "gcc" ? "-fstack-clash-protection" : "" ] + + buildarchtranslate: athlon: i686 + buildarchtranslate: geode: i686 diff --git a/openEuler-rpm-config.spec b/openEuler-rpm-config.spec index fb07902..c9ecd02 100644 --- a/openEuler-rpm-config.spec +++ b/openEuler-rpm-config.spec @@ -3,7 +3,7 @@ Name: %{vendor}-rpm-config Version: 30 -Release: 39 +Release: 40 License: GPL+ Summary: specific rpm configuration files URL: https://gitee.com/openeuler/openEuler-rpm-config @@ -30,6 +30,7 @@ Patch16: fix-config-error-for-loongarch64.patch Patch17: Feature-support-EBS-sign-for-IMA-digest-list.patch Patch18: fix-brp-ldconfig-riscv-default-library-directory.patch Patch19: add-pyproject-macros.patch +Patch20: backport-clang-build-support.patch Provides: python-rpm-macros = %{?epoch:%{epoch}:}%{version}-%{release} Provides: python2-rpm-macros = %{?epoch:%{epoch}:}%{version}-%{release} @@ -141,6 +142,9 @@ sed -i "s/__vendor/%{vendor}/g" `grep "__vendor" -rl %{buildroot}%{_rpmconfigdir %{rpmvdir}/find-requires.ksyms %changelog +* Fri May 18 2023 wangjunqiang - 30-40 +- add clang build support + * Thu May 11 2023 caodongxia - 30-39 - improve pyproject_install macro @@ -190,7 +194,7 @@ sed -i "s/__vendor/%{vendor}/g" `grep "__vendor" -rl %{buildroot}%{_rpmconfigdir - update the definition of python3_version * Wed Oct 13 2021 wangkerong - 30-23 -- add common lua scripts resolve "%fontpkg" macro translation failure +- add common lua scripts resolve "%fontpkg" macro translation failure * Sat Sep 4 2021 yangmingtai - 30-22 - add brp scripts to delete rpath -- Gitee