Message ID | 20240808221138.873750-2-ojeda@kernel.org (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | kbuild: rust: add `RUSTC_VERSION` and reconfig/rebuild support | expand |
On Fri, Aug 09, 2024 at 12:11:33AM +0200, Miguel Ojeda wrote: > Now that we support several Rust versions, introduce > `CONFIG_RUSTC_VERSION` so that it can be used in Kconfig to enable and > disable configuration options based on the `rustc` version. > > The approach taken resembles `pahole`'s -- see commit 613fe1692377 > ("kbuild: Add CONFIG_PAHOLE_VERSION"), i.e. a simple version parsing > without trying to identify several kinds of compilers, since so far > there is only one (`rustc`). > > However, unlike `pahole`'s, we also print a zero if executing failed for > any reason, rather than checking if the command is found and executable > (which still leaves things like a file that exists and is executable, > but e.g. is built for another platform [1]). An equivalent approach to > the one here has also been submitted for `pahole` [2]. > > Link: https://lore.kernel.org/rust-for-linux/CANiq72=4vX_tJMJLE6e+bg7ZECHkS-AQpm8GBzuK75G1EB7+Nw@mail.gmail.com/ [1] > Link: https://lore.kernel.org/linux-kbuild/20240728125527.690726-1-ojeda@kernel.org/ [2] > Signed-off-by: Miguel Ojeda <ojeda@kernel.org> > --- > init/Kconfig | 7 +++++++ > scripts/rustc-version.sh | 26 ++++++++++++++++++++++++++ > 2 files changed, 33 insertions(+) > create mode 100755 scripts/rustc-version.sh > > diff --git a/init/Kconfig b/init/Kconfig > index 3ada33b1d681..47e2c3227b99 100644 > --- a/init/Kconfig > +++ b/init/Kconfig > @@ -60,6 +60,13 @@ config LLD_VERSION > default $(ld-version) if LD_IS_LLD > default 0 > > +config RUSTC_VERSION > + int > + default $(shell,$(srctree)/scripts/rustc-version.sh $(RUSTC)) > + help > + It does not depend on `RUST` since that one may need to use the version > + in a `depends on`. > + > config RUST_IS_AVAILABLE > def_bool $(success,$(srctree)/scripts/rust_is_available.sh) > help > diff --git a/scripts/rustc-version.sh b/scripts/rustc-version.sh > new file mode 100755 > index 000000000000..62ea510be71b > --- /dev/null > +++ b/scripts/rustc-version.sh > @@ -0,0 +1,26 @@ > +#!/bin/sh > +# SPDX-License-Identifier: GPL-2.0 > +# > +# Usage: $ ./rustc-version.sh rustc > +# > +# Print the Rust compiler name and its version in a 6 or 7-digit form. > + > +# Convert the version string x.y.z to a canonical up-to-7-digits form. > +# > +# Note that this function uses one more digit (compared to other > +# instances in other version scripts) to give a bit more space to > +# `rustc` since it will reach 1.100.0 in late 2026. > +get_canonical_version() > +{ > + IFS=. > + set -- $1 > + echo $((100000 * $1 + 100 * $2 + $3)) > +} > + > +if output=$("$@" --version 2>/dev/null); then > + set -- $output > + get_canonical_version $2 > +else > + echo 0 > + exit 1 > +fi > -- > 2.46.0 > Reviewed-by: Nicolas Schier <nicolas@fjasle.eu>
diff --git a/init/Kconfig b/init/Kconfig index 3ada33b1d681..47e2c3227b99 100644 --- a/init/Kconfig +++ b/init/Kconfig @@ -60,6 +60,13 @@ config LLD_VERSION default $(ld-version) if LD_IS_LLD default 0 +config RUSTC_VERSION + int + default $(shell,$(srctree)/scripts/rustc-version.sh $(RUSTC)) + help + It does not depend on `RUST` since that one may need to use the version + in a `depends on`. + config RUST_IS_AVAILABLE def_bool $(success,$(srctree)/scripts/rust_is_available.sh) help diff --git a/scripts/rustc-version.sh b/scripts/rustc-version.sh new file mode 100755 index 000000000000..62ea510be71b --- /dev/null +++ b/scripts/rustc-version.sh @@ -0,0 +1,26 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 +# +# Usage: $ ./rustc-version.sh rustc +# +# Print the Rust compiler name and its version in a 6 or 7-digit form. + +# Convert the version string x.y.z to a canonical up-to-7-digits form. +# +# Note that this function uses one more digit (compared to other +# instances in other version scripts) to give a bit more space to +# `rustc` since it will reach 1.100.0 in late 2026. +get_canonical_version() +{ + IFS=. + set -- $1 + echo $((100000 * $1 + 100 * $2 + $3)) +} + +if output=$("$@" --version 2>/dev/null); then + set -- $output + get_canonical_version $2 +else + echo 0 + exit 1 +fi
Now that we support several Rust versions, introduce `CONFIG_RUSTC_VERSION` so that it can be used in Kconfig to enable and disable configuration options based on the `rustc` version. The approach taken resembles `pahole`'s -- see commit 613fe1692377 ("kbuild: Add CONFIG_PAHOLE_VERSION"), i.e. a simple version parsing without trying to identify several kinds of compilers, since so far there is only one (`rustc`). However, unlike `pahole`'s, we also print a zero if executing failed for any reason, rather than checking if the command is found and executable (which still leaves things like a file that exists and is executable, but e.g. is built for another platform [1]). An equivalent approach to the one here has also been submitted for `pahole` [2]. Link: https://lore.kernel.org/rust-for-linux/CANiq72=4vX_tJMJLE6e+bg7ZECHkS-AQpm8GBzuK75G1EB7+Nw@mail.gmail.com/ [1] Link: https://lore.kernel.org/linux-kbuild/20240728125527.690726-1-ojeda@kernel.org/ [2] Signed-off-by: Miguel Ojeda <ojeda@kernel.org> --- init/Kconfig | 7 +++++++ scripts/rustc-version.sh | 26 ++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100755 scripts/rustc-version.sh