在Makefile中检查gcc版本

问题描述

我想使用一些在旧的GCC版本中不可用的GCC警告开关(例如-Wtype-limits)。

有没有一个简单的方法来检查GCC版本?

最佳解决方案

我不会说容易,但是可以使用GNU makeSHELL函数来执行gcc --version命令,然后使用ifeq条件表达式来检查版本号,并适当地设置CFLAGS变量。

以下是一个简单的MakeFile示例:

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命令进行比较。

例子如下:

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)使用

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命令)

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)都视为字符串):

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

参考链接


在Makefile中检查gcc版本?