【问题标题】:Checking the gcc version in a Makefile?检查 Makefile 中的 gcc 版本?
【发布时间】:2011-07-08 11:29:30
【问题描述】:

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

是否有一种简单的方法可以检查 gcc 版本,并且仅在使用最近的 gcc 时才添加那些额外的选项?

【问题讨论】:

  • gcc --version 有什么问题?
  • @rlibby: gcc --version 或 gcc -dumpversion 都可以。我正在 Makefile 中寻找“版本更高”的比较。

标签: gcc makefile version portability compiler-warnings


【解决方案1】:

你在使用类似 autoconf 的东西吗?

在启用标志的情况下通过 gcc 调用“虚拟”编译可能是值得的,如果由于编译器无法识别标志而导致编译失败,您可以退回到不使用较新警告的命令行选项。

【讨论】:

    【解决方案2】:

    我不会说这很容易,但是您可以使用 GNU make 的 shell 函数来执行类似 gcc --version 的 shell 命令,然后使用 ifeq 条件表达式检查版本号并设置您的 @ 987654324@ 变量适当。

    这是一个简单的 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。但是,您可以使用 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
    

    【讨论】:

    • 使用:= 而不是=,否则每次$(GCCVERSION) 展开时$(shell) 都会运行。
    • 我想检查大于某个版本。是否有一个 ifgt 等效于 ifeq ?
    • 谢谢 - 非常有用 - 我正要发布一个问题,询问如何测试 gcc 版本 >= 4.3,但我自己使用您的 expr 方法解决了问题。
    • 我修复了大于比较的反转逻辑。谢谢。
    • 我用GCCVERS := $(shell gcc --version | grep ^gcc | awk '{print $$3}')
    【解决方案3】:

    将完整的 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 中测试版本,请使用类似(note $$ inside last sed command)

    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
    

    【讨论】:

      【解决方案4】:

      根据上面的答案,我已经制作了一个现成的 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 或任何合适的方式替换它

      希望对您有所帮助。

      【讨论】:

        【解决方案5】:

        我刚刚遇到了这个问题,我需要测试 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
        

        如果他们在 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
        

        【讨论】:

          【解决方案6】:

          跟随 Chris,但使用 awk

          GCC_VER_GTE44 := $(shell expr $$(gcc -dumpversion | awk -F. '{print $$3+100*($$2+100*$$1)}') \>= 40400)
          

          注意 $ 需要在 Makefile 中使用另一个 $ 进行转义。

          【讨论】:

            【解决方案7】:

            我发现了这个并认为它非常聪明。它以更少的 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

            【讨论】:

            • 10 多年来一直很好,但由于两位数的版本元素而失败......例如在已经发布的 GCC 10 中。示例:“9.0 8.0 10.0”排序为“10.0 8.0 9.0”。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-09-05
            • 1970-01-01
            • 1970-01-01
            • 2012-03-31
            相关资源
            最近更新 更多