检查Makefile中的gcc版本?

Gen*_*ent 43 portability gcc makefile version compiler-warnings

我想使用一些旧的gcc版本中没有的gcc警告开关(例如-Wtype-limits).

是否有一种简单的方法来检查gcc版本,如果使用最近的gcc,只添加那些额外的选项?

srg*_*erg 47

我不会说它很容易,但你可以使用shellGNU make 的函数来执行shell命令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
Run Code Online (Sandbox Code Playgroud)

编辑:没有ifgt.但是,您可以使用shell 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
Run Code Online (Sandbox Code Playgroud)

  • 使用`:=`而不是`=`,或者每当`$(GCCVERSION)`扩展时,'$(shell)`就会运行. (8认同)
  • 我想检查一个以上的版本.ifqq是否等同于ifgt? (2认同)

小智 17

将完整的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/'
Run Code Online (Sandbox Code Playgroud)

这解决了任何版本部分中两位数字的可能性,以及在输出中缺少版本的第3部分的可能性gcc -dumpversion(在某些早期的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
Run Code Online (Sandbox Code Playgroud)


Chr*_*ris 7

我刚刚遇到这个问题,我需要测试gcc的前两位数字,并且想要一个比上面聪明的sed hackery更可读的选项.我使用bc进行比较,因为它支持浮点(expr将非整数视为字符串):

GCC_VER_GTE44 := $(shell echo `gcc -dumpversion | cut -f1-2 -d.` \>= 4.4 | bc )
ifeq ($(GCC_VER_GTE44),1)
...
endif
Run Code Online (Sandbox Code Playgroud)

如果他们在gcc 4.9之后释放gcc 4.10,那么需要一些sed hacking,但这仍然很可读:

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
Run Code Online (Sandbox Code Playgroud)


Sam*_*uel 6

我发现了这个并认为它真的很聪明。它用更少的 shell 调用实现 >、>=、< 和 <=:

GCC_VERSION := $(shell gcc -dumpversion)
VERSION := 7.4.0

ifeq ($(VERSION),$(firstword $(sort $(GCC_VERSION) $(VERSION))))
    # stuff that requires GCC_VERSION >= VERSION
endif
Run Code Online (Sandbox Code Playgroud)

此示例显示 >=。您可以使用 ifneq 和 $(lastword) 的组合来实现 >、<= 或 <。

参考:

https://lists.gnu.org/archive/html/help-make/2006-04/msg00065.html