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>
This commit is contained in:
parent
d26e941492
commit
ed58c0e9ee
3 changed files with 41 additions and 18 deletions
7
Makefile
7
Makefile
|
@ -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
|
||||||
|
|
||||||
export PLUGINCC GCC_PLUGINS_CFLAGS GCC_PLUGIN SANCOV_PLUGIN
|
export PLUGINCC GCC_PLUGINS_CFLAGS GCC_PLUGIN SANCOV_PLUGIN
|
||||||
|
|
||||||
ifeq ($(PLUGINCC),)
|
ifneq ($(PLUGINCC),)
|
||||||
ifneq ($(GCC_PLUGINS_CFLAGS),)
|
|
||||||
ifeq ($(call cc-ifversion, -ge, 0405, y), y)
|
|
||||||
PLUGINCC := $(shell $(CONFIG_SHELL) -x $(srctree)/scripts/gcc-plugin.sh "$(__PLUGINCC)" "$(HOSTCXX)" "$(CC)")
|
|
||||||
$(warning warning: your gcc installation does not support plugins, perhaps the necessary headers are missing?)
|
|
||||||
else
|
|
||||||
$(warning warning: your gcc version does not support plugins, you should upgrade it to gcc 4.5 at least)
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
# SANCOV_PLUGIN can be only in CFLAGS_KCOV because avoid duplication.
|
# SANCOV_PLUGIN can be only in CFLAGS_KCOV because avoid duplication.
|
||||||
GCC_PLUGINS_CFLAGS := $(filter-out $(SANCOV_PLUGIN), $(GCC_PLUGINS_CFLAGS))
|
GCC_PLUGINS_CFLAGS := $(filter-out $(SANCOV_PLUGIN), $(GCC_PLUGINS_CFLAGS))
|
||||||
endif
|
endif
|
||||||
|
|
||||||
KBUILD_CFLAGS += $(GCC_PLUGINS_CFLAGS)
|
KBUILD_CFLAGS += $(GCC_PLUGINS_CFLAGS)
|
||||||
GCC_PLUGIN := $(gcc-plugin-y)
|
GCC_PLUGIN := $(gcc-plugin-y)
|
||||||
|
|
||||||
endif
|
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),)
|
||||||
|
ifneq ($(GCC_PLUGINS_CFLAGS),)
|
||||||
|
ifeq ($(call cc-ifversion, -ge, 0405, y), y)
|
||||||
|
$(Q)$(srctree)/scripts/gcc-plugin.sh --show-error "$(__PLUGINCC)" "$(HOSTCXX)" "$(CC)" || true
|
||||||
|
@echo "Cannot use CONFIG_GCC_PLUGINS: your gcc installation does not support plugins, perhaps the necessary headers are missing?" >&2 && exit 1
|
||||||
|
else
|
||||||
|
@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
|
||||||
|
@:
|
||||||
|
|
||||||
|
# Actually do the build, if requested.
|
||||||
|
PHONY += gcc-plugins
|
||||||
|
gcc-plugins: scripts_basic gcc-plugins-check
|
||||||
|
ifdef CONFIG_GCC_PLUGINS
|
||||||
|
$(Q)$(MAKE) $(build)=scripts/gcc-plugins
|
||||||
|
endif
|
||||||
|
@:
|
||||||
|
|
|
@ -1,5 +1,12 @@
|
||||||
#!/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
|
||||||
|
|
||||||
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
|
||||||
echo "$2"
|
echo "$2"
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [ -n "$SHOW_ERROR" ] ; then
|
||||||
|
echo "${plugincc}" >&2
|
||||||
|
fi
|
||||||
exit 1
|
exit 1
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue