3

I was a little confused with the responses to Quick way to override -Werror flag?

So I ask my specific question here.

I have multiple Makefiles working together and CFLAGS has been set along the way to (-Werror -Wall .. and many others)

But in one of the Makefiles, I wish that the errors not be treated as warnings and so I would like to remove -Werror flag.

What would be the best way to achieve this, so that only for this Makefile, -Werror flag is removed and for the others normal execution takes place?

Thanks, Sunny

4

3 回答 3

5

正确的方法是使用filter-out函数

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

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

您甚至可以使用特定于目标的变量值来覆盖单个目标的标志:

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为每个--foo选项提供一个。因为它不能从 Make 命令行完成,所以它不会直接回答您链接到的问题。但是从命令行覆盖 Make 变量以强制构建东西是一种很好的方法,可以让你的不可构建代码更难维护!

于 2013-06-26T16:48:07.477 回答
4

更简单的方法

看起来你可以调用

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}我可以通过设置任何to来控制警告标志${WFLAG6},或者通过${WFLAGS}在命令行上设置批发,或者(实际上)通过设置${CFLAGS}. 但是因为每个都可以单独调整,并且可以相对容易地调整警告(主要的麻烦是确定哪个 WFLAGn 需要破坏)。

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

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

于 2013-06-26T15:35:17.190 回答
0

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

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

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

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

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

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

所以让我们在中引入一个DEVELOPER_CFLAGS”变量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
于 2019-03-23T20:31:55.277 回答