Re: [PATCH 6/6] kbuild: rust_is_available: normalize version matching

Masahiro Yamada
2023-01-12T06:23:25Z

On Tue, Jan 10, 2023 at 5:46 AM Miguel Ojeda <ojeda@kernel.org> wrote:
>
> In order to match the version string, `sed` is used in a couple
> cases, and `grep` and `head` in a couple others.
>
> Make the script more consistent and easier to understand by
> using the same method, `sed`, for all of them.
>
> This makes the version matching also a bit more strict for
> the changed cases, since the strings `rustc ` and `bindgen `
> will now be required, which should be fine since `rustc`
> complains if one attempts to call it with another program
> name, and `bindgen` uses a hardcoded string.
>
> In addition, clarify why one of the existing `sed` commands
> does not provide an address like the others.
>
> Signed-off-by: Miguel Ojeda <ojeda@kernel.org>

Maybe, your purpose is to use sed consistently, but
perhaps you can avoid forking sed if you know the
format of the first line.

BTW, what is missing here is, you do not check if
${RUSTC} is really rustc.

I can fool this script to print
"arithmetic expression: expecting primary: "100000 * + 100 * + "

$ make RUSTC=true rustavailable
./scripts/rust_is_available.sh: 19: arithmetic expression: expecting
primary: "100000 * + 100 * + "
***
*** Please see Documentation/rust/quick-start.rst for details
*** on how to setup Rust support.
***
make: *** [Makefile:1809: rustavailable] Error 2

scripts/{as,ld}-version.sh tried their best to
parse the line with shell syntax only, and
print "unknown assembler invoked" if the given
tool does not seem to be a supported assembler.

> ---
> scripts/rust_is_available.sh | 9 +++++----
> 1 file changed, 5 insertions(+), 4 deletions(-)
>
> diff --git a/scripts/rust_is_available.sh b/scripts/rust_is_available.sh
> index a86659410e48..99811842b61f 100755
> --- a/scripts/rust_is_available.sh
> +++ b/scripts/rust_is_available.sh
> @@ -66,8 +66,7 @@ fi
> # Non-stable and distributions' versions may have a version suffix, e.g. `-dev`.
> rust_compiler_version=$( \
> LC_ALL=C "$RUSTC" --version 2>/dev/null \
> - | head -n 1 \
> - | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' \
> + | sed -nE '1s:.*rustc ([0-9]+\.[0-9]+\.[0-9]+).*:\1:p'
> )
> rust_compiler_min_version=$($min_tool_version rustc)
> rust_compiler_cversion=$(get_canonical_version $rust_compiler_version)
> @@ -94,8 +93,7 @@ fi
> # Non-stable and distributions' versions may have a version suffix, e.g. `-dev`.
> rust_bindings_generator_version=$( \
> LC_ALL=C "$BINDGEN" --version 2>/dev/null \
> - | head -n 1 \
> - | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' \
> + | sed -nE '1s:.*bindgen ([0-9]+\.[0-9]+\.[0-9]+).*:\1:p'
> )
> rust_bindings_generator_min_version=$($min_tool_version bindgen)
> rust_bindings_generator_cversion=$(get_canonical_version $rust_bindings_generator_version)
> @@ -139,6 +137,9 @@ fi
>
> # `bindgen` returned successfully, thus use the output to check that the version
> # of the `libclang` found by the Rust bindings generator is suitable.
> +#
> +# Unlike other version checks, note that this one does not necessarily appear
> +# in the first line of the output, thus no `sed` address is provided.
> bindgen_libclang_version=$( \
> echo "$bindgen_libclang_output" \
> | sed -nE 's:.*clang version ([0-9]+\.[0-9]+\.[0-9]+).*:\1:p'
> --
> 2.39.0
>

--
Best Regards
Masahiro Yamada