Make:覆盖一个标志

时间:2013-06-26 09:32:42

标签: makefile override compiler-flags

我对Quick way to override -Werror flag?

的回复感到有些困惑

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

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

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

实现这一目标的最佳方法是什么,以便只有这个Makefile,-Werror标志被删除,而其他人正常执行?

谢谢, 晴天

3 个答案:

答案 0 :(得分:5)

执行此操作的正确方法是使用filter-out function

CFLAGS := $(filter-out -Werror,$(CFLAGS))
在Makefile中要覆盖它的

,并且将在该Makefile中删除-Werror的{​​{1}}部分。

您甚至可以使用此功能通过target-specific variable values覆盖单个目标的标记:

CFLAGS

CFLAGS = -Werror all: foo bar foo: echo cc $(CFLAGS) -o $@ bar: CFLAGS := $(filter-out -Werror,$(CFLAGS)) bar: echo cc $(CFLAGS) -o $@ 将使用包含foo的默认CFLAGS构建,但-Werror将在没有构建的情况下构建。

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

答案 1 :(得分: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}

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

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

这种方式比较“难”,因为它要求您修改设置CFLAGS的makefile系统的核心部分。你的同事一见钟情也不太可能理解。

答案 2 :(得分:0)

您可以在Git Makefile中使用CFLAGS覆盖变量的示例,现在可以在Git 2.22(2019年第二季度)中使用DEVELOPER=YesPlease调用Make时进行调整。

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

请参见commit 6d5d4b4,请参见commit 71a7894commit 8fb2a23commit 65260a4commit 9559f8fcommit 4f14a8cÆvar Arnfjörð Bjarmason (avar)(2019年2月22日) 。
(由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