Skip to content

Commit ed58c0e

Browse files
committed
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 <[email protected]>
1 parent d26e941 commit ed58c0e

File tree

3 files changed

+39
-16
lines changed

3 files changed

+39
-16
lines changed

Makefile

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -635,13 +635,6 @@ endif
635635
# Tell gcc to never replace conditional load with a non-conditional one
636636
KBUILD_CFLAGS += $(call cc-option,--param=allow-store-data-races=0)
637637

638-
PHONY += gcc-plugins
639-
gcc-plugins: scripts_basic
640-
ifdef CONFIG_GCC_PLUGINS
641-
$(Q)$(MAKE) $(build)=scripts/gcc-plugins
642-
endif
643-
@:
644-
645638
include scripts/Makefile.gcc-plugins
646639

647640
ifdef CONFIG_READABLE_ASM

scripts/Makefile.gcc-plugins

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,21 +23,37 @@ ifdef CONFIG_GCC_PLUGINS
2323

2424
export PLUGINCC GCC_PLUGINS_CFLAGS GCC_PLUGIN SANCOV_PLUGIN
2525

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)
33+
endif
34+
35+
# If plugins aren't supported, abort the build before hard-to-read compiler
36+
# errors start getting spewed by the main build.
37+
PHONY += gcc-plugins-check
38+
gcc-plugins-check: FORCE
39+
ifdef CONFIG_GCC_PLUGINS
2640
ifeq ($(PLUGINCC),)
2741
ifneq ($(GCC_PLUGINS_CFLAGS),)
2842
ifeq ($(call cc-ifversion, -ge, 0405, y), y)
29-
PLUGINCC := $(shell $(CONFIG_SHELL) -x $(srctree)/scripts/gcc-plugin.sh "$(__PLUGINCC)" "$(HOSTCXX)" "$(CC)")
30-
$(warning warning: your gcc installation does not support plugins, perhaps the necessary headers are missing?)
43+
$(Q)$(srctree)/scripts/gcc-plugin.sh --show-error "$(__PLUGINCC)" "$(HOSTCXX)" "$(CC)" || true
44+
@echo "Cannot use CONFIG_GCC_PLUGINS: your gcc installation does not support plugins, perhaps the necessary headers are missing?" >&2 && exit 1
3145
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
3347
endif
3448
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))
3849
endif
50+
endif
51+
@:
3952

40-
KBUILD_CFLAGS += $(GCC_PLUGINS_CFLAGS)
41-
GCC_PLUGIN := $(gcc-plugin-y)
42-
53+
# Actually do the build, if requested.
54+
PHONY += gcc-plugins
55+
gcc-plugins: scripts_basic gcc-plugins-check
56+
ifdef CONFIG_GCC_PLUGINS
57+
$(Q)$(MAKE) $(build)=scripts/gcc-plugins
4358
endif
59+
@:

scripts/gcc-plugin.sh

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
#!/bin/sh
22
srctree=$(dirname "$0")
3+
4+
SHOW_ERROR=
5+
if [ "$1" = "--show-error" ] ; then
6+
SHOW_ERROR=1
7+
shift || true
8+
fi
9+
310
gccplugins_dir=$($3 -print-file-name=plugin)
411
plugincc=$($1 -E -x c++ - -o /dev/null -I"${srctree}"/gcc-plugins -I"${gccplugins_dir}"/include 2>&1 <<EOF
512
#include "gcc-common.h"
@@ -13,6 +20,9 @@ EOF
1320

1421
if [ $? -ne 0 ]
1522
then
23+
if [ -n "$SHOW_ERROR" ] ; then
24+
echo "${plugincc}" >&2
25+
fi
1626
exit 1
1727
fi
1828

@@ -48,4 +58,8 @@ then
4858
echo "$2"
4959
exit 0
5060
fi
61+
62+
if [ -n "$SHOW_ERROR" ] ; then
63+
echo "${plugincc}" >&2
64+
fi
5165
exit 1

0 commit comments

Comments
 (0)