]> www.infradead.org Git - users/hch/misc.git/commitdiff
kbuild: rust: add `CONFIG_RUSTC_LLVM_VERSION`
authorGary Guo <gary@garyguo.net>
Fri, 11 Oct 2024 11:40:33 +0000 (12:40 +0100)
committerMiguel Ojeda <ojeda@kernel.org>
Sun, 13 Oct 2024 20:22:28 +0000 (22:22 +0200)
Each version of Rust supports a range of LLVM versions. There are cases where
we want to gate a config on the LLVM version instead of the Rust version.
Normalized cfi integer tags are one example [1].

The invocation of rustc-version is being moved from init/Kconfig to
scripts/Kconfig.include for consistency with cc-version.

Link: https://lore.kernel.org/all/20240925-cfi-norm-kasan-fix-v1-1-0328985cdf33@google.com/
Signed-off-by: Gary Guo <gary@garyguo.net>
Link: https://lore.kernel.org/r/20241011114040.3900487-1-gary@garyguo.net
[ Added missing `-llvm` to the Usage documentation. - Miguel ]
Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
init/Kconfig
scripts/Kconfig.include
scripts/rustc-llvm-version.sh [new file with mode: 0755]

index 530a382ee0feb391b4717abdba3672e584a462d0..98cf859d58c2dd3e8bbb45b7365943c0ea9b6daf 100644 (file)
@@ -62,7 +62,7 @@ config LLD_VERSION
 
 config RUSTC_VERSION
        int
-       default $(shell,$(srctree)/scripts/rustc-version.sh $(RUSTC))
+       default $(rustc-version)
        help
          It does not depend on `RUST` since that one may need to use the version
          in a `depends on`.
@@ -78,6 +78,10 @@ config RUST_IS_AVAILABLE
          In particular, the Makefile target 'rustavailable' is useful to check
          why the Rust toolchain is not being detected.
 
+config RUSTC_LLVM_VERSION
+       int
+       default $(rustc-llvm-version)
+
 config CC_CAN_LINK
        bool
        default $(success,$(srctree)/scripts/cc-can-link.sh $(CC) $(CLANG_FLAGS) $(USERCFLAGS) $(USERLDFLAGS) $(m64-flag)) if 64BIT
index 785a491e599689b7f1f3c33d22c19d5ebc63ba53..33193ca6e8030e659d6b321acaea1acd42c387a4 100644 (file)
@@ -65,6 +65,9 @@ cc-option-bit = $(if-success,$(CC) -Werror $(1) -E -x c /dev/null -o /dev/null,$
 m32-flag := $(cc-option-bit,-m32)
 m64-flag := $(cc-option-bit,-m64)
 
+rustc-version := $(shell,$(srctree)/scripts/rustc-version.sh $(RUSTC))
+rustc-llvm-version := $(shell,$(srctree)/scripts/rustc-llvm-version.sh $(RUSTC))
+
 # $(rustc-option,<flag>)
 # Return y if the Rust compiler supports <flag>, n otherwise
 # Calls to this should be guarded so that they are not evaluated if
diff --git a/scripts/rustc-llvm-version.sh b/scripts/rustc-llvm-version.sh
new file mode 100755 (executable)
index 0000000..b6063cb
--- /dev/null
@@ -0,0 +1,22 @@
+#!/bin/sh
+# SPDX-License-Identifier: GPL-2.0
+#
+# Usage: $ ./rustc-llvm-version.sh rustc
+#
+# Print the LLVM version that the Rust compiler uses in a 6 digit form.
+
+# Convert the version string x.y.z to a canonical up-to-6-digits form.
+get_canonical_version()
+{
+       IFS=.
+       set -- $1
+       echo $((10000 * $1 + 100 * $2 + $3))
+}
+
+if output=$("$@" --version --verbose 2>/dev/null | grep LLVM); then
+       set -- $output
+       get_canonical_version $3
+else
+       echo 0
+       exit 1
+fi