[PATCH v2] kbuild: pahole-version: improve overall checking and error messages

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Like patch "rust: suppress error messages from
CONFIG_{RUSTC,BINDGEN}_VERSION_TEXT" [1], do not assume the file existing
and being executable implies executing it will succeed.

Instead, bail out if executing it fails for any reason, as well as if
the program does not print to standard output what we are expecting from
`pahole --version`. The script needs to ensure that it always returns
an integer, since its output will go into a Kconfig `int`-type symbol.

In addition, check whether the program exists first, and provide
error messages for each error condition, similar to how it is done in
e.g. `scripts/rust_is_available.sh`.

For instance, currently `pahole` may be built for another architecture
or may be a program we do not expect that fails:

    $ echo 'bad' > bad-pahole
    $ chmod u+x bad-pahole
    $ make PAHOLE=./bad-pahole defconfig
    ...
    ./bad-pahole: 1: bad: not found
    init/Kconfig:112: syntax error
    init/Kconfig:112: invalid statement

With this applied, we get instead:

    ***
    *** Running './bad-pahole' to check the pahole version failed with
    *** code 127. pahole will not be used.
    ***
    ...
    $ grep CONFIG_PAHOLE_VERSION .config
    CONFIG_PAHOLE_VERSION=0

Similarly, `pahole` currently may be a program that returns successfully,
but that does not print the version that we would expect:

    $ echo 'echo' > bad-pahole
    $ chmod u+x bad-pahole
    $ make PAHOLE=./bad-pahole defconfig
    ...
    init/Kconfig:114: syntax error
    init/Kconfig:114: invalid statement

With this applied, we get instead:

    ***
    *** pahole './bad-pahole' returned an unexpected version output.
    *** pahole will not be used.
    ***
    ...
    $ grep CONFIG_PAHOLE_VERSION .config
    CONFIG_PAHOLE_VERSION=0

Finally, with this applied, if the program does not exist, we get:

    $ make PAHOLE=./bad-pahole defconfig
    ...
    ***
    *** pahole './bad-pahole' could not be found. pahole will not be used.
    ***
    ...
    $ grep CONFIG_PAHOLE_VERSION .config
    CONFIG_PAHOLE_VERSION=0

Link: https://lore.kernel.org/rust-for-linux/20240727140302.1806011-1-masahiroy@xxxxxxxxxx/ [1]
Co-developed-by: Nicolas Schier <nicolas@xxxxxxxxx>
Signed-off-by: Nicolas Schier <nicolas@xxxxxxxxx>
Signed-off-by: Miguel Ojeda <ojeda@xxxxxxxxxx>
---
v1: https://lore.kernel.org/all/20240728125527.690726-1-ojeda@xxxxxxxxxx/
v2:

Reworked to catch successful programs that may not output what we expect from
pahole as well as to do the checking step-by-step (for better error messages).

I didn't change the regular expression to reduce the changes (except adding
`p`) -- it can be improved separately.

Also, please note that I added Nicolas as co-author since he proposed part of
the solution, but he has not formally signed off yet.

 scripts/pahole-version.sh | 30 +++++++++++++++++++++++++++---
 1 file changed, 27 insertions(+), 3 deletions(-)

diff --git a/scripts/pahole-version.sh b/scripts/pahole-version.sh
index f8a32ab93ad1..cdb80a3d6e4f 100755
--- a/scripts/pahole-version.sh
+++ b/scripts/pahole-version.sh
@@ -5,9 +5,33 @@
 #
 # Prints pahole's version in a 3-digit form, such as 119 for v1.19.

-if [ ! -x "$(command -v "$@")" ]; then
-	echo 0
+set -e
+trap "echo 0; exit 1" EXIT
+
+if ! command -v "$@" >/dev/null; then
+	echo >&2 "***"
+	echo >&2 "*** pahole '$@' could not be found. pahole will not be used."
+	echo >&2 "***"
+	exit 1
+fi
+
+output=$("$@" --version 2>/dev/null) || code=$?
+if [ -n "$code" ]; then
+	echo >&2 "***"
+	echo >&2 "*** Running '$@' to check the pahole version failed with"
+	echo >&2 "*** code $code. pahole will not be used."
+	echo >&2 "***"
+	exit 1
+fi
+
+output=$(echo "$output" | sed -nE 's/v([0-9]+)\.([0-9]+)/\1\2/p')
+if [ -z "${output}" ]; then
+	echo >&2 "***"
+	echo >&2 "*** pahole '$@' returned an unexpected version output."
+	echo >&2 "*** pahole will not be used."
+	echo >&2 "***"
 	exit 1
 fi

-"$@" --version | sed -E 's/v([0-9]+)\.([0-9]+)/\1\2/'
+echo "${output}"
+trap EXIT

base-commit: 431c1646e1f86b949fa3685efc50b660a364c2b6
--
2.46.0




[Index of Archives]     [Linux&nblp;USB Development]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite Secrets]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux