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)
小智 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)
我刚刚遇到这个问题,我需要测试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)
我发现了这个并认为它真的很聪明。它用更少的 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