[v2,14/21] kconfig: add CC_IS_CLANG and CLANG_VERSION

Message ID 1522128575-5326-15-git-send-email-yamada.masahiro@socionext.com
State Superseded
Headers show
Series
  • kconfig: move compiler capability tests to Kconfig
Related show

Commit Message

Masahiro Yamada March 27, 2018, 5:29 a.m.
This will be useful to describe the clang version dependency.

Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>

---

Changes in v2: None

 init/Kconfig             |  7 +++++++
 scripts/clang-version.sh | 24 +++++++++++-------------
 2 files changed, 18 insertions(+), 13 deletions(-)

-- 
2.7.4

Comments

Kees Cook March 28, 2018, 11:22 a.m. | #1
On Mon, Mar 26, 2018 at 10:29 PM, Masahiro Yamada
<yamada.masahiro@socionext.com> wrote:
> This will be useful to describe the clang version dependency.

>

> Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>


One aspect of clang version checking that may be "weird" (and likely
won't be meaningful for very long as we're about to raise the minimum
gcc version), is that clang claims to be gcc version 4.2 if you look
at #defines. This is already handled in compiler.h, but may be weird
in Kconfig.

Regardless:

Reviewed-by: Kees Cook <keescook@chromium.org>


-Kees

-- 
Kees Cook
Pixel Security
Masahiro Yamada March 28, 2018, 11:52 a.m. | #2
2018-03-28 20:22 GMT+09:00 Kees Cook <keescook@chromium.org>:
> On Mon, Mar 26, 2018 at 10:29 PM, Masahiro Yamada

> <yamada.masahiro@socionext.com> wrote:

>> This will be useful to describe the clang version dependency.

>>

>> Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>

>

> One aspect of clang version checking that may be "weird" (and likely

> won't be meaningful for very long as we're about to raise the minimum

> gcc version), is that clang claims to be gcc version 4.2 if you look

> at #defines. This is already handled in compiler.h, but may be weird

> in Kconfig.

>



CONFIG_CLANG_VERSION gives me real clang version.


$ clang --version
clang version 7.0.0 (http://llvm.org/git/clang.git
f1d1f4c4591e81cfa80034df094b26d7eb4fa92b)
(http://llvm.org/git/llvm.git
d157ba2f80790d23d717c4ff3f5bee30d98d6a51)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /home/masahiro/toolchains/clang-latest/bin

$ make CC=clang defconfig
*** Default configuration is based on 'x86_64_defconfig'
#
# configuration written to .config
#
$ grep  CLANG_VERSION .config
CONFIG_CLANG_VERSION=70000



I am just porting
https://patchwork.kernel.org/patch/10085765/
to Kconfig.


-- 
Best Regards
Masahiro Yamada

Patch

diff --git a/init/Kconfig b/init/Kconfig
index 923cab5..5998034 100644
--- a/init/Kconfig
+++ b/init/Kconfig
@@ -22,6 +22,13 @@  config GCC_VERSION
 	default $(shell $srctree/scripts/gcc-version.sh -p $CC | sed 's/^0*//') if CC_IS_GCC
 	default 0
 
+config CC_IS_CLANG
+	def_bool $(success $CC --version | grep -q clang)
+
+config CLANG_VERSION
+	int
+	default $(shell $srctree/scripts/clang-version.sh $CC)
+
 config CONSTRUCTORS
 	bool
 	depends on !UML
diff --git a/scripts/clang-version.sh b/scripts/clang-version.sh
index 9780efa..d8002d2 100755
--- a/scripts/clang-version.sh
+++ b/scripts/clang-version.sh
@@ -10,24 +10,22 @@ 
 # clang-5.0.1 etc.
 #
 
-if [ "$1" = "-p" ] ; then
-	with_patchlevel=1;
-	shift;
-fi
-
 compiler="$*"
 
 if [ ${#compiler} -eq 0 ]; then
-	echo "Error: No compiler specified."
-	printf "Usage:\n\t$0 <clang-command>\n"
+	echo "Error: No compiler specified." >&2
+	printf "Usage:\n\t$0 <clang-command>\n" >&2
+	echo 0
+	exit 1
+fi
+
+if !( $compiler --version | grep -q clang) ; then
+	echo "This is not clang." >&2
+	echo 0
 	exit 1
 fi
 
 MAJOR=$(echo __clang_major__ | $compiler -E -x c - | tail -n 1)
 MINOR=$(echo __clang_minor__ | $compiler -E -x c - | tail -n 1)
-if [ "x$with_patchlevel" != "x" ] ; then
-	PATCHLEVEL=$(echo __clang_patchlevel__ | $compiler -E -x c - | tail -n 1)
-	printf "%02d%02d%02d\\n" $MAJOR $MINOR $PATCHLEVEL
-else
-	printf "%02d%02d\\n" $MAJOR $MINOR
-fi
+PATCHLEVEL=$(echo __clang_patchlevel__ | $compiler -E -x c - | tail -n 1)
+printf "%d%02d%02d\\n" $MAJOR $MINOR $PATCHLEVEL