问题描述
我想使用一些在旧的GCC
版本中不可用的GCC
警告开关(例如-Wtype-limits
)。
有没有一个简单的方法来检查GCC
版本?
最佳解决方案
我不会说容易,但是可以使用GNU make
的SHELL
函数来执行gcc --version
命令,然后使用ifeq
条件表达式来检查版本号,并适当地设置CFLAGS
变量。
以下是一个简单的MakeFile
示例:
1 2 3 4 5 6 7 8 9 10 |
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
语法。但是可以使用expr
命令进行比较。
例子如下:
1 2 3 4 5 6 7 8 9 10 |
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 |
次佳解决方案
要将完整的3
部分GCC
版本(不仅第一位数字)转换成数字格式,适合比较(例如40701
)使用
1 |
gcc -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
输出内容缺少3
个部分的可能性(在一些较早的GCC
版本中存在这种情况)。
所以要测试MakeFile
中的版本,使用(注意$$
里面的最后一个sed
命令)
1 2 3 4 |
GCC_GTEQ_472 := $(shell expr `gcc -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 |
第三种解决方案
我刚刚遇到这个问题,我需要测试GCC
的前两位数字,想要一个比上面sed
过滤字符串更复杂的操作。我使用bc
进行比较,因为它支持浮点数(expr
将非整数(non-integers
)都视为字符串):
1 2 3 4 |
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
处理是必要的:
1 2 3 4 |
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 |