From 7632a970b47bbe35541dcd93b6cb9c341c4610ca Mon Sep 17 00:00:00 2001 From: James Antill Date: Tue, 31 May 2022 14:57:13 -0400 Subject: [PATCH] Auto sync2gitlab import of redhat-rpm-config-130-1.el8.src.rpm --- brp-mangle-shebangs | 9 +- modalias.prov | 28 +-- redhat-annobin-plugin-select.sh | 199 +++++++++++++++++++++ redhat-annobin-select-annobin-built-plugin | 2 + redhat-annobin-select-gcc-built-plugin | 2 + redhat-rpm-config.spec | 38 +++- 6 files changed, 263 insertions(+), 15 deletions(-) create mode 100644 redhat-annobin-plugin-select.sh create mode 100644 redhat-annobin-select-annobin-built-plugin create mode 100644 redhat-annobin-select-gcc-built-plugin diff --git a/brp-mangle-shebangs b/brp-mangle-shebangs index fe28768..6a47b9f 100755 --- a/brp-mangle-shebangs +++ b/brp-mangle-shebangs @@ -93,7 +93,14 @@ while IFS= read -r line; do fi - read shebang_line < "$f" + if ! read shebang_line < "$f"; then + echo >&2 "*** WARNING: Cannot read the first line from $f, removing executable bit" + ts=$(stat -c %y "$f") + chmod -x "$f" + touch -d "$ts" "$f" + continue + fi + orig_shebang="${shebang_line#\#!}" if [ "$orig_shebang" = "$shebang_line" ]; then echo >&2 "*** WARNING: $f is executable but has no shebang, removing executable bit" diff --git a/modalias.prov b/modalias.prov index c5eda32..022c4f0 100644 --- a/modalias.prov +++ b/modalias.prov @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash -efu # heavily based upon find-suggests.ksyms by Andreas Gruenbacher . # with modifications by Michael Brown @@ -14,7 +14,8 @@ IFS=$'\n' # completeness, so that we can determine when drivers are folded into # mainline kernel. # -case "$1" in +is_kernel_package="" +case "${1:-}" in kernel-module-*) ;; # Fedora kernel module package names start with # kernel-module. kernel*) is_kernel_package=1 ;; @@ -25,6 +26,11 @@ if ! [ -z "$is_kernel_package" ]; then exit 0 fi +# Check for presence of the commands used +which /sbin/modinfo >/dev/null || exit 0 +which sed >/dev/null || exit 0 +which sort >/dev/null || exit 0 + print_modaliases() { declare class=$1 variants=$2 pos=$3 if [ -n "$variants" ]; then @@ -35,7 +41,7 @@ print_modaliases() { } combine_modaliases() { - declare tag class variants pos n + declare tag class variants="" pos="" n read class while read tag; do for ((n=0; n<${#class}; n++)); do @@ -58,19 +64,15 @@ combine_modaliases() { print_modaliases "$class" "$variants" "$pos" } -for module in $(grep -E '/lib/modules/.+\.ko$') $*; do +for module in $(grep -E '/lib/modules/.+\.ko(\.gz|\.bz2|\.xz)?$') "$@"; do # | head -n1 because some modules have *two* version tags. *cough*b44*cough* modver=$(/sbin/modinfo -F version "$module"| head -n1) - modver=${modver// /_} - + modver=${modver//[^0-9a-zA-Z._]/_} # only add version tag if it has a version - if [ -n "$modver" ]; then - /sbin/modinfo -F alias "$module" \ - | sed -nre "s,(.+),modalias(\\1) = $modver,p" - else - /sbin/modinfo -F alias "$module" \ - | sed -nre "s,(.+),modalias(\\1),p" - fi + [ -z "$modver" ] || modver=" = $modver" + + /sbin/modinfo -F alias "$module" \ + | sed -nre "s,[^][0-9a-zA-Z._:*?/-],_,g; s,(.+),modalias(\\1)$modver,p" done \ | sort -u \ | combine_modaliases diff --git a/redhat-annobin-plugin-select.sh b/redhat-annobin-plugin-select.sh new file mode 100644 index 0000000..7fb574d --- /dev/null +++ b/redhat-annobin-plugin-select.sh @@ -0,0 +1,199 @@ +#!/usr/bin/sh +# This is a script to select which GCC spec file fragment +# should be the destination of the redhat-annobin-cc1 symlink. + +# Author: Nick Clifton +# Copyright (c) 2021 Red Hat. +# +# This is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published +# by the Free Software Foundation; either version 2, or (at your +# option) any later version. + +# It is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# Usage: +# redhat-annobin-plugin-select [script-dir] +# +# If script-dir is not provided then /usr/lib/rpm/redhat is used +# as the location where all of the annobin plugin selection files +# can be found. + +if test "x$1" = "x" ; +then + rrcdir=/usr/lib/rpm/redhat +else + rrcdir=$1 +fi + +# Set this variable to non-zero to enable the generation of debugging +# messages. +debug=0 + +# Decide which version of the annobin plugin for gcc should be used. +# There are two possible versions, one created by the annobin package and one +# created by the gcc package. The logic selects the gcc version unless both +# have been built by the same version of the compiler. In that case the +# annobin version is selected instead. +# +# The point of all this is that the annobin plugin is very sensitive to +# mismatches with the version of gcc that built it. If the plugin is built +# by version A of gcc, but then run on version B of gcc, it is possible for +# the plugin to misbehave, which then causes problems if gating tests examine +# the plugin's output. (This has happened more than once in RHEL...). +# +# So the plugin is built both by gcc and by the annobin package. This means +# that whenever gcc is updated a fresh plugin is built, and the logic below +# will select that version. But in order to allow annobin development to +# proceed independtently of gcc, the annobin package can also update its +# version of the plugin, and the logic will select this new version. + +# This is where the annobin package stores the information on the version +# of gcc that built the annobin plugin. +aver=`gcc --print-file-name=plugin`/annobin-plugin-version-info + +# This is where the gcc package stores its version information. +gver=`gcc --print-file-name=rpmver` + +aplugin=`gcc --print-file-name=plugin`/annobin.so.0.0.0 +gplugin=`gcc --print-file-name=plugin`/gcc-annobin.so.0.0.0 + +# This is the file that needs to be updated when either of those version +# files changes. +rac1=redhat-annobin-cc1 + +# This is the GCC spec file fragment that selects the gcc-built version of +# the annobin plugin +select_gcc=redhat-annobin-select-gcc-built-plugin + +# This is the GCC spec file fragment that selects the annobin-built version +# of the annobin plugin +select_annobin=redhat-annobin-select-annobin-built-plugin + +install_annobin_version=0 +install_gcc_version=0 + +if [ -f $aplugin ] +then + if [ -f $gplugin ] + then + if [ $debug -eq 1 ] + then + echo " redhat-rpm-config: Both plugins exist, checking version information" + fi + + if [ -f $gver ] + then + if [ -f $aver ] + then + if [ $debug -eq 1 ] + then + echo " redhat-rpm-config: Both plugin version files exist - comparing..." + fi + + # Get the first line from the version info files. This is just in + # vase there are extra lines in the files. + avers=`head --lines=1 $aver` + gvers=`head --lines=1 $gver` + + if [ $debug -eq 1 ] + then + echo " redhat-rpm-config: Annobin plugin built by gcc $avers" + echo " redhat-rpm-config: GCC plugin built by gcc $gvers" + fi + + # If both plugins were built by the same version of gcc then select + # the one from the annobin package (in case it is built from newer + # sources). If the plugin builder versions differ, select the gcc + # built version instead. This assumes that the gcc built version + # always matches the installed gcc, which should be true. + if [ $avers = $gvers ] + then + if [ $debug -eq 1 ] + then + echo " redhat-rpm-config: Both plugins built by the same compiler - using annobin-built plugin" + fi + install_annobin_version=1 + else + if [ $debug -eq 1 ] + then + echo " redhat-rpm-config: Versions differ - using gcc-built plugin" + fi + install_gcc_version=1 + fi + else + if [ $debug -eq 1 ] + then + echo " redhat-rpm-config: Annobin version file does not exist, using gcc-built plugin" + fi + install_gcc_version=1 + fi + else + if [ -f $aver ] + then + # FIXME: This is suspicious. If the installed GCC does not supports plugins + # then enabling the annobin plugin will not work. + if [ $debug -eq 1 ] + then + echo " redhat-rpm-config: GCC plugin version file does not exist, using annobin-built plugin" + fi + install_annobin_version=1 + else + if [ $debug -eq 1 ] + then + echo " redhat-rpm-config: Neither version file exists - playing safe and using gcc-built plugin" + echo " redhat-rpm-config: Note: expected to find $aver and/or $gver" + fi + install_gcc_version=1 + fi + fi + else + if [ $debug -eq 1 ] + then + echo " redhat-rpm-config: Only the annobin plugin exists - using that" + fi + install_annobin_version=1 + fi +else + if [ -f $gplugin ] + then + if [ $debug -eq 1 ] + then + echo " redhat-rpm-config: Only the gcc plugin exists - using that" + fi + else + if [ $debug -eq 1 ] + then + echo " redhat-rpm-config: Neither plugin exists - playing safe and using gcc-built plugin" + echo " redhat-rpm-config: Note: expected to find $aplugin and/or $gplugin" + fi + fi + install_gcc_version=1 +fi + +if [ $install_annobin_version -eq 1 ] +then + if [ $debug -eq 1 ] + then + echo " redhat-rpm-config: Installing annobin version of $rac1" + fi + pushd $rrcdir > /dev/null + rm -f $rac1 + ln -s $select_annobin "$rac1" + popd > /dev/null + +else if [ $install_gcc_version -eq 1 ] + then + if [ $debug -eq 1 ] + then + echo " redhat-rpm-config: Installing gcc version of $rac1" + fi + pushd $rrcdir > /dev/null + rm -f $rac1 + ln -s $select_gcc $rac1 + popd > /dev/null + fi +fi diff --git a/redhat-annobin-select-annobin-built-plugin b/redhat-annobin-select-annobin-built-plugin new file mode 100644 index 0000000..edb8245 --- /dev/null +++ b/redhat-annobin-select-annobin-built-plugin @@ -0,0 +1,2 @@ +*cc1_options: ++ %{!-fno-use-annobin:%{!iplugindir*:%:find-plugindir()} -fplugin=annobin} diff --git a/redhat-annobin-select-gcc-built-plugin b/redhat-annobin-select-gcc-built-plugin new file mode 100644 index 0000000..af5106b --- /dev/null +++ b/redhat-annobin-select-gcc-built-plugin @@ -0,0 +1,2 @@ +*cc1_options: ++ %{!-fno-use-annobin:%{!iplugindir*:%:find-plugindir()} -fplugin=gcc-annobin} diff --git a/redhat-rpm-config.spec b/redhat-rpm-config.spec index 8a56f2e..073a0c4 100644 --- a/redhat-rpm-config.spec +++ b/redhat-rpm-config.spec @@ -6,7 +6,7 @@ Summary: Red Hat specific rpm configuration files Name: redhat-rpm-config -Version: 127 +Version: 130 Release: 1%{?dist} # No version specified. License: GPL+ @@ -27,6 +27,9 @@ Source51: redhat-hardened-ld # gcc specs files for annobin builds Source52: redhat-annobin-cc1 +Source53: redhat-annobin-select-gcc-built-plugin +Source54: redhat-annobin-select-annobin-built-plugin +Source55: redhat-annobin-plugin-select.sh # The macros defined by these files are for things that need to be defined # at srpm creation time when it is not feasible to require the base packages @@ -105,6 +108,7 @@ Requires: rpm >= 4.11.0 Requires: dwz >= 0.4 Requires: zip Requires: (annobin if gcc) +Requires: (gcc-plugin-annobin if gcc) # for brp-mangle-shebangs Requires: %{_bindir}/find @@ -170,6 +174,21 @@ install -p -m 755 -t %{buildroot}%{_rpmconfigdir} kmod.prov install -p -m 644 %{SOURCE20} %{buildroot}%{_fileattrsdir}/kabi.attr install -p -m 755 %{SOURCE21} %{buildroot}%{_rpmconfigdir}/kabi.sh +# This trigger is used to decide which version of the annobin plugin for gcc +# should be used. See comments in the script for full details. + +%triggerin -- annobin gcc-plugin-annobin +%{rrcdir}/redhat-annobin-plugin-select.sh +%end + +# We also trigger when annobin is uninstalled. This allows us to switch +# over to the gcc generated version of the plugin. It does not matter if +# gcc is uninstalled, since if that happens the plugin cannot be used. + +%triggerpostun -- annobin +%{rrcdir}/redhat-annobin-plugin-select.sh +%end + %files %dir %{rrcdir} %{rrcdir}/macros @@ -194,6 +213,12 @@ install -p -m 755 %{SOURCE21} %{buildroot}%{_rpmconfigdir}/kabi.sh %{_rpmconfigdir}/macros.d/macros.kernel-srpm %{_rpmconfigdir}/macros.d/macros.fedora-misc %{_rpmconfigdir}/kabi.sh + +%attr(0755,-,-) %{rrcdir}/redhat-annobin-plugin-select.sh +%verify(owner group mode) %{rrcdir}/redhat-annobin-cc1 +%{rrcdir}/redhat-annobin-select-gcc-built-plugin +%{rrcdir}/redhat-annobin-select-annobin-built-plugin + %doc buildflags.md %files -n kernel-rpm-macros @@ -210,6 +235,17 @@ install -p -m 755 %{SOURCE21} %{buildroot}%{_rpmconfigdir}/kabi.sh %{_rpmconfigdir}/macros.d/macros.kmp %changelog +* Tue Apr 05 2022 Nick Clifton = 130-1 +- Select between gcc-built and annobin-built versions of the annobin plugin. + (#2067153) + +* Wed Mar 23 2022 Michal Domonkos - 129-1 +- Fix handling of files without newlines in brp-mangle-shebang (#2063036) + +* Wed Jan 05 2022 Eugene Syromiatnikov - 128-1 +- modalias.prov: handle compressed kmods, sanitise alias/version strings + (#1976000) + * Mon Dec 13 2021 Michal Domonkos - 127-1 - Add Requires: glibc-gconv-extras to cover for the split (#2013328)