From 578aa7faf39c3eefb6002e07abc2b840510f89f5 Mon Sep 17 00:00:00 2001 From: Funda Wang Date: Sun, 25 Aug 2024 18:44:35 +0800 Subject: [PATCH] merge two messy repositories --- 0001-1-Add-riscv64-to-golang_arches.patch | 27 - 0001-add-loongarch64-for-golang_arches.patch | 25 - 30.tar.gz | Bin 51259 -> 0 bytes ...t-for-selecting-clang-as-a-toolchain.patch | 113 - ...lags-cc-before-build-check-and-insta.patch | 49 - Delete-the-commented-code.patch | 24 - ...support-EBS-sign-for-IMA-digest-list.patch | 326 --- Fix-a-typo-in-brp-digest-list.patch | 26 - ...thon3_version-macros-for-Python-3.10.patch | 30 - ...hen-using-kabi-outside-our-stablelis.patch | 240 -- add-brp-scripts-to-delete-rpath.patch | 145 - add-common-script.patch | 313 --- ...port-for-config.guess-and-config.sub.patch | 26 - add-loongarch64-to-generic_arches.patch | 13 - add-powerpc64le-and-ppc64le-support.patch | 39 - add-pyproject-macros.patch | 42 - add-pytest-and-tox-macros.patch | 42 - add-riscv64-to-some-arches-macro.patch | 41 - backport-Enable-as-needed-by-default.patch | 31 - backport-kmp-feature.patch | 485 ---- brp-chrpath | 104 + brp-digest-list | 98 + brp-ebs-sign | 238 ++ brp-ldconfig | 16 + ...the-vendor-to-generic-for-common-use.patch | 109 - ...s-a-symbolic-link-in-brp-digest-list.patch | 25 - common.lua | 294 ++ config.guess | 1815 +++++++++++++ config.sub | 2354 +++++++++++++++++ ...nd-EFI-files-in-digest-list-building.patch | 74 - find-requires | 38 + find-requires.ksyms | 155 ++ ...nfig-riscv-default-library-directory.patch | 15 - fix-config-error-for-loongarch64.patch | 25 - fix-error-message-for-kmodtool.patch | 25 - ...ile-cannot-be-found-due-to-escape-of.patch | 25 - ...-a-bug-that-missing_-p-in-macros.kmp.patch | 37 - generic-hardened-cc1 | 2 + generic-hardened-clang.cfg | 1 + generic-hardened-ld | 2 + generic-pie-cc1 | 2 + generic-pie-ld | 2 + generic-rpm-config.yaml | 2 +- kmodtool | 281 ++ macros | 395 +++ macros.forge | 283 ++ macros.go | 170 ++ macros.kmp | 64 + macros.perl | 151 ++ macros.python | 328 +++ ...d-optflags-for-loongarch64-and-sw_64.patch | 26 - openEuler-rpm-config.spec | 134 +- remove-fexceptions.patch | 36 - rpmrc | 25 + ...guess-and-config.sub-for-loongarch64.patch | 39 - 55 files changed, 6896 insertions(+), 2531 deletions(-) delete mode 100644 0001-1-Add-riscv64-to-golang_arches.patch delete mode 100644 0001-add-loongarch64-for-golang_arches.patch delete mode 100644 30.tar.gz delete mode 100644 Add-support-for-selecting-clang-as-a-toolchain.patch delete mode 100644 Call-set_build_flags-cc-before-build-check-and-insta.patch delete mode 100644 Delete-the-commented-code.patch delete mode 100644 Feature-support-EBS-sign-for-IMA-digest-list.patch delete mode 100644 Fix-a-typo-in-brp-digest-list.patch delete mode 100644 Fix-python3_version-macros-for-Python-3.10.patch delete mode 100644 Give-a-warning-when-using-kabi-outside-our-stablelis.patch delete mode 100644 add-brp-scripts-to-delete-rpath.patch delete mode 100644 add-common-script.patch delete mode 100644 add-loongarch64-support-for-config.guess-and-config.sub.patch delete mode 100644 add-loongarch64-to-generic_arches.patch delete mode 100644 add-powerpc64le-and-ppc64le-support.patch delete mode 100644 add-pyproject-macros.patch delete mode 100644 add-pytest-and-tox-macros.patch delete mode 100644 add-riscv64-to-some-arches-macro.patch delete mode 100644 backport-Enable-as-needed-by-default.patch delete mode 100644 backport-kmp-feature.patch create mode 100755 brp-chrpath create mode 100755 brp-digest-list create mode 100755 brp-ebs-sign create mode 100755 brp-ldconfig delete mode 100644 change-the-vendor-to-generic-for-common-use.patch delete mode 100644 check-if-the-file-is-a-symbolic-link-in-brp-digest-list.patch create mode 100644 common.lua create mode 100755 config.guess create mode 100755 config.sub delete mode 100644 exclude-kernel-source-and-EFI-files-in-digest-list-building.patch create mode 100755 find-requires create mode 100755 find-requires.ksyms delete mode 100644 fix-brp-ldconfig-riscv-default-library-directory.patch delete mode 100644 fix-config-error-for-loongarch64.patch delete mode 100644 fix-error-message-for-kmodtool.patch delete mode 100644 fix-the-ELF-file-cannot-be-found-due-to-escape-of.patch delete mode 100644 fixed-a-bug-that-missing_-p-in-macros.kmp.patch create mode 100644 generic-hardened-cc1 create mode 100644 generic-hardened-clang.cfg create mode 100644 generic-hardened-ld create mode 100644 generic-pie-cc1 create mode 100644 generic-pie-ld create mode 100755 kmodtool create mode 100644 macros create mode 100644 macros.forge create mode 100644 macros.go create mode 100644 macros.kmp create mode 100644 macros.perl create mode 100644 macros.python delete mode 100644 openEuler-rpm-config-add-optflags-for-loongarch64-and-sw_64.patch delete mode 100644 remove-fexceptions.patch create mode 100644 rpmrc delete mode 100644 update-config.guess-and-config.sub-for-loongarch64.patch diff --git a/0001-1-Add-riscv64-to-golang_arches.patch b/0001-1-Add-riscv64-to-golang_arches.patch deleted file mode 100644 index e52a168..0000000 --- a/0001-1-Add-riscv64-to-golang_arches.patch +++ /dev/null @@ -1,27 +0,0 @@ -From c1b9fdaa93bfe0b2c70be4a851500d15f891d2f8 Mon Sep 17 00:00:00 2001 -From: whoisxxx -Date: Sat, 28 Nov 2020 11:02:21 +0800 -Subject: [PATCH] !1 Add "riscv64" to golang_arches The golang version 1.14 has - support riscv64, so add "riscv64" to golang_arches to enable rpmbuild for - golang. - ---- - macros.go | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/macros.go b/macros.go -index c1e6e75..cd493e7 100644 ---- a/macros.go -+++ b/macros.go -@@ -12,7 +12,7 @@ - # redhat-rpm-macros. - - # Define arches for PA and SA --%golang_arches %{ix86} x86_64 %{arm} aarch64 ppc64le s390x -+%golang_arches %{ix86} x86_64 %{arm} aarch64 ppc64le s390x riscv64 - %gccgo_arches %{mips} - %go_arches %{golang_arches} %{gccgo_arches} - --- -1.8.3.1 - diff --git a/0001-add-loongarch64-for-golang_arches.patch b/0001-add-loongarch64-for-golang_arches.patch deleted file mode 100644 index 4623504..0000000 --- a/0001-add-loongarch64-for-golang_arches.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 28921237101c986eeee13808a1167db13dc788ce Mon Sep 17 00:00:00 2001 -From: Wenlong Zhang -Date: Tue, 13 Dec 2022 12:07:10 +0000 -Subject: [PATCH] add loongarch64 for golang_arches - ---- - macros.go | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/macros.go b/macros.go -index cd493e7..f20f6a1 100644 ---- a/macros.go -+++ b/macros.go -@@ -12,7 +12,7 @@ - # redhat-rpm-macros. - - # Define arches for PA and SA --%golang_arches %{ix86} x86_64 %{arm} aarch64 ppc64le s390x riscv64 -+%golang_arches %{ix86} x86_64 %{arm} aarch64 ppc64le s390x riscv64 loongarch64 - %gccgo_arches %{mips} - %go_arches %{golang_arches} %{gccgo_arches} - --- -2.33.0 - diff --git a/30.tar.gz b/30.tar.gz deleted file mode 100644 index 4e34bc69960eae731facc066c41a91ee4d4606f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51259 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ⅈ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 -Date: Tue, 9 Jan 2024 20:39:10 +0800 -Subject: [PATCH 1/2] Add support for selecting clang as a toolchain - ---- - generic-hardened-clang.cfg | 1 + - macros | 56 ++++++++++++++++++++++++++++++++++++-- - 2 files changed, 57 insertions(+), 3 deletions(-) - create mode 100644 generic-hardened-clang.cfg - -diff --git a/generic-hardened-clang.cfg b/generic-hardened-clang.cfg -new file mode 100644 -index 0000000..ac596df ---- /dev/null -+++ b/generic-hardened-clang.cfg -@@ -0,0 +1 @@ -+-fPIE -\ No newline at end of file -diff --git a/macros b/macros -index 5fdaf0a..0062126 100755 ---- a/macros -+++ b/macros -@@ -23,6 +23,46 @@ - - %_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 -+# -+# It is enough to override `toolchain` macro and all relevant macro for C/C++ -+# compilers will be switched. Either in the spec or in the command-line. -+# -+# %global toolchain clang -+# -+# or: -+# -+# rpmbuild -D "toolchain clang" … -+# -+# Inside a spec file it is also possible to determine which toolchain is in use -+# by testing the same macro. For example: -+# -+# %if "%{toolchain}" == "gcc" -+# BuildRequires: gcc -+# %endif -+# -+# or: -+# -+# %if "%{toolchain}" == "clang" -+# BuildRequires: clang compiler-rt -+# %endif -+# -+%toolchain gcc -+ -+%__cc %{expand:%%{__cc_%{toolchain}}} -+%__cxx %{expand:%%{__cxx_%{toolchain}}} -+%__cpp %{expand:%%{__cpp_%{toolchain}}} -+ - #============================================================================== - # ---- compiler flags. - -@@ -31,7 +71,13 @@ - %build_fflags %{optflags} -fexceptions -I%{_fmoddir} - %build_ldflags -Wl,-z,relro %{_ld_as_needed_flags} %{_ld_symbols_flags} %{_hardened_ldflags} - -+%set_build_cc \ -+ CC=%{__cc}; export CC ; \ -+ CXX=%{__cxx}; export CXX ; \ -+ CCC="${CCC:-%{__cxx}}" ; export CCC -+ - %set_build_flags \ -+ %[ "%{toolchain}" == "gcc" ? "" : "%{set_build_cc};" ] \ - CFLAGS="${CFLAGS:-%{build_cflags}}" ; export CFLAGS ; \ - CXXFLAGS="${CXXFLAGS:-%{build_cxxflags}}" ; export CXXFLAGS ; \ - FFLAGS="${FFLAGS:-%{build_fflags}}" ; export FFLAGS ; \ -@@ -162,8 +208,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}} -+%_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 +243,11 @@ - #%_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} -+%_general_options -O2 -g -grecord-gcc-switches -pipe -fstack-protector-strong %[ "%{toolchain}" == "clang" ? "-fgcc-compatible" : "" ] -+%_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)} --- -2.27.0 - diff --git a/Call-set_build_flags-cc-before-build-check-and-insta.patch b/Call-set_build_flags-cc-before-build-check-and-insta.patch deleted file mode 100644 index 8f69298..0000000 --- a/Call-set_build_flags-cc-before-build-check-and-insta.patch +++ /dev/null @@ -1,49 +0,0 @@ -From c6b15b8c17f957d736dd975d106b10d419070ebd Mon Sep 17 00:00:00 2001 -From: liyunfei -Date: Tue, 9 Jan 2024 20:50:34 +0800 -Subject: [PATCH 2/2] Call %set_build_flags&cc before %build, %check, and - %install stages - ---- - macros | 18 ++++++++++++++++++ - 1 file changed, 18 insertions(+) - -diff --git a/macros b/macros -index 0062126..8c16706 100755 ---- a/macros -+++ b/macros -@@ -83,6 +83,22 @@ - FCFLAGS="${FCFLAGS:-%{build_fflags}}" ; export FCFLAGS ; \ - LDFLAGS="${LDFLAGS:-%{build_ldflags}}" ; export LDFLAGS - -+# Automatically use set_build_flags macro for build, check, and -+# install phases. -+# Use "%undefine _auto_set_build_flags" to disable" -+# Automatically use set_build_cc macro for build, check, and -+# install phases. -+# Use "%undefine _auto_set_build_cc" to disable" -+%_auto_set_build_cc %["%{toolchain}" == "gcc" ? 0 : 1] -+%_auto_set_build_flags 0 -+ -+%__spec_build_pre %{___build_pre} \ -+ %[0%{?_auto_set_build_cc} ? "%{set_build_cc}" : ""] \ -+ %[0%{?_auto_set_build_flags} ? "%{set_build_flags}" : ""] -+%__spec_check_pre %{___build_pre} \ -+ %[0%{?_auto_set_build_cc} ? "%{set_build_cc}" : ""] \ -+ %[0%{?_auto_set_build_flags} ? "%{set_build_flags}" : ""] -+ - #For backwards compatibility only. - %__global_cflags %{build_cflags} - %__global_cxxflags %{build_cxxflags} -@@ -144,6 +158,8 @@ - [ "$RPM_BUILD_ROOT" != "/" ] && rm -rf "${RPM_BUILD_ROOT}"\ - mkdir -p `dirname "$RPM_BUILD_ROOT"`\ - mkdir "$RPM_BUILD_ROOT"\ -+ %[0%{?_auto_set_build_cc} ? "%{set_build_cc}" : ""]\ -+ %[0%{?_auto_set_build_flags} ? "%{set_build_flags}" : ""]\ - %{nil} - - # ---- Expanded at end of %install scriptlet. --- -2.27.0 - diff --git a/Delete-the-commented-code.patch b/Delete-the-commented-code.patch deleted file mode 100644 index b9f0469..0000000 --- a/Delete-the-commented-code.patch +++ /dev/null @@ -1,24 +0,0 @@ -From c7605385b9d838be78a87de02a48eaaa6e69b4b2 Mon Sep 17 00:00:00 2001 -From: hongjinghao -Date: Tue, 5 Mar 2024 20:22:59 +0800 -Subject: [PATCH] Delete the commented code - ---- - brp-digest-list | 1 - - 1 file changed, 1 deletion(-) - -diff --git a/brp-digest-list b/brp-digest-list -index 77248c9..7de42b7 100644 ---- a/brp-digest-list -+++ b/brp-digest-list -@@ -9,7 +9,6 @@ if [ -z "$RPM_BUILD_ROOT" -o "$RPM_BUILD_ROOT" = "/" ]; then - fi - - # Create temporary file listing files in the manifest --#[ -n "$TMPDIR" ] || TMPDIR="/tmp" - TMPDIR="/tmp" - BIN_PKG_FILES=${TMPDIR}/${3%%.rpm} - cat - > $BIN_PKG_FILES --- -2.33.0 - diff --git a/Feature-support-EBS-sign-for-IMA-digest-list.patch b/Feature-support-EBS-sign-for-IMA-digest-list.patch deleted file mode 100644 index bd0fed0..0000000 --- a/Feature-support-EBS-sign-for-IMA-digest-list.patch +++ /dev/null @@ -1,326 +0,0 @@ -From 0449160c84daff8c557dee47a970e4f4837ff81d Mon Sep 17 00:00:00 2001 -From: Huaxin Lu -Date: Mon, 12 Dec 2022 00:16:01 +0800 -Subject: [PATCH] support EBS sign for IMA digest list - -Signed-off-by: Huaxin Lu -Signed-off-by: zhangguangzhi - ---- - brp-digest-list | 46 +++++----- - brp-ebs-sign | 238 ++++++++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 262 insertions(+), 22 deletions(-) - create mode 100644 brp-ebs-sign - -diff --git a/brp-digest-list b/brp-digest-list -index e698b7a..d1e2600 100644 ---- a/brp-digest-list -+++ b/brp-digest-list -@@ -26,7 +26,6 @@ fi - DIGEST_LIST_DIR=$RPM_BUILD_ROOT/$2/etc/ima/digest_lists - mkdir -p $DIGEST_LIST_DIR - mkdir -p $DIGEST_LIST_DIR.tlv --mkdir -p $DIGEST_LIST_DIR.sig - - # Generate digest list for the kernel - gen_digest_lists -i M: -t metadata -f compact -d $DIGEST_LIST_DIR -i l:policy \ -@@ -70,28 +69,31 @@ DIGEST_LIST_TLV_PATH="$DIGEST_LIST_DIR.tlv/0-metadata_list-compact_tlv-$(basenam - chmod 644 $DIGEST_LIST_TLV_PATH - echo $DIGEST_LIST_TLV_PATH - --if [[ "$(basename $BIN_PKG_FILES)" =~ "digest-list-tools" && \ -- ! $(basename $BIN_PKG_FILES) =~ "debug" ]]; then -- # Generate digest list for the user space parsers -- LD_LIBRARY_PATH=$RPM_BUILD_ROOT/usr/lib64 \ -- $RPM_BUILD_ROOT/usr/bin/gen_digest_lists \ -- -d $DIGEST_LIST_DIR -t parser -f compact -m immutable \ -- -i I:$RPM_BUILD_ROOT/usr/libexec -o add -p -1 -i i: -- -- f="$DIGEST_LIST_DIR/0-parser_list-compact-libexec" -- [ -f $f ] || exit 0 -- -- chmod 644 $f -- echo $f -+#if [[ "$(basename $BIN_PKG_FILES)" =~ "digest-list-tools" && \ -+# ! $(basename $BIN_PKG_FILES) =~ "debug" ]]; then -+# Generate digest list for the user space parsers -+ -+# do EBS sign -+export PUBLISHER_HOST=$(grep PUBLISHER_HOST /lkp/scheduled/job.yaml | awk '{print $2}') -+export PUBLISHER_PORT=$(grep PUBLISHER_PORT /lkp/scheduled/job.yaml | awk '{print $2}') -+if [[ -n "$PUBLISHER_HOST" && -n "$PUBLISHER_PORT" ]]; then -+ [ -f /usr/lib/rpm/brp-ebs-sign ] || exit 0 -+ sh /usr/lib/rpm/brp-ebs-sign --ima-digestlist $DIGEST_LIST_PATH 1>&2 -+ [ -f $DIGEST_LIST_PATH.sig ] || exit 0 -+ chmod 644 $DIGEST_LIST_PATH.sig -+ mv $DIGEST_LIST_PATH.sig $DIGEST_LIST_PATH -+ exit 0 -+fi - -- [ -f /usr/lib/rpm/brp-suse.d/brp-99-pesign ] || exit 0 -+# do OBS sign -+[ -f /usr/lib/rpm/brp-suse.d/brp-99-pesign ] || exit 0 - -- export BRP_PESIGN_FILES="$2/etc/ima/digest_lists/*" -- export RPM_BUILD_ROOT -- export RPM_PACKAGE_NAME="digest-list-tools" -- export RPM_SOURCE_DIR="$(rpm --eval %_topdir)/SOURCES" -+export BRP_PESIGN_FILES="$2/etc/ima/digest_lists/*" -+export RPM_BUILD_ROOT -+export RPM_PACKAGE_NAME="digest-list-tools" -+export RPM_SOURCE_DIR="$(rpm --eval %_topdir)/SOURCES" - -- if [ -f "/usr/lib/rpm/brp-suse.d/brp-99-pesign" ]; then -- /usr/lib/rpm/brp-suse.d/brp-99-pesign &> /dev/null -- fi -+if [ -f "/usr/lib/rpm/brp-suse.d/brp-99-pesign" ]; then -+ /usr/lib/rpm/brp-suse.d/brp-99-pesign &> /dev/null - fi -+#fi -diff --git a/brp-ebs-sign b/brp-ebs-sign -new file mode 100644 -index 0000000..a7a83e5 ---- /dev/null -+++ b/brp-ebs-sign -@@ -0,0 +1,238 @@ -+#!/bin/bash -+ -+INPUT_TYPE=$1 -+INPUT_FILE=$2 -+SIGN_FILE=$INPUT_FILE -+PROJECT_CONF="/lkp/scheduled/job.yaml" -+POST_ADDR="" -+POST_FILE_SHA256="" -+POST_KEY_NAME="" -+POST_KEY_TYPE="" -+POST_FILE_TYPE="" -+POST_SIGN_TYPE="" -+POST_JOB_ID="" -+POST_OS_ORIJECT="" -+CONFIG_RETEST_COUNT=5 -+SIGN_RESULT=0 -+FAILED_SIGN_PERMISSION_DENIED=2 -+ -+# Tool functions for JSON -+get_json_value(){ -+ echo "$1" | \ -+ awk -F "[{,:}]" '{for(i=1;i $INPUT_FILE.sig -+ if [ $? -ne 0 ]; then -+ echo "Failed to write the signed file" -+ return 1 -+ fi -+ -+ # for test -+ # cp -f $INPUT_FILE $INPUT_FILE.sig -+ # req="{file_sha256:41c68fca7b3870cc9ef13a828a74af933bd8e4ff345fcfa316}" -+ -+ # 3. check the hash -+ sha256_cal=$(sha256sum $INPUT_FILE.sig | awk '{print $1}') -+ sha256_get=$(get_json_value "$req" "file_sha256" | tr '[:upper:]' '[:lower:]') -+ if [ "$sha256_cal" != "$sha256_get" ]; then -+ echo "Failed to verify the hash value" -+ return 1 -+ fi -+} -+ -+sign_post() { -+ case $INPUT_TYPE in -+ --efi) -+ efi_sign_post -+ ;; -+ --module) -+ module_sign_post -+ ;; -+ --ima-digestlist) -+ ima_digestlist_sign_post -+ ;; -+ --kernel) -+ kernel_sign_post -+ ;; -+ esac -+} -+ -+# Main function -+sign_pre -+ -+for ((i=1; i<=$CONFIG_RETEST_COUNT; i++)); do -+ sign -+ ret_sign=$? -+ if [ $ret_sign -eq 0 ]; then -+ echo "Succeed to sign file" -+ break; -+ elif [ $ret_sign -eq $FAILED_SIGN_PERMISSION_DENIED ]; then -+ echo "Failed to sign file, permission denied" -+ SIGN_RESULT=$FAILED_SIGN_PERMISSION_DENIED -+ break; -+ elif [ $i -ne $CONFIG_RETEST_COUNT ]; then -+ echo "Failed to sign file, try again" -+ elif [ $i -eq $CONFIG_RETEST_COUNT ]; then -+ echo "Failed to sign file" -+ SIGN_RESULT=1 -+ fi -+done -+ -+sign_post -+exit $SIGN_RESULT --- -2.33.0 - diff --git a/Fix-a-typo-in-brp-digest-list.patch b/Fix-a-typo-in-brp-digest-list.patch deleted file mode 100644 index 305237d..0000000 --- a/Fix-a-typo-in-brp-digest-list.patch +++ /dev/null @@ -1,26 +0,0 @@ -From a82057c590f958d10898c2e5f7211241be3dfd7a Mon Sep 17 00:00:00 2001 -From: Roberto Sassu -Date: Fri, 26 Feb 2021 09:00:06 +0100 -Subject: [PATCH] Fix a typo in brp-digest-list - -Rename RPM_PACKAGE_NAM to RPM_PACKAGE_NAME. ---- - brp-digest-list | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/brp-digest-list b/brp-digest-list -index 435b962..c3b2156 100644 ---- a/brp-digest-list -+++ b/brp-digest-list -@@ -86,7 +86,7 @@ if [[ "$(basename $BIN_PKG_FILES)" =~ "digest-list-tools" && \ - - export BRP_PESIGN_FILES="$2/etc/ima/digest_lists/*" - export RPM_BUILD_ROOT -- export RPM_PACKAGE_NAM="digest-list-tools" -+ export RPM_PACKAGE_NAME="digest-list-tools" - export RPM_SOURCE_DIR="$(rpm --eval %_topdir)/SOURCES" - - if [ -f "/usr/lib/rpm/brp-suse.d/brp-99-pesign" ]; then --- -2.26.2 - diff --git a/Fix-python3_version-macros-for-Python-3.10.patch b/Fix-python3_version-macros-for-Python-3.10.patch deleted file mode 100644 index fc76959..0000000 --- a/Fix-python3_version-macros-for-Python-3.10.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 84ed1ab69d4b1e0aea452350d9f2865e8f7c28e7 Mon Sep 17 00:00:00 2001 -From: Miro Hrončok -Date: Aug 26 2019 13:24:23 +0000 -Subject: Fix %python3_version macros for Python 3.10 - - -No need to bump the release, 3.10 is far from now. - -Fixes https://bugzilla.redhat.com/show_bug.cgi?id=1745601 - ---- - -diff --git a/macros.python b/macros.python -index 1952aed..a170c4b 100644 ---- a/macros.python -+++ b/macros.python -@@ -139,8 +139,8 @@ find $bytecode_compilation_path -type f -a -name "*.py" -print0 | xargs -0 $pyth - %__python3 /usr/bin/python3 - %python3_sitelib %(%{__python3} -Ic "from distutils.sysconfig import get_python_lib; print(get_python_lib())") - %python3_sitearch %(%{__python3} -Ic "from distutils.sysconfig import get_python_lib; print(get_python_lib(1))") --%python3_version %(%{__python3} -Ic "import sys; sys.stdout.write(sys.version[:3])") --%python3_version_nodots %(%{__python3} -Ic "import sys; sys.stdout.write(sys.version[:3].replace('.',''))") -+%python3_version %(%{__python3} -Ic "import sys; sys.stdout.write('{0.major}.{0.minor}'.format(sys.version_info))") -+%python3_version_nodots %(%{__python3} -Ic "import sys; sys.stdout.write('{0.major}{0.minor}'.format(sys.version_info))") - %python3_platform %(%{__python3} -Ic "import sysconfig; print(sysconfig.get_platform())") - %py3dir %{_builddir}/python3-%{name}-%{version}-%{release} - --- -2.27.0 - diff --git a/Give-a-warning-when-using-kabi-outside-our-stablelis.patch b/Give-a-warning-when-using-kabi-outside-our-stablelis.patch deleted file mode 100644 index d2cba8e..0000000 --- a/Give-a-warning-when-using-kabi-outside-our-stablelis.patch +++ /dev/null @@ -1,240 +0,0 @@ -From 895c930b1418798509a1f19706b6a1be188ad303 Mon Sep 17 00:00:00 2001 -From: Liu Yuntao -Date: Sat, 2 Jul 2022 13:59:25 +0800 -Subject: [PATCH] Give a warning when using kabi outside our stablelists. - -Add a script that will find requirements for your package. It can make an -additional kabi whitelist check for you, compared with rpmbuild's builtin -requirement scanner. You may add "%define _use_internal_dependency_generator 0" -in your .spec file to enable this feature. -synced from CentOS's implementation. ---- - find-requires | 38 +++++++++++ - find-requires.ksyms | 155 ++++++++++++++++++++++++++++++++++++++++++++ - macros.kmp | 3 +- - 3 files changed, 195 insertions(+), 1 deletion(-) - create mode 100644 find-requires - create mode 100644 find-requires.ksyms - -diff --git a/find-requires b/find-requires -new file mode 100644 -index 0000000..b7cd825 ---- /dev/null -+++ b/find-requires -@@ -0,0 +1,38 @@ -+#!/bin/bash -+ -+# -+# Auto-generate requirements for executables (both ELF and a.out) and library -+# sonames, script interpreters, and perl modules. -+# -+ -+ulimit -c 0 -+ -+filelist=`sed "s/[]['\"*?{}]/\\\\\&/g"` -+ -+[ -x /usr/lib/rpm/rpmdeps -a -n "$filelist" ] && \ -+ echo $filelist | tr '[:blank:]' \\n | /usr/lib/rpm/rpmdeps --requires -+ -+# -+# --- Kernel module imported symbols -+# -+# Since we don't (yet) get passed the name of the package being built, we -+# cheat a little here by looking first for a kernel, then for a kmod. -+# -+ -+unset is_kmod -+ -+for f in $filelist; do -+ if [ $(echo "$f" | sed -r -ne 's:^.*/lib/modules/(.*)/(.*)\.ko(\.gz|\.bz2|\.xz)?$:\2:p') ] -+ then -+ is_kmod=1; -+ elif [ $(echo "$f" | sed -r -ne 's:^.*/boot/(.*):\1:p') ] -+ then -+ unset is_kmod; -+ break; -+ fi -+done -+ -+[ -x /usr/lib/rpm/__vendor/find-requires.ksyms ] && [ "$is_kmod" ] && -+ printf "%s\n" "${filelist[@]}" | /usr/lib/rpm/__vendor/find-requires.ksyms -+ -+exit 0 -diff --git a/find-requires.ksyms b/find-requires.ksyms -new file mode 100644 -index 0000000..15cc729 ---- /dev/null -+++ b/find-requires.ksyms -@@ -0,0 +1,155 @@ -+#! /bin/bash -+# -+# This script is called during external module building to create dependencies -+# both upon the linux kernel, and on additional external modules. Symbols that -+# cannot be reconciled against those provided by the kernel are assumed to be -+# provided by an external module and "ksym" replaces th regular "kernel" dep. -+ -+IFS=$'\n' -+ -+# Extract all of the symbols provided by this module. -+all_provides() { -+ for module in "$@"; do -+ tmpfile="" -+ if [ "x${module%.ko}" = "x${module}" ]; then -+ tmpfile=$(mktemp -t ${0##*/}.XXXXXX.ko) -+ proc_bin= -+ case "${module##*.}" in -+ xz) -+ proc_bin=xz -+ ;; -+ bz2) -+ proc_bin=bzip2 -+ ;; -+ gz) -+ proc_bin=gzip -+ ;; -+ esac -+ -+ [ -n "$proc_bin" ] || continue -+ -+ "$proc_bin" -d -c - < "$module" > "$tmpfile" || continue -+ module="$tmpfile" -+ fi -+ -+ if [[ -n $(nm "$module" | sed -r -ne 's:^0*([0-9a-f]+) A __crc_(.+):0x\1 \2:p') ]]; then -+ nm "$module" \ -+ | sed -r -ne 's:^0*([0-9a-f]+) A __crc_(.+):0x\1 \2:p' \ -+ | awk --non-decimal-data '{printf("%s:0x%08x\n", $2, $1)}' -+ else -+ ELFRODATA=$(readelf -R .rodata "$module" | awk '/0x/{printf $2$3$4$5}') -+ if [[ -n $(readelf -h "$module" | grep "little endian") ]]; then -+ RODATA=$(echo $ELFRODATA | sed 's/\(..\)\(..\)\(..\)\(..\)/\4\3\2\1/g') -+ else -+ RODATA=$ELFRODATA -+ fi -+ for sym in $(nm "$module" | sed -r -ne 's:^0*([0-9a-f]+) R __crc_(.+):0x\1 \2:p'); do -+ echo $sym $RODATA -+ done \ -+ | awk --non-decimal-data '{printf("%s:0x%08s\n", $2, substr($3,($1*2)+1,8))}' -+ fi -+ -+ [ -z "$tmpfile" ] || rm -f -- "$tmpfile" -+ done \ -+ | LC_ALL=C sort -k1,1 -u -+} -+ -+# Extract all of the requirements of this module. -+all_requires() { -+ for module in "$@"; do -+ set -- $(/sbin/modinfo -F vermagic "$module" | sed -e 's: .*::' -e q) -+ /sbin/modprobe --dump-modversions "$module" \ -+ | awk --non-decimal-data ' -+ BEGIN { FS = "\t" ; OFS = "\t" } -+ {printf("%s:0x%08x\n", $2, $1)}' \ -+ | sed -r -e 's:$:\t'"$1"':' -+ done \ -+ | LC_ALL=C sort -k1,1 -u -+} -+ -+# Filter out requirements fulfilled by the module itself. -+mod_requires() { -+ LC_ALL=C join -t $'\t' -j 1 -v 1 \ -+ <(all_requires "$@") \ -+ <(all_provides "$@") \ -+ | LC_ALL=C sort -k1,1 -u -+} -+ -+if ! [ -e /sbin/modinfo -a -e /sbin/modprobe ]; then -+ cat > /dev/null -+ exit 0 -+fi -+ -+check_kabi() { -+ arch=$(uname -m) -+ kabi_file="/lib/modules/kabi-current/kabi_stablelist_$arch" -+ -+ # If not installed, output a warning and return (continue) -+ if [ ! -f "$kabi_file" ]; then -+ echo "" >&2 -+ echo "********************************************************************************" >&2 -+ echo "*********************** KERNEL ABI COMPATIBILITY WARNING ***********************" >&2 -+ echo "********************************************************************************" >&2 -+ echo "The kernel ABI reference files (provided by "kernel-abi-stablelists") were not found." >&2 -+ echo "No compatibility check was performed. Please install the kABI reference files" >&2 -+ echo "and rebuild if you would like to verify compatibility with kernel ABI." >&2 -+ echo "" >&2 -+ return -+ fi -+ -+ unset non_kabi -+ for symbol in "$@"; do -+ if ! egrep "^$symbol\$" $kabi_file >/dev/null; then -+ non_kabi=("${non_kabi[@]}" "$symbol") -+ fi -+ done -+ -+ if [ ${#non_kabi[@]} -gt 0 ]; then -+ echo "" >&2 -+ echo "********************************************************************************" >&2 -+ echo "*********************** KERNEL ABI COMPATIBILITY WARNING ***********************" >&2 -+ echo "********************************************************************************" >&2 -+ echo "The following kernel symbols are not guaranteed to remain compatible with" >&2 -+ echo "future kernel updates to this RHEL release:" >&2 -+ echo "" >&2 -+ for symbol in "${non_kabi[@]}"; do -+ printf "\t$symbol\n" >&2 -+ done -+ echo "" >&2 -+ echo "__vendor recommends that you consider using only official kernel ABI symbols" >&2 -+ echo "where possible. Requests for additions to the kernel ABI can be filed with" >&2 -+ echo "your partner or customer representative (component: driver-update-program)." >&2 -+ echo "" >&2 -+ fi -+} -+ -+modules=($(grep -E '/lib/modules/.+\.ko(\.gz|\.bz2|\.xz)?$')) -+if [ ${#modules[@]} -gt 0 ]; then -+ kernel=$(/sbin/modinfo -F vermagic "${modules[0]}" | sed -e 's: .*::' -e q) -+ -+ # get all that kernel provides -+ symvers=$(mktemp -t ${0##*/}.XXXXX) -+ -+ cat /usr/src/kernels/$kernel/Module.symvers | awk ' -+ BEGIN { FS = "\t" ; OFS = "\t" } -+ { print $2 ":" $1 } -+ ' \ -+ | sed -r -e 's:$:\t'"$kernel"':' \ -+ | LC_ALL=C sort -k1,1 -u > $symvers -+ -+ # Symbols matching with the kernel get a "kernel" dependency -+ mod_req=$(mktemp -t mod_req.XXXXX) -+ mod_requires "${modules[@]}" > "$mod_req" -+ LC_ALL=C join -t $'\t' -j 1 $symvers "$mod_req" | LC_ALL=C sort -u \ -+ | awk 'BEGIN { FS = "[\t:]" ; OFS = "\t" } { print "kernel(" $1 ") = " $2 }' -+ -+ # Symbols from elsewhere get a "ksym" dependency -+ LC_ALL=C join -t $'\t' -j 1 -v 2 $symvers "$mod_req" | LC_ALL=C sort -u \ -+ | awk 'BEGIN { FS = "[\t:]" ; OFS = "\t" } { print "ksym(" $1 ") = " $2 }' -+ -+ # Check kABI if the kernel-abi-stablelists package is installed -+ # Do this last so we can try to output this error at the end -+ kabi_check_symbols=($(LC_ALL=C join -t $'\t' -j 1 $symvers "$mod_req" | LC_ALL=C sort -u \ -+ | awk 'BEGIN { FS = "[\t:]" ; OFS = "\t" } { print $1 }')) -+ check_kabi "${kabi_check_symbols[@]}" -+fi -diff --git a/macros.kmp b/macros.kmp -index 5207045..df7e41e 100644 ---- a/macros.kmp -+++ b/macros.kmp -@@ -1,7 +1,8 @@ --# Use these macros to differentiate between RH and other KMP implementation(s). -+# Use these macros to differentiate between __vendor and other KMP implementation(s). - - kernel_module_package_release 1 - -+__find_requires /usr/lib/rpm/__vendor/find-requires - - - #kernel_module_package [ -n name ] [ -v version ] [ -r release ] --- -2.27.0 - diff --git a/add-brp-scripts-to-delete-rpath.patch b/add-brp-scripts-to-delete-rpath.patch deleted file mode 100644 index 8677bd5..0000000 --- a/add-brp-scripts-to-delete-rpath.patch +++ /dev/null @@ -1,145 +0,0 @@ -From 9648228a3f64de46dd7fbb26e2df429352de17e1 Mon Sep 17 00:00:00 2001 -From: yangmingtaip -Date: Sat, 4 Sep 2021 14:14:54 +0800 -Subject: [PATCH] add brp scripts to delete rpath - -Signed-off-by: xujing ---- - brp-chrpath | 104 ++++++++++++++++++++++++++++++++++++++++++++++++++++ - macros | 2 + - 2 files changed, 106 insertions(+) - create mode 100755 brp-chrpath - -diff --git a/brp-chrpath b/brp-chrpath -new file mode 100755 -index 0000000..dc48351 ---- /dev/null -+++ b/brp-chrpath -@@ -0,0 +1,104 @@ -+#!/usr/bin/sh -+# remove rpath specified -+ -+rpathSuffix=( -+ "/home/abuild/rpmbuild/BUILD", -+ "/home/lkp/rpmbuild/BUILD" -+) -+ -+rpath=( -+ "/usr/lib64", -+ "/lib64", -+ "/usr/lib", -+ "/lib", -+ "/usr/lib/../lib64" -+) -+ -+buildroot=$1 -+ -+function rpathChange() -+{ -+ localSrcPath=$1 -+ localDstPath="" -+ -+ rpathArr=(`echo $localSrcPath | tr ':' ' '`) -+ -+ for path in ${rpathArr[*]} -+ do -+ localflag=0 -+ for suffix in ${rpathSuffix[*]} -+ do -+ if echo "$path" | grep $suffix &> /dev/null; then -+ localflag=1 -+ break -+ fi -+ done -+ -+ # Is the suffix path, delete -+ if [ $localflag -eq 1 ]; then -+ continue; -+ fi -+ -+ #Is the standard path, delete -+ if echo "${rpath[@]}" | grep -w $path &> /dev/null; then -+ continue -+ fi -+ -+ if [ x"$localDstPath" == x"" ]; then -+ localDstPath=$path -+ else -+ localDstPath=$localDstPath:$path -+ fi -+ done -+ -+ echo $localDstPath -+} -+ -+function removeRpathOrRunpath() -+{ -+ localfile=$1 -+ -+ rpathInfo=$(chrpath -l $localfile | grep "RPATH=") -+ runpathInfo=$(chrpath -l $localfile | grep "RUNPATH=") -+ -+ currPath="" -+ realPath="" -+ needCh=0 -+ if [ x"$rpathInfo" != x"" ]; then -+ needCh=1 -+ currPath=$(echo $rpathInfo | awk -F "RPATH=" '{print $2}') -+ realPath=$(rpathChange $currPath) -+ fi -+ -+ if [ x"$runpathInfo" != x"" ]; then -+ needCh=1 -+ currPath=$(echo $runpathInfo | awk -F "RUNPATH=" '{print $2}') -+ realPath=$(rpathChange $currPath) -+ fi -+ -+ if [ $needCh -eq 0 ]; then -+ return 0 -+ fi -+ -+ if [ x"$realPath" == x"" ]; then -+ chrpath -d $localfile -+ else -+ chrpath -r $realPath $localfile -+ fi -+ -+ return 0 -+} -+ -+for file in $(find $buildroot/ -executable -type f -exec file {} ';' | grep "\" | awk -F ':' '{print $1}') -+do -+ test -u $file -+ if [ $? -eq 0 ]; then -+ continue -+ fi -+ -+ if [ -w "$file" ]; then -+ removeRpathOrRunpath $file -+ fi -+done -+ -+exit 0 -diff --git a/macros b/macros -index 36621df..a316be9 100644 ---- a/macros -+++ b/macros -@@ -89,6 +89,7 @@ - - # Build root policy macros. Standard naming: - # convert all '-' in basename to '_', add two leading underscores. -+%__brp_chrpath /usr/lib/rpm/brp-chrpath %{buildroot} - %__brp_ldconfig /usr/lib/rpm/brp-ldconfig - %__brp_compress /usr/lib/rpm/brp-compress - %__brp_strip /usr/lib/rpm/brp-strip %{__strip} -@@ -111,6 +112,7 @@ - - %__spec_install_post\ - %{?__debug_package:%{__debug_install_post}}\ -+ %{?__vendor_delete_rpath:%{?__brp_chrpath}} \ - %{__arch_install_post}\ - %{__os_install_post}\ - %{nil} --- -2.33.0 - diff --git a/add-common-script.patch b/add-common-script.patch deleted file mode 100644 index bb7892e..0000000 --- a/add-common-script.patch +++ /dev/null @@ -1,313 +0,0 @@ -From 4db504b19f6dd04a44e46b43b3aff4e6cab9214d Mon Sep 17 00:00:00 2001 -From: wangkerong -Date: Wed, 13 Oct 2021 10:04:33 +0800 -Subject: [PATCH] add_commom_script - ---- - common.lua | 294 +++++++++++++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 294 insertions(+) - create mode 100644 common.lua - -diff --git a/common.lua b/common.lua -new file mode 100644 -index 0000000..884ee4d ---- /dev/null -+++ b/common.lua -@@ -0,0 +1,294 @@ -+-- Convenience Lua functions that can be used within rpm macros -+ -+-- Reads an rpm variable. Unlike a basic rpm.expand("{?foo}"), returns nil if -+-- the variable is unset, which is convenient in lua tests and enables -+-- differentiating unset variables from variables set to "" -+local function read(rpmvar) -+ if not rpmvar or -+ (rpm.expand("%{" .. rpmvar .. "}") == "%{" .. rpmvar .. "}") then -+ return nil -+ else -+ return rpm.expand("%{?" .. rpmvar .. "}") -+ end -+end -+ -+-- Returns true if the macro that called this function had flag set -+-- – for example, hasflag("z") would give the following results: -+-- %foo -z bar → true -+-- %foo -z → true -+-- %foo → false -+local function hasflag(flag) -+ return (rpm.expand("%{-" .. flag .. "}") ~= "") -+end -+ -+-- Returns the argument passed to flag in the macro that called this function -+-- – for example, readflag("z") would give the following results: -+-- %foo -z bar → bar -+-- %foo → nil -+-- %foo -z "" → empty string -+-- %foo -z '' → empty string -+local function readflag(flag) -+ if not hasflag(flag) then -+ return nil -+ else -+ local a = rpm.expand("%{-" .. flag .. "*}") -+ -- Handle "" and '' as empty strings -+ if (a == '""') or (a == "''") then -+ a = '' -+ end -+ return a -+ end -+end -+ -+-- Sets a spec variable; echoes the result if verbose -+local function explicitset(rpmvar, value, verbose) -+ local value = value -+ if (value == nil) or (value == "") then -+ value = "%{nil}" -+ end -+ rpm.define(rpmvar .. " " .. value) -+ if verbose then -+ rpm.expand("%{warn:Setting %%{" .. rpmvar .. "} = " .. value .. "}") -+ end -+end -+ -+-- Unsets a spec variable if it is defined; echoes the result if verbose -+local function explicitunset(rpmvar, verbose) -+ if (rpm.expand("%{" .. rpmvar .. "}") ~= "%{" .. rpmvar .. "}") then -+ rpm.define(rpmvar .. " %{nil}") -+ if verbose then -+ rpm.expand("%{warn:Unsetting %%{" .. rpmvar .. "}}") -+ end -+ end -+end -+ -+-- Sets a spec variable, if not already set; echoes the result if verbose -+local function safeset(rpmvar, value, verbose) -+ if (rpm.expand("%{" .. rpmvar .. "}") == "%{" .. rpmvar .. "}") then -+ explicitset(rpmvar,value,verbose) -+ end -+end -+ -+-- Aliases a list of rpm variables to the same variables suffixed with 0 (and -+-- vice versa); echoes the result if verbose -+local function zalias(rpmvars, verbose) -+ for _, sfx in ipairs({{"","0"},{"0",""}}) do -+ for _, rpmvar in ipairs(rpmvars) do -+ local toalias = "%{?" .. rpmvar .. sfx[1] .. "}" -+ if (rpm.expand(toalias) ~= "") then -+ safeset(rpmvar .. sfx[2], toalias, verbose) -+ end -+ end -+ end -+end -+ -+-- Takes a list of rpm variable roots and a suffix and alias current to -+-- if it resolves to something not empty -+local function setcurrent(rpmvars, suffix, verbose) -+ for _, rpmvar in ipairs(rpmvars) do -+ if (rpm.expand("%{?" .. rpmvar .. suffix .. "}") ~= "") then -+ explicitset( "current" .. rpmvar, "%{" .. rpmvar .. suffix .. "}", verbose) -+ else -+ explicitunset("current" .. rpmvar, verbose) -+ end -+ end -+end -+ -+-- Echo the list of rpm variables, with suffix, if set -+local function echovars(rpmvars, suffix) -+ for _, rpmvar in ipairs(rpmvars) do -+ rpmvar = rpmvar .. suffix -+ local header = string.sub(" " .. rpmvar .. ": ",1,21) -+ rpm.expand("%{?" .. rpmvar .. ":%{echo:" .. header .. "%{?" .. rpmvar .. "}}}") -+ end -+end -+ -+-- Returns an array, indexed by suffix, containing the non-empy values of -+-- , with suffix an integer string or the empty string -+local function getsuffixed(rpmvar) -+ local suffixes = {} -+ zalias({rpmvar}) -+ for suffix=0,9999 do -+ local value = rpm.expand("%{?" .. rpmvar .. suffix .. "}") -+ if (value ~= "") then -+ suffixes[tostring(suffix)] = value -+ end -+ end -+ -- rpm convention is to alias no suffix to zero suffix -+ -- only add no suffix if zero suffix is different -+ local value = rpm.expand("%{?" .. rpmvar .. "}") -+ if (value ~= "") and (value ~= suffixes["0"]) then -+ suffixes[""] = value -+ end -+ return suffixes -+end -+ -+-- Returns the list of suffixes, including the empty string, for which -+-- is set to a non empty value -+local function getsuffixes(rpmvar) -+ suffixes = {} -+ for suffix in pairs(getsuffixed(rpmvar)) do -+ table.insert(suffixes,suffix) -+ end -+ table.sort(suffixes, -+ function(a,b) return (tonumber(a) or 0) < (tonumber(b) or 0) end) -+ return suffixes -+end -+ -+-- Returns the suffix for which has a non-empty value that -+-- matches best the beginning of the value string -+local function getbestsuffix(rpmvar, value) -+ local best = nil -+ local currentmatch = "" -+ for suffix, setvalue in pairs(getsuffixed(rpmvar)) do -+ if (string.len(setvalue) > string.len(currentmatch)) and -+ (string.find(value, "^" .. setvalue)) then -+ currentmatch = setvalue -+ best = suffix -+ end -+ end -+ return best -+end -+ -+-- %writevars core -+local function writevars(macrofile, rpmvars) -+ for _, rpmvar in ipairs(rpmvars) do -+ print("sed -i 's\029" .. string.upper("@@" .. rpmvar .. "@@") .. -+ "\029" .. rpm.expand( "%{" .. rpmvar .. "}" ) .. -+ "\029g' " .. macrofile .. "\n") -+ end -+end -+ -+-- https://github.com/rpm-software-management/rpm/issues/566 -+-- Reformat a text intended to be used used in a package description, removing -+-- rpm macro generation artefacts. -+-- – remove leading and ending empty lines -+-- – trim intermediary empty lines to a single line -+-- – fold on spaces -+-- Should really be a %%{wordwrap:…} verb -+local function wordwrap(text) -+ text = rpm.expand(text .. "\n") -+ text = string.gsub(text, "\t", " ") -+ text = string.gsub(text, "\r", "\n") -+ text = string.gsub(text, " +\n", "\n") -+ text = string.gsub(text, "\n+\n", "\n\n") -+ text = string.gsub(text, "^\n", "") -+ text = string.gsub(text, "\n( *)[-*—][ ]+", "\n%1– ") -+ output = "" -+ for line in string.gmatch(text, "[^\n]*\n") do -+ local pos = 0 -+ local advance = "" -+ for word in string.gmatch(line, "%s*[^%s]*\n?") do -+ local wl, bad = utf8.len(word) -+ if not wl then -+ print("%{warn:Invalid UTF-8 sequence detected in:}" .. -+ "%{warn:" .. word .. "}" .. -+ "%{warn:It may produce unexpected results.}") -+ wl = bad -+ end -+ if (pos == 0) then -+ advance, n = string.gsub(word, "^(%s*– ).*", "%1") -+ if (n == 0) then -+ advance = string.gsub(word, "^(%s*).*", "%1") -+ end -+ advance = string.gsub(advance, "– ", " ") -+ pos = pos + wl -+ elseif (pos + wl < 81) or -+ ((pos + wl == 81) and string.match(word, "\n$")) then -+ pos = pos + wl -+ else -+ word = advance .. string.gsub(word, "^%s*", "") -+ output = output .. "\n" -+ pos = utf8.len(word) -+ end -+ output = output .. word -+ if pos > 80 then -+ pos = 0 -+ if not string.match(word, "\n$") then -+ output = output .. "\n" -+ end -+ end -+ end -+ end -+ output = string.gsub(output, "\n*$", "\n") -+ return output -+end -+ -+-- Because rpmbuild will fail if a subpackage is declared before the source -+-- package itself, provide a source package declaration shell as fallback. -+local function srcpkg(verbose) -+ if verbose then -+ rpm.expand([[ -+%{echo:Creating a header for the SRPM from %%{source_name}, %%{source_summary} and} -+%{echo:%%{source_description}. If that is not the intended result, please declare the} -+%{echo:SRPM header and set %%{source_name} in your spec file before calling a macro} -+%{echo:that creates other package headers.} -+]]) -+ end -+ print(rpm.expand([[ -+Name: %{source_name} -+Summary: %{source_summary} -+%description -+%wordwrap -v source_description -+]])) -+ explicitset("currentname", "%{source_name}", verbose) -+end -+ -+-- %new_package core -+local function new_package(source_name, pkg_name, name_suffix, first, verbose) -+ -- Safety net when the wrapper is used in conjunction with traditional syntax -+ if (not first) and (not source_name) then -+ rpm.expand([[ -+%{warn:Something already set a package name. However, %%{source_name} is not set.} -+%{warn:Please set %%{source_name} to the SRPM name to ensure reliable processing.} -+]]) -+ if name_suffix then -+ print(rpm.expand("%package " .. name_suffix)) -+ else -+ print(rpm.expand("%package -n " .. pkg_name)) -+ end -+ return -+ end -+ -- New processing -+ if not (pkg_name or name_suffix or source_name) then -+ rpm.expand([[ -+%{error:You need to set %%{source_name} or provide explicit package naming!} -+]]) -+ end -+ if name_suffix then -+ print(rpm.expand("%package " .. name_suffix)) -+ explicitset("currentname", "%{source_name}-" .. name_suffix, verbose) -+ else -+ if not source_name then -+ source_name = pkg_name -+ end -+ if (pkg_name == source_name) then -+ safeset("source_name", source_name, verbose) -+ print(rpm.expand("Name: %{source_name}")) -+ else -+ if source_name and first then -+ srcpkg(verbose) -+ end -+ print(rpm.expand("%package -n " .. pkg_name)) -+ end -+ explicitset("currentname", pkg_name, verbose) -+ end -+end -+ -+return { -+ read = read, -+ hasflag = hasflag, -+ readflag = readflag, -+ explicitset = explicitset, -+ explicitunset = explicitunset, -+ safeset = safeset, -+ zalias = zalias, -+ setcurrent = setcurrent, -+ echovars = echovars, -+ getsuffixed = getsuffixed, -+ getsuffixes = getsuffixes, -+ getbestsuffix = getbestsuffix, -+ writevars = writevars, -+ wordwrap = wordwrap, -+ new_package = new_package, -+} --- -2.27.0 - diff --git a/add-loongarch64-support-for-config.guess-and-config.sub.patch b/add-loongarch64-support-for-config.guess-and-config.sub.patch deleted file mode 100644 index acc2f83..0000000 --- a/add-loongarch64-support-for-config.guess-and-config.sub.patch +++ /dev/null @@ -1,26 +0,0 @@ -diff --git a/config.guess b/config.guess -index 463631a..2985f85 100644 ---- a/config.guess -+++ b/config.guess -@@ -975,6 +975,9 @@ EOF - k1om:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; -+ loongarch32:Linux:*:* | loongarch64:Linux:*:* | loongarchx32:Linux:*:*) -+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} -+ exit ;; - m32r*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; -diff --git a/config.sub b/config.sub -index 39dbf60..39870d3 100644 ---- a/config.sub -+++ b/config.sub -@@ -268,6 +268,7 @@ case $basic_machine in - | k1om \ - | le32 | le64 \ - | lm32 \ -+ | loongarch32 | loongarch64 | loongarchx32 \ - | m32c | m32r | m32rle | m68000 | m68k | m88k \ - | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ - | mips | mipsbe | mipseb | mipsel | mipsle \ diff --git a/add-loongarch64-to-generic_arches.patch b/add-loongarch64-to-generic_arches.patch deleted file mode 100644 index cf3dc63..0000000 --- a/add-loongarch64-to-generic_arches.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/macros b/macros -index d6b2c80..a66eb2e 100644 ---- a/macros -+++ b/macros -@@ -241,7 +241,7 @@ - %pkg_vcmp() (%{expand:%%{pkg_version_cmp %1 %3}} %2 0) - - #arches macros --%generic_arches %{ix86} x86_64 %{arm} aarch64 -+%generic_arches %{ix86} x86_64 %{arm} aarch64 loongarch64 - %ldc_arches %{generic_arches} - %valgrind_arches %{generic_arches} - %nodejs_arches %{generic_arches} diff --git a/add-powerpc64le-and-ppc64le-support.patch b/add-powerpc64le-and-ppc64le-support.patch deleted file mode 100644 index 8840182..0000000 --- a/add-powerpc64le-and-ppc64le-support.patch +++ /dev/null @@ -1,39 +0,0 @@ -From c6d355a6997ac10403181015b5ca9d17dcf8d1a7 Mon Sep 17 00:00:00 2001 -From: JianChunfu -Date: Tue, 24 Oct 2023 18:38:38 +0800 -Subject: [PATCH] add powerpc64le and ppc64le support - ---- - macros | 2 +- - rpmrc | 2 ++ - 2 files changed, 3 insertions(+), 1 deletion(-) - -diff --git a/macros b/macros -index 5c7447b..38dc694 100644 ---- a/macros -+++ b/macros -@@ -225,7 +225,7 @@ - %pkg_vcmp() (%{expand:%%{pkg_version_cmp %1 %3}} %2 0) - - #arches macros --%generic_arches %{ix86} x86_64 %{arm} aarch64 loongarch64 -+%generic_arches %{ix86} x86_64 %{arm} aarch64 loongarch64 powerpc64le ppc64le - %ldc_arches %{generic_arches} - %valgrind_arches %{generic_arches} - %nodejs_arches %{generic_arches} -diff --git a/rpmrc b/rpmrc -in -dex 8ba756d..10d7c86 100644 ---- a/rpmrc -+++ b/rpmrc -@@ -8,6 +8,8 @@ optflags: x86_64 %{__global_compiler_flags} -m64 -mtune=generic -fasynchronous-u - optflags: aarch64 %{__global_compiler_flags} -fasynchronous-unwind-tables -fstack-clash-protection - optflags: riscv64 %{__global_compiler_flags} -fasynchronous-unwind-tables -fstack-clash-protection - -+optflags: ppc64le %{__global_compiler_flags} -fasynchronous-unwind-tables -fstack-clash-protection -+ - buildarchtranslate: athlon: i686 - buildarchtranslate: geode: i686 - buildarchtranslate: pentium4: i686 --- -2.33.0 diff --git a/add-pyproject-macros.patch b/add-pyproject-macros.patch deleted file mode 100644 index c6664c9..0000000 --- a/add-pyproject-macros.patch +++ /dev/null @@ -1,42 +0,0 @@ -From b16ce81ae43c1e702beb1351ee9891e3e3f697e6 Mon Sep 17 00:00:00 2001 -From: caodongxia <315816521@qq.com> -Date: Thu, 13 Apr 2023 17:11:53 +0800 -Subject: [PATCH] add pyproject macros - ---- - macros.python | 12 +++++++++++ - 1 file changed, 12 insertions(+) - -diff --git a/macros.python b/macros.python -index d504d3f..d5a7a86 100644 ---- a/macros.python -+++ b/macros.python -@@ -28,6 +28,12 @@ find $bytecode_compilation_path -type f -a -name "*.py" -print0 | xargs -0 $pyth - sleep 1 - } - -+%pyproject_build() %{expand:\\\ -+ CFLAGS="${CFLAGS:-${RPM_OPT_FLAGS}}" LDFLAGS="${LDFLAGS:-${RPM_LD_FLAGS}}"\\\ -+ %{__python3} -mpip wheel --verbose --progress-bar off --disable-pip-version-check --use-pep517 --no-build-isolation --no-deps --wheel-dir ./build . %{?*} -+ sleep 1 -+} -+ - %py_build_egg() %{expand:\\\ - CFLAGS="${CFLAGS:-${RPM_OPT_FLAGS}}" LDFLAGS="${LDFLAGS:-${RPM_LD_FLAGS}}"\\\ - %{__python} %{py_setup} %{?py_setup_args} bdist_egg %{?*} -@@ -45,6 +51,12 @@ find $bytecode_compilation_path -type f -a -name "*.py" -print0 | xargs -0 $pyth - %{__python} %{py_setup} %{?py_setup_args} install -O1 --skip-build --root %{buildroot} %{?*} - } - -+%pyproject_install() %{expand:\\\ -+ specifier=$(ls ./build/*.whl | xargs basename --multiple | sed -E 's/([^-]+)-([^-]+)-.+\\\.whl/\\\1==\\\2/') -+ CFLAGS="${CFLAGS:-${RPM_OPT_FLAGS}}" LDFLAGS="${LDFLAGS:-${RPM_LD_FLAGS}}"\\\ -+ %{__python3} -mpip install --verbose --progress-bar off --disable-pip-version-check --root %{buildroot} --no-compile --ignore-installed --no-deps --no-index --find-links ./build $specifier %{?*} -+} -+ - %py_install_egg() %{expand:\\\ - mkdir -p %{buildroot}%{python_sitelib} - easy_install -m --prefix %{buildroot}%{_prefix} -Z dist/*-py%{python_version}.egg %{?*} --- -2.23.0 - diff --git a/add-pytest-and-tox-macros.patch b/add-pytest-and-tox-macros.patch deleted file mode 100644 index b76444e..0000000 --- a/add-pytest-and-tox-macros.patch +++ /dev/null @@ -1,42 +0,0 @@ -From 2f7b74e83fc52d326d5db7de2bcfab2c8d921f29 Mon Sep 17 00:00:00 2001 -From: desert-sailor -Date: Mon, 24 Jul 2023 11:36:52 +0800 -Subject: [PATCH] add pytest and tox macros - ---- - macros.python | 22 ++++++++++++++++++++++ - 1 file changed, 22 insertions(+) - -diff --git a/macros.python b/macros.python -index 1cc6e70..334c0ab 100644 ---- a/macros.python -+++ b/macros.python -@@ -304,3 +304,25 @@ find $bytecode_compilation_path -type f -a -name "*.py" -print0 | xargs -0 $pyth - %python_sitelib %(%{__python} -c "from distutils.sysconfig import get_python_lib; import sys; sys.stdout.write(get_python_lib())") - %python_sitearch %(%{__python} -c "from distutils.sysconfig import get_python_lib; import sys; sys.stdout.write(get_python_lib(1))") - %python_version %(%{__python} -c "import sys; sys.stdout.write(sys.version[:3])") -+ -+# New python test macros -+%pytest() %{expand:\\\ -+CFLAGS="${CFLAGS:-${RPM_OPT_FLAGS}}" LDFLAGS="${LDFLAGS:-${RPM_LD_FLAGS}}" \\ -+PATH="%{buildroot}%{_bindir}:$PATH" \\ -+PYTHONPATH="${PYTHONPATH:-%{buildroot}%{python3_sitearch}:%{buildroot}%{python3_sitelib}}" \\ -+PYTHONDONTWRITEBYTECODE=1 \\ -+%{?__pytest_addopts:PYTEST_ADDOPTS="${PYTEST_ADDOPTS:-} %{__pytest_addopts}"} \\ -+PYTEST_XDIST_AUTO_NUM_WORKERS=%{_smp_build_ncpus} \\ -+%{_bindir}/pytest %{?*} -+} -+ -+%tox() %{expand:\\\ -+TOX_TESTENV_PASSENV="${TOX_TESTENV_PASSENV:-*}" \\ -+CFLAGS="${CFLAGS:-${RPM_OPT_FLAGS}}" LDFLAGS="${LDFLAGS:-${RPM_LD_FLAGS}}" \\ -+PATH="%{buildroot}%{_bindir}:$PATH" \\ -+PYTHONPATH="${PYTHONPATH:-%{buildroot}%{python3_sitearch}:%{buildroot}%{python3_sitelib}}" \\ -+PYTHONDONTWRITEBYTECODE=1 \\ -+%{?__pytest_addopts:PYTEST_ADDOPTS="${PYTEST_ADDOPTS:-} %{__pytest_addopts}"} \\ -+PYTEST_XDIST_AUTO_NUM_WORKERS=%{_smp_build_ncpus} \\ -+%{__python3} -m tox -e py%{python3_version_nodots} --current-env %{?*} -+} --- -2.33.0 - diff --git a/add-riscv64-to-some-arches-macro.patch b/add-riscv64-to-some-arches-macro.patch deleted file mode 100644 index 987acea..0000000 --- a/add-riscv64-to-some-arches-macro.patch +++ /dev/null @@ -1,41 +0,0 @@ -From 09e746df9d0c333fef9aabcec3047f68c9d1fc60 Mon Sep 17 00:00:00 2001 -From: laokz -Date: Sat, 27 Apr 2024 15:09:30 +0800 -Subject: [PATCH] add riscv64 to some arches macro - ---- - macros | 11 +++++------ - 1 file changed, 5 insertions(+), 6 deletions(-) - -diff --git a/macros b/macros -index 218cd23..c609e85 100644 ---- a/macros -+++ b/macros -@@ -310,7 +310,7 @@ - %generic_arches %{ix86} x86_64 %{arm} aarch64 loongarch64 powerpc64le ppc64le - %ldc_arches %{generic_arches} - %valgrind_arches %{generic_arches} --%nodejs_arches %{generic_arches} -+%nodejs_arches %{generic_arches} riscv64 - %ldc_arches %{generic_arches} - %mono_arches %{generic_arches} - %fpc_arches %{generic_arches} -@@ -319,11 +319,10 @@ - %GNAT_arches %{GPRbuild_arches} %{generic_arches} - %GPRbuild_arches %{generic_arches} - %nim_arches %{generic_arches} --%nodejs_arches %{generic_arches} --%ocaml_native_compiler %{generic_arches} --%ocaml_natdynlink %{generic_arches} --%ocaml_native_profiling %{generic_arches} --%openblas_arches %{generic_arches} -+%ocaml_native_compiler %{generic_arches} riscv64 -+%ocaml_natdynlink %{generic_arches} riscv64 -+%ocaml_native_profiling %{generic_arches} riscv64 -+%openblas_arches %{generic_arches} riscv64 - - #%ldconfig /sbin/ldconfig - %ldconfig_post(n:) %{?ldconfig:%post -p %ldconfig %{?*} %{-n:-n %{-n*}}\ --- -2.39.2 - diff --git a/backport-Enable-as-needed-by-default.patch b/backport-Enable-as-needed-by-default.patch deleted file mode 100644 index 182e388..0000000 --- a/backport-Enable-as-needed-by-default.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 210649d3a50eb862eb95caec54c52cd1513a1dda Mon Sep 17 00:00:00 2001 -From: Igor Gnatenko -Date: Wed, 15 Aug 2018 07:00:14 +0200 -Subject: [PATCH] Enable --as-needed by default - -Conflict:adapt context -Reference:https://src.fedoraproject.org/rpms/redhat-rpm-config/c/357550f7ba4495b01399c904d389369eb0666837 - -Signed-off-by: Igor Gnatenko ---- - macros | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/macros b/macros -index cb96614..0d54994 100644 ---- a/macros -+++ b/macros -@@ -257,8 +257,8 @@ - #%_ld_strict_symbol_defs 1 - %_ld_symbols_flags %{?_ld_strict_symbol_defs:-Wl,-z,defs} - --# use "%define _ld_as_needed 1" to enable. --#%_ld_as_needed 1 -+# use "%undefine _ld_as_needed" to disable. -+%_ld_as_needed 1 - %_ld_as_needed_flags %{?_ld_as_needed:-Wl,--as-needed} - - %_general_options -O2 -g -grecord-gcc-switches -pipe -fstack-protector-strong %[ "%{toolchain}" == "clang" ? "-fgcc-compatible" : "" ] --- -2.33.0 - diff --git a/backport-kmp-feature.patch b/backport-kmp-feature.patch deleted file mode 100644 index 6525efb..0000000 --- a/backport-kmp-feature.patch +++ /dev/null @@ -1,485 +0,0 @@ -From 3e65c85831be0b8f8e1cd43869b4991a76e14d9b Mon Sep 17 00:00:00 2001 -From: Yang Yanchao -Date: Fri, 17 Mar 2023 01:09:09 +0000 -Subject: [PATCH] backport kmp feature - -Signed-off-by: Yang Yanchao -Signed-off-by: Xinliang Liu ---- - kmodtool | 281 ++++++++++++++++++++++++++++++++++++++++++++++++++++ - kmodtool.py | 83 --------------- - macros.kmp | 85 ++++++++++++---- - 3 files changed, 350 insertions(+), 105 deletions(-) - create mode 100644 kmodtool - delete mode 100644 kmodtool.py - -diff --git a/kmodtool b/kmodtool -new file mode 100644 -index 0000000..427d1df ---- /dev/null -+++ b/kmodtool -@@ -0,0 +1,281 @@ -+#!/usr/bin/bash -+ -+# kmodtool - Helper script for building kernel module RPMs -+# Copyright (c) 2003-2006 Ville Skyttä , -+# Thorsten Leemhuis -+# Jon Masters -+# -+# Permission is hereby granted, free of charge, to any person obtaining -+# a copy of this software and associated documentation files (the -+# "Software"), to deal in the Software without restriction, including -+# without limitation the rights to use, copy, modify, merge, publish, -+# distribute, sublicense, and/or sell copies of the Software, and to -+# permit persons to whom the Software is furnished to do so, subject to -+# the following conditions: -+# -+# The above copyright notice and this permission notice shall be -+# included in all copies or substantial portions of the Software. -+# -+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -+ -+shopt -s extglob -+ -+myprog="kmodtool" -+myver="0.10.10_kmp2" -+knownvariants=@(BOOT|PAE|@(big|huge)mem|debug|enterprise|kdump|?(large)smp|uml|xen[0U]?(-PAE)|xen) -+kmod_name= -+kver= -+verrel= -+variant= -+kmp= -+ -+get_verrel () -+{ -+ verrel=${1:-$(uname -r)} -+ verrel=${verrel%%$knownvariants} -+} -+ -+print_verrel () -+{ -+ get_verrel $@ -+ echo "${verrel}" -+} -+ -+get_variant () -+{ -+ get_verrel $@ -+ variant=${1:-$(uname -r)} -+ variant=${variant##$verrel} -+ variant=${variant:-'""'} -+} -+ -+print_variant () -+{ -+ get_variant $@ -+ echo "${variant}" -+} -+ -+get_filelist() { -+ local IFS=$'\n' -+ filelist=($(cat)) -+ -+ if [ ${#filelist[@]} -gt 0 ]; -+ then -+ for ((n = 0; n < ${#filelist[@]}; n++)); -+ do -+ line="${filelist[n]}" -+ line=$(echo "$line" \ -+ | sed -e "s/%verrel/$verrel/g" \ -+ | sed -e "s/%variant/$variant/g" \ -+ | sed -e "s/%dashvariant/$dashvariant/g" \ -+ | sed -e "s/%dotvariant/$dotvariant/g" \ -+ | sed -e "s/\.%1/$dotvariant/g" \ -+ | sed -e "s/\-%1/$dotvariant/g" \ -+ | sed -e "s/%2/$verrel/g") -+ echo "$line" -+ done -+ else -+ echo "%defattr(644,root,root,755)" -+ echo "/lib/modules/${verrel}${dotvariant}" -+ fi -+} -+ -+get_rpmtemplate () -+{ -+ local variant="${1}" -+ local dashvariant="${variant:+-${variant}}" -+ case "$verrel" in -+ *.el*) kdep="kernel${dashvariant}-%{_target_cpu} = ${verrel}" ;; -+ *.EL*) kdep="kernel${dashvariant}-%{_target_cpu} = ${verrel}" ;; -+ *) kdep="kernel-%{_target_cpu} = ${verrel}${variant}" ;; -+ esac -+ -+ echo "%package -n kmod-${kmod_name}${dashvariant}" -+ -+ if [ -z "$kmp_provides_summary" ]; then -+ echo "Summary: ${kmod_name} kernel module(s)" -+ fi -+ -+ if [ -z "$kmp_provides_group" ]; then -+ echo "Group: System Environment/Kernel" -+ fi -+ -+ if [ ! -z "$kmp_version" ]; then -+ echo "Version: %{kmp_version}" -+ fi -+ -+ if [ ! -z "$kmp_release" ]; then -+ echo "Release: %{kmp_release}" -+ fi -+ -+ cat <= %{?epoch:%{epoch}:}%{version} -+# -+ -+ cat < /dev/null || : -+fi -+EOF -+ -+ if [ ! -z "$kmp" ]; then -+ cat < /var/run/rpm-kmod-${kmod_name}${dashvariant}-modules -+EOF -+ -+ fi -+ -+ cat < /dev/null || : -+EOF -+ -+ if [ ! -z "$kmp" ]; then -+ cat <&2 -+ exit 2 -+ elif [ -z "${kver}" ] ; then -+ echo "Please provide the kver as second parameter." >&2 -+ exit 2 -+ elif [ -z "${verrel}" ] ; then -+ echo "Couldn't find out the verrel." >&2 -+ exit 2 -+ fi -+ -+ for variant in "$@" ; do -+ if [ "default" == "$variant" ]; -+ then -+ get_rpmtemplate "" -+ else -+ get_rpmtemplate "${variant}" -+ fi -+ done -+} -+ -+usage () -+{ -+ cat <