我想使用一些旧版gcc中没有的gcc警告开关(例如-Wtype-limits)。有没有一种简单的方法来检查gcc版本,并且只在使用最新的gcc时才添加这些额外的选项?
ru9i0ody1#
我不会说这很容易,但是您可以使用GNU make的shell函数来执行一个shell命令(如gcc --version),然后使用ifeq条件表达式来检查版本号,并适当地设置您的CFLAGS变量。下面是一个简单的makefile示例:
shell
gcc --version
ifeq
CFLAGS
CC = gcc GCCVERSION = $(shell gcc --version | grep ^gcc | sed 's/^.* //g') CFLAGS = -g ifeq "$(GCCVERSION)" "4.4.3" CFLAGS += -Wtype-limits endif all: $(CC) $(CFLAGS) prog.c -o prog
**编辑:**没有ifgt。但是,您可以使用shell expr命令来执行大于比较。下面是一个示例
ifgt
expr
CC = gcc GCCVERSIONGTEQ4 := $(shell expr `gcc -dumpversion | cut -f1 -d.` \>= 4) CFLAGS = -g ifeq "$(GCCVERSIONGTEQ4)" "1" CFLAGS += -Wtype-limits endif all: $(CC) $(CFLAGS) prog.c -o prog
1tu0hz3e2#
要将完整的3部分gcc版本(不仅仅是第一位数字)转换为适合比较的数字格式(例如40701),请使用
40701
gcc -dumpfullversion -dumpversion | sed -e 's/\.\([0-9][0-9]\)/\1/g' -e 's/\.\([0-9]\)/0\1/g' -e 's/^[0-9]\{3,4\}$/&00/'
它解决了任何版本部分中出现两位数的可能性,以及gcc -dumpversion输出中缺少版本的第三部分的可能性(在某些早期gcc版本中就是这种情况)。因此,要测试makefile中的版本,请使用类似的命令(注意最后一个sed命令中的$$)
gcc -dumpversion
$$
GCC_GTEQ_472 := $(shell expr `gcc -dumpfullversion -dumpversion | sed -e 's/\.\([0-9][0-9]\)/\1/g' -e 's/\.\([0-9]\)/0\1/g' -e 's/^[0-9]\{3,4\}$$/&00/'` \>= 40702) ifeq "$(GCC_GTEQ_472)" "1" ... endif
3phpmpom3#
我刚刚遇到了这个问题,我需要测试gcc的前两位数,并希望有一个比上面的sed更可读的选项。我使用bc来做比较,因为它支持浮点(expr将非整数视为字符串):
GCC_VER_GTE44 := $(shell echo `gcc -dumpversion | cut -f1-2 -d.` \>= 4.4 | bc ) ifeq ($(GCC_VER_GTE44),1) ... endif
如果他们在gcc 4.9之后发布gcc 4.10,那么sed黑客攻击是必要的,但这仍然是非常可读的:
GCC_VER_GTE44 := $(shell echo `gcc -dumpversion | cut -f1-2 -d.` \>= 4.4 | sed -e 's/\./*100+/g' | bc ) ifeq ($(GCC_VER_GTE44),1) ... endif
tp5buhyn4#
我发现了这一点,并认为它真的很聪明。它实现了〉、〉=、〈和〈=,并且使用了更少的shell调用:
GCC_VERSION := $(shell gcc -dumpversion) VERSION := 7.4.0 ifeq ($(VERSION),$(firstword $(sort $(GCC_VERSION) $(VERSION)))) # stuff that requires GCC_VERSION >= VERSION endif
这个例子显示了〉=。你可以使用ifneq和$(lastword)的组合来实现〉、〈=或〈。参考文献:https://lists.gnu.org/archive/html/help-make/2006-04/msg00065.html
gg0vcinb5#
您是否在使用autoconf之类的工具?通过gcc调用一个启用了标志的“dummy”编译可能是值得的,如果因为编译器不识别标志而失败,您可以退回到不使用更新的警告选项的命令行。
cuxqih216#
根据上面的答案,我已经创建了一个现成的IF_GCC宏:
MY_GCC_VERSION=$(if $(GCC_VERSION),$(GCC_VERSION),$(GCC_DEFAULT_VER)) MY_GCC_TOINT=$(shell echo $(1) | sed -e 's/\.\([0-9][0-9]\)/\1/g' -e 's/\.\([0-9]\)/0\1/g' -e 's/^[0-9]\{3,4\}$$//') MY_IF_GCC=$(if $(shell test $(call MY_GCC_TOINT, $(MY_GCC_VERSION)) -$(1) $(2) || echo 0),$(4),$(3)) GCC_DEFAULT_VER:=$(firstword $(shell cc -V 2>&1 | grep default | sed -r 's/( *)([0-9.]+),(.*)/\2/g'))
用法:$(call MY_IF_GCC,ge,30305,-fan_option_for_gcc_ge_3.3.5)作为第二个参数,您可以使用test(1)支持的任何运算符:eq、gt、lt、ge、le等等。如果cc-V不适合你,用gcc-dumpversion或者其他合适的替换它希望能有所帮助。
$(call MY_IF_GCC,ge,30305,-fan_option_for_gcc_ge_3.3.5)
m1m5dgzv7#
跟随Chris,但使用awk
GCC_VER_GTE44 := $(shell expr $$(gcc -dumpversion | awk -F. '{print $$3+100*($$2+100*$$1)}') \>= 40400)
注意在Makefile中需要用另一个$对$进行转义。
$
sh7euo9m8#
我认为awk是一个更好的工具,因为它可以将版本字符串拆分为$1、$2和$3,然后在一个命令中与>、<、>=等进行比较。如果表达式为false,则awk的输出将省略整行。
awk
$1
$2
$3
>
<
>=
GCC_VERSION_GT_75 = $(shell gcc -dumpfullversion -dumpversion | awk -F. '$$1 > 7 && $$2 > 5') ifneq ($(GCC_VERSION_GT_75),) # stuff that requires gcc version > 7.5 endif
8条答案
按热度按时间ru9i0ody1#
我不会说这很容易,但是您可以使用GNU make的
shell
函数来执行一个shell命令(如gcc --version
),然后使用ifeq
条件表达式来检查版本号,并适当地设置您的CFLAGS
变量。下面是一个简单的makefile示例:
**编辑:**没有
ifgt
。但是,您可以使用shellexpr
命令来执行大于比较。下面是一个示例1tu0hz3e2#
要将完整的3部分gcc版本(不仅仅是第一位数字)转换为适合比较的数字格式(例如
40701
),请使用它解决了任何版本部分中出现两位数的可能性,以及
gcc -dumpversion
输出中缺少版本的第三部分的可能性(在某些早期gcc版本中就是这种情况)。因此,要测试makefile中的版本,请使用类似的命令(注意最后一个sed命令中的
$$
)3phpmpom3#
我刚刚遇到了这个问题,我需要测试gcc的前两位数,并希望有一个比上面的sed更可读的选项。我使用bc来做比较,因为它支持浮点(expr将非整数视为字符串):
如果他们在gcc 4.9之后发布gcc 4.10,那么sed黑客攻击是必要的,但这仍然是非常可读的:
tp5buhyn4#
我发现了这一点,并认为它真的很聪明。它实现了〉、〉=、〈和〈=,并且使用了更少的shell调用:
这个例子显示了〉=。你可以使用ifneq和$(lastword)的组合来实现〉、〈=或〈。
参考文献:
https://lists.gnu.org/archive/html/help-make/2006-04/msg00065.html
gg0vcinb5#
您是否在使用autoconf之类的工具?
通过gcc调用一个启用了标志的“dummy”编译可能是值得的,如果因为编译器不识别标志而失败,您可以退回到不使用更新的警告选项的命令行。
cuxqih216#
根据上面的答案,我已经创建了一个现成的IF_GCC宏:
用法:
$(call MY_IF_GCC,ge,30305,-fan_option_for_gcc_ge_3.3.5)
作为第二个参数,您可以使用test(1)支持的任何运算符:eq、gt、lt、ge、le等等。
如果cc-V不适合你,用gcc-dumpversion或者其他合适的替换它
希望能有所帮助。
m1m5dgzv7#
跟随Chris,但使用awk
注意在Makefile中需要用另一个
$
对$
进行转义。sh7euo9m8#
我认为
awk
是一个更好的工具,因为它可以将版本字符串拆分为$1
、$2
和$3
,然后在一个命令中与>
、<
、>=
等进行比较。如果表达式为false,则awk
的输出将省略整行。