Skip to content

Commit

Permalink
gcc-plugins: abort builds cleanly when not supported
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
kees committed Aug 9, 2016
1 parent d26e941 commit ed58c0e
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 16 deletions.
7 changes: 0 additions & 7 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -635,13 +635,6 @@ endif
# Tell gcc to never replace conditional load with a non-conditional one
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

ifdef CONFIG_READABLE_ASM
Expand Down
34 changes: 25 additions & 9 deletions scripts/Makefile.gcc-plugins
Original file line number Diff line number Diff line change
Expand Up @@ -23,21 +23,37 @@ ifdef CONFIG_GCC_PLUGINS

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),)
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?)
$(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
$(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
else
# SANCOV_PLUGIN can be only in CFLAGS_KCOV because avoid duplication.
GCC_PLUGINS_CFLAGS := $(filter-out $(SANCOV_PLUGIN), $(GCC_PLUGINS_CFLAGS))
endif
endif
@:

KBUILD_CFLAGS += $(GCC_PLUGINS_CFLAGS)
GCC_PLUGIN := $(gcc-plugin-y)

# 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
@:
14 changes: 14 additions & 0 deletions scripts/gcc-plugin.sh
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
#!/bin/sh
srctree=$(dirname "$0")

SHOW_ERROR=
if [ "$1" = "--show-error" ] ; then
SHOW_ERROR=1
shift || true
fi

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
#include "gcc-common.h"
Expand All @@ -13,6 +20,9 @@ EOF

if [ $? -ne 0 ]
then
if [ -n "$SHOW_ERROR" ] ; then
echo "${plugincc}" >&2
fi
exit 1
fi

Expand Down Expand Up @@ -48,4 +58,8 @@ then
echo "$2"
exit 0
fi

if [ -n "$SHOW_ERROR" ] ; then
echo "${plugincc}" >&2
fi
exit 1

0 comments on commit ed58c0e

Please sign in to comment.