Commit ed58c0e9 authored by Kees Cook's avatar Kees Cook

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: default avatarKees Cook <keescook@chromium.org>
parent d26e9414
...@@ -635,13 +635,6 @@ endif ...@@ -635,13 +635,6 @@ endif
# Tell gcc to never replace conditional load with a non-conditional one # Tell gcc to never replace conditional load with a non-conditional one
KBUILD_CFLAGS += $(call cc-option,--param=allow-store-data-races=0) KBUILD_CFLAGS += $(call cc-option,--param=allow-store-data-races=0)
PHONY += gcc-plugins
gcc-plugins: scripts_basic
ifdef CONFIG_GCC_PLUGINS
$(Q)$(MAKE) $(build)=scripts/gcc-plugins
endif
@:
include scripts/Makefile.gcc-plugins include scripts/Makefile.gcc-plugins
ifdef CONFIG_READABLE_ASM ifdef CONFIG_READABLE_ASM
......
...@@ -23,21 +23,37 @@ ifdef CONFIG_GCC_PLUGINS ...@@ -23,21 +23,37 @@ ifdef CONFIG_GCC_PLUGINS
export PLUGINCC GCC_PLUGINS_CFLAGS GCC_PLUGIN SANCOV_PLUGIN export PLUGINCC GCC_PLUGINS_CFLAGS GCC_PLUGIN SANCOV_PLUGIN
ifneq ($(PLUGINCC),)
# SANCOV_PLUGIN can be only in CFLAGS_KCOV because avoid duplication.
GCC_PLUGINS_CFLAGS := $(filter-out $(SANCOV_PLUGIN), $(GCC_PLUGINS_CFLAGS))
endif
KBUILD_CFLAGS += $(GCC_PLUGINS_CFLAGS)
GCC_PLUGIN := $(gcc-plugin-y)
endif
# If plugins aren't supported, abort the build before hard-to-read compiler
# errors start getting spewed by the main build.
PHONY += gcc-plugins-check
gcc-plugins-check: FORCE
ifdef CONFIG_GCC_PLUGINS
ifeq ($(PLUGINCC),) ifeq ($(PLUGINCC),)
ifneq ($(GCC_PLUGINS_CFLAGS),) ifneq ($(GCC_PLUGINS_CFLAGS),)
ifeq ($(call cc-ifversion, -ge, 0405, y), y) ifeq ($(call cc-ifversion, -ge, 0405, y), y)
PLUGINCC := $(shell $(CONFIG_SHELL) -x $(srctree)/scripts/gcc-plugin.sh "$(__PLUGINCC)" "$(HOSTCXX)" "$(CC)") $(Q)$(srctree)/scripts/gcc-plugin.sh --show-error "$(__PLUGINCC)" "$(HOSTCXX)" "$(CC)" || true
$(warning warning: your gcc installation does not support plugins, perhaps the necessary headers are missing?) @echo "Cannot use CONFIG_GCC_PLUGINS: your gcc installation does not support plugins, perhaps the necessary headers are missing?" >&2 && exit 1
else else
$(warning warning: your gcc version does not support plugins, you should upgrade it to gcc 4.5 at least) @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
endif endif
endif endif
else
# SANCOV_PLUGIN can be only in CFLAGS_KCOV because avoid duplication.
GCC_PLUGINS_CFLAGS := $(filter-out $(SANCOV_PLUGIN), $(GCC_PLUGINS_CFLAGS))
endif endif
endif
@:
KBUILD_CFLAGS += $(GCC_PLUGINS_CFLAGS) # Actually do the build, if requested.
GCC_PLUGIN := $(gcc-plugin-y) PHONY += gcc-plugins
gcc-plugins: scripts_basic gcc-plugins-check
ifdef CONFIG_GCC_PLUGINS
$(Q)$(MAKE) $(build)=scripts/gcc-plugins
endif endif
@:
#!/bin/sh #!/bin/sh
srctree=$(dirname "$0") srctree=$(dirname "$0")
SHOW_ERROR=
if [ "$1" = "--show-error" ] ; then
SHOW_ERROR=1
shift || true
fi
gccplugins_dir=$($3 -print-file-name=plugin) gccplugins_dir=$($3 -print-file-name=plugin)
plugincc=$($1 -E -x c++ - -o /dev/null -I"${srctree}"/gcc-plugins -I"${gccplugins_dir}"/include 2>&1 <<EOF plugincc=$($1 -E -x c++ - -o /dev/null -I"${srctree}"/gcc-plugins -I"${gccplugins_dir}"/include 2>&1 <<EOF
#include "gcc-common.h" #include "gcc-common.h"
...@@ -13,6 +20,9 @@ EOF ...@@ -13,6 +20,9 @@ EOF
if [ $? -ne 0 ] if [ $? -ne 0 ]
then then
if [ -n "$SHOW_ERROR" ] ; then
echo "${plugincc}" >&2
fi
exit 1 exit 1
fi fi
...@@ -48,4 +58,8 @@ then ...@@ -48,4 +58,8 @@ then
echo "$2" echo "$2"
exit 0 exit 0
fi fi
if [ -n "$SHOW_ERROR" ] ; then
echo "${plugincc}" >&2
fi
exit 1 exit 1
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment