summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKees Cook <keescook@chromium.org>2016-06-18 02:11:12 -0400
committerKees Cook <keescook@chromium.org>2016-08-08 20:49:05 -0400
commited58c0e9eefef517aa5a547b78658e2ab4422232 (patch)
tree678081bd9195ee83fc89ccf06ffd4c551d1d9d44
parentd26e94149276f8c3d4911aa2c8395ba99b613c8d (diff)
gcc-plugins: abort builds cleanly when not supported
When the compiler doesn't support gcc plugins (either due to missing headers or too old a version), report the problem and abort the build instead of emitting a warning and letting the build founder with arcane compiler errors. Signed-off-by: Kees Cook <keescook@chromium.org>
-rw-r--r--Makefile7
-rw-r--r--scripts/Makefile.gcc-plugins34
-rwxr-xr-xscripts/gcc-plugin.sh14
3 files changed, 39 insertions, 16 deletions
diff --git a/Makefile b/Makefile
index 70de1448c571..8c504f324154 100644
--- a/Makefile
+++ b/Makefile
@@ -635,13 +635,6 @@ endif
635# Tell gcc to never replace conditional load with a non-conditional one 635# Tell gcc to never replace conditional load with a non-conditional one
636KBUILD_CFLAGS += $(call cc-option,--param=allow-store-data-races=0) 636KBUILD_CFLAGS += $(call cc-option,--param=allow-store-data-races=0)
637 637
638PHONY += gcc-plugins
639gcc-plugins: scripts_basic
640ifdef CONFIG_GCC_PLUGINS
641 $(Q)$(MAKE) $(build)=scripts/gcc-plugins
642endif
643 @:
644
645include scripts/Makefile.gcc-plugins 638include scripts/Makefile.gcc-plugins
646 639
647ifdef CONFIG_READABLE_ASM 640ifdef CONFIG_READABLE_ASM
diff --git a/scripts/Makefile.gcc-plugins b/scripts/Makefile.gcc-plugins
index 5e22b60589c1..bbca1f46f6e4 100644
--- a/scripts/Makefile.gcc-plugins
+++ b/scripts/Makefile.gcc-plugins
@@ -23,21 +23,37 @@ ifdef CONFIG_GCC_PLUGINS
23 23
24 export PLUGINCC GCC_PLUGINS_CFLAGS GCC_PLUGIN SANCOV_PLUGIN 24 export PLUGINCC GCC_PLUGINS_CFLAGS GCC_PLUGIN SANCOV_PLUGIN
25 25
26 ifneq ($(PLUGINCC),)
27 # SANCOV_PLUGIN can be only in CFLAGS_KCOV because avoid duplication.
28 GCC_PLUGINS_CFLAGS := $(filter-out $(SANCOV_PLUGIN), $(GCC_PLUGINS_CFLAGS))
29 endif
30
31 KBUILD_CFLAGS += $(GCC_PLUGINS_CFLAGS)
32 GCC_PLUGIN := $(gcc-plugin-y)
33endif
34
35# If plugins aren't supported, abort the build before hard-to-read compiler
36# errors start getting spewed by the main build.
37PHONY += gcc-plugins-check
38gcc-plugins-check: FORCE
39ifdef CONFIG_GCC_PLUGINS
26 ifeq ($(PLUGINCC),) 40 ifeq ($(PLUGINCC),)
27 ifneq ($(GCC_PLUGINS_CFLAGS),) 41 ifneq ($(GCC_PLUGINS_CFLAGS),)
28 ifeq ($(call cc-ifversion, -ge, 0405, y), y) 42 ifeq ($(call cc-ifversion, -ge, 0405, y), y)
29 PLUGINCC := $(shell $(CONFIG_SHELL) -x $(srctree)/scripts/gcc-plugin.sh "$(__PLUGINCC)" "$(HOSTCXX)" "$(CC)") 43 $(Q)$(srctree)/scripts/gcc-plugin.sh --show-error "$(__PLUGINCC)" "$(HOSTCXX)" "$(CC)" || true
30 $(warning warning: your gcc installation does not support plugins, perhaps the necessary headers are missing?) 44 @echo "Cannot use CONFIG_GCC_PLUGINS: your gcc installation does not support plugins, perhaps the necessary headers are missing?" >&2 && exit 1
31 else 45 else
32 $(warning warning: your gcc version does not support plugins, you should upgrade it to gcc 4.5 at least) 46 @echo "Cannot use CONFIG_GCC_PLUGINS: your gcc version does not support plugins, you should upgrade it to at least gcc 4.5" >&2 && exit 1
33 endif 47 endif
34 endif 48 endif
35 else
36 # SANCOV_PLUGIN can be only in CFLAGS_KCOV because avoid duplication.
37 GCC_PLUGINS_CFLAGS := $(filter-out $(SANCOV_PLUGIN), $(GCC_PLUGINS_CFLAGS))
38 endif 49 endif
50endif
51 @:
39 52
40 KBUILD_CFLAGS += $(GCC_PLUGINS_CFLAGS) 53# Actually do the build, if requested.
41 GCC_PLUGIN := $(gcc-plugin-y) 54PHONY += gcc-plugins
42 55gcc-plugins: scripts_basic gcc-plugins-check
56ifdef CONFIG_GCC_PLUGINS
57 $(Q)$(MAKE) $(build)=scripts/gcc-plugins
43endif 58endif
59 @:
diff --git a/scripts/gcc-plugin.sh b/scripts/gcc-plugin.sh
index fb9207565471..b65224bfb847 100755
--- a/scripts/gcc-plugin.sh
+++ b/scripts/gcc-plugin.sh
@@ -1,5 +1,12 @@
1#!/bin/sh 1#!/bin/sh
2srctree=$(dirname "$0") 2srctree=$(dirname "$0")
3
4SHOW_ERROR=
5if [ "$1" = "--show-error" ] ; then
6 SHOW_ERROR=1
7 shift || true
8fi
9
3gccplugins_dir=$($3 -print-file-name=plugin) 10gccplugins_dir=$($3 -print-file-name=plugin)
4plugincc=$($1 -E -x c++ - -o /dev/null -I"${srctree}"/gcc-plugins -I"${gccplugins_dir}"/include 2>&1 <<EOF 11plugincc=$($1 -E -x c++ - -o /dev/null -I"${srctree}"/gcc-plugins -I"${gccplugins_dir}"/include 2>&1 <<EOF
5#include "gcc-common.h" 12#include "gcc-common.h"
@@ -13,6 +20,9 @@ EOF
13 20
14if [ $? -ne 0 ] 21if [ $? -ne 0 ]
15then 22then
23 if [ -n "$SHOW_ERROR" ] ; then
24 echo "${plugincc}" >&2
25 fi
16 exit 1 26 exit 1
17fi 27fi
18 28
@@ -48,4 +58,8 @@ then
48 echo "$2" 58 echo "$2"
49 exit 0 59 exit 0
50fi 60fi
61
62if [ -n "$SHOW_ERROR" ] ; then
63 echo "${plugincc}" >&2
64fi
51exit 1 65exit 1