繁体   English   中英

Make:覆盖一个标志

[英]Make: Override a flag

我对快速覆盖-Werror标志的反应有点困惑

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

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

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

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

谢谢,Sunny

正确的方法是使用filter-out功能

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

在Makefile中你要覆盖它,并在该Makefile中删除CFLAGS-Werror部分。

您甚至可以使用此方法通过使用特定目标的变量值来覆盖单个目标的标志:

CFLAGS = -Werror

all: foo bar

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

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

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

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

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

更简单的方法

看起来你可以调用

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}通过设置在命令行上批发,或(确实) ${CFLAGS} 但是因为每个都是可以单独调节的,并且可以相对容易地调整警告(主要的麻烦在于确定哪个WFLAGn需要破坏)。

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

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

你可以在Git Makefile中看到一个带有CFLAGS的变量覆盖的例子,现在可以在使用DEVELOPER=YesPlease调用Make时进行调整,使用Git 2.22(2019年第二季度)

DEVELOPER (在Git Makefile中)是一个变量,用于对更多编译器警告进行分组

提交6d5d4b4提交71a7894提交8fb2a23提交65260a4提交9559f8f提交4f14a8c (2019年2月22日)由ÆvarArnfjörðBjarmason( avar
(由Junio C gitster合并- gitster -提交3cef676 ,2019年3月20日)

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

自从引入DEVELOPER=1设施以来,没有办法定制CFLAGS(例如CFLAGS="-O0 -g -ggdb3" ),同时仍然受益于一组警告和断言, DEVELOPER=1启用。

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

因此,让我们config.mak.dev引入一个DEVELOPER_CFLAGS ”变量 ,并将其添加到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 ABC 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM