【问题标题】:Make: Override a flagMake:覆盖标志
【发布时间】:2013-06-26 09:32:41
【问题描述】:

我对@9​​87654321@的回复有点困惑

所以我在这里问我的具体问题。

我有多个 Makefile 一起工作,并且 CFLAGS 已设置为(-Werror -Wall .. 和许多其他)

但在其中一个 Makefile 中,我希望错误不会被视为警告,因此我想删除 -Werror 标志。

实现这一点的最佳方法是什么,以便仅对于这个 Makefile,-Werror 标志被删除,而其他标志则正常执行?

谢谢, 晴天

【问题讨论】:

  • 最好的方式?你没有告诉我们太多。这个 makefile 使用了多少次CFLAGS?它会调用其他makefile吗?

标签: makefile overriding compiler-flags


【解决方案1】:

正确的做法是使用filter-out function

CFLAGS := $(filter-out -Werror,$(CFLAGS))

在您想要覆盖它的 Makefile 中,CFLAGS-Werror 部分将在该 Makefile 中删除。

您甚至可以使用 target-specific variable values 来覆盖单个目标的标志:

CFLAGS = -Werror

all: foo bar

foo:
        echo cc $(CFLAGS) -o $@

bar: CFLAGS := $(filter-out -Werror,$(CFLAGS))

bar:
        echo cc $(CFLAGS) -o $@

foo 将使用包含 -Werror 的默认 CFLAGS 构建,但 bar 将不构建。

这是一个通用解决方案,适用于所有程序的所有参数,而不是要求每个程序为每个 --foo 选项提供一个 --no-foo。 因为它不能从 Make 命令行完成,所以它不会直接回答您链接到的问题。但是,从命令行覆盖 Make 变量以强制构建内容是使不可构建的代码更难维护的好方法!

【讨论】:

    【解决方案2】:

    更简单的方法

    看起来你可以调用

    gcc -c ... -Werror ... -Wno-error ...
    

    没有 GCC 抱怨 (GCC 4.7.1)。因此,您可以将-Wno-error 添加到您需要的一个makefile 中其他位置的CFLAGS 设置中。如果您使用的是 GNU make,在一个 makefile 中,您可以添加:

    CFLAGS += -Wno-error
    

    可能只针对需要它的单个目标。

    困难的方式

    否则,您需要一个从组件构建 CFLAGS 的系统。我在用于测试 SO 问题答案的 makefile 中拥有的是:

    WFLAG1 = -Wall 
    WFLAG2 = -Wextra
    WFLAG3 = -Wmissing-prototypes 
    WFLAG4 = -Wstrict-prototypes 
    WFLAG5 = -Wold-style-definition
    WFLAG6 =
    WFLAGS = ${WFLAG1} ${WFLAG2} ${WFLAG3} ${WFLAG4} ${WFLAG5} ${WFLAG6} 
    SFLAGS = -std=c99
    GFLAGS = -g
    OFLAGS = -O3
    UFLAGS =
    IFLAG1 = -I${HOME}/inc
    IFLAGS = # ${IFLAG1}
    
    CFLAGS   = ${OFLAGS} ${GFLAGS} ${IFLAGS} ${SFLAGS} ${WFLAGS} ${UFLAGS}
    

    重点是每个flag都是独立可调的;我可以通过将${WFLAG1} 中的任何一个设置为${WFLAG6},或者通过在命令行上设置${WFLAGS} 批发,或者(实际上)通过设置${CFLAGS} 来控制警告标志。但是因为每个都可以单独调整,并且可以相对容易地调整警告(主要的麻烦是确定哪个 WFLAGn 需要破坏)。

    UFLAGS 是“用户标志”,仅在命令行上设置;我可以通过设置在命令行中添加更多标志。

    这种方式“更难”,因为它需要您修改您设置 CFLAGS 的 makefile 系统的中心部分。您的同事也不太可能一见钟情。

    【讨论】:

      【解决方案3】:

      您可以在 Git MakefileCFLAGS 中看到一个变量覆盖示例,现在可以在使用 DEVELOPER=YesPlease 和 Git 2.22(2019 年第二季度)调用 Make 时对其进行调整

      DEVELOPER(在 Git Makefile 中)是 group more compiler warning 的一个变量。

      参见commit 6d5d4b4commit 71a7894commit 8fb2a23commit 65260a4commit 9559f8fcommit 4f14a8c(2019 年 2 月 22 日)Ævar Arnfjörð Bjarmason (avar)
      (由 Junio C Hamano -- gitster -- 合并commit 3cef676,2019 年 3 月 20 日)

      Makefile:允许合并DEVELOPER=1CFLAGS="..."

      自从引入DEVELOPER=1 工具以来,就无法在拥有自定义 CFLAGS(例如 CFLAGS="-O0 -g -ggdb3")的同时仍受益于 DEVELOPER=1 启用的一组警告和断言。

      这是因为Makefile中变量的语义是这样的 用户设置 CFLAGS 会覆盖我们设置的任何内容,包括 我们在config.mak.dev 做。

      所以让我们介绍一个"DEVELOPER_CFLAGS" variable in config.mak.dev 和 将其添加到ALL_CFLAGS。在此之前 ALL_CFLAGS 变量 将(基本上,我们不会涉及一些细微差别)设置为:

      $(CPPFLAGS) [$(CFLAGS) *or* $(CFLAGS) in config.mak.dev] $(BASIC_CFLAGS) $(EXTRA_CPPFLAGS)
      

      但现在是:

      $(DEVELOPER_CFLAGS) $(CPPFLAGS) $(CFLAGS) $(BASIC_CFLAGS) $(EXTRA_CPPFLAGS)
      

      DEVELOPER_CFLAGS 放在首位的原因是为了 选择性地覆盖 DEVELOPER=1 带来的东西。
      GCCClang 上,后面的设置会覆盖前面的设置。
      例如。 “-Wextra -Wno-extra”不会启用“额外”警告,但如果这两个 论据被颠倒了。

      以前不可能但现在可以做到的事情的例子:

      # Use -O0 instead of -O2 for less painful debuggng
      DEVELOPER=1 CFLAGS="-O0 -g"
      # DEVELOPER=1 plus -Wextra, but disable some of the warnings
      DEVELOPER=1 DEVOPTS="no-error extra-all" CFLAGS="-O0 -g -Wno-unused-parameter"
      

      导致这个补丁的原因是重新安排了 各种*FLAGS 分配和包含只是为了便于阅读。
      Makefile 支持乱序赋值,例如:

      $ cat Makefile
      X = $(A) $(B) $(C)
      A = A
      B = B
      include c.mak
      all:
              @echo $(X)
      $ cat c.mak
      C=C
      $ make
      A B C
      

      【讨论】:

        猜你喜欢
        • 2023-03-18
        • 2013-12-19
        • 1970-01-01
        • 2022-07-15
        • 1970-01-01
        • 2015-07-06
        • 2012-07-29
        • 2012-06-25
        • 1970-01-01
        相关资源
        最近更新 更多