我对Quick way to override -Werror flag?的反应有些困惑
所以我在这里问我的具体问题。
我有多个Makefile一起工作,CFLAGS已经设置为(-Werror -Wall ..和许多其他人)
但是在其中一个Makefile中,我希望错误不被视为警告,所以我想删除-Werror标志。
实现这一目标的最佳方法是什么,以便只有这个Makefile,-Werror标志被删除,而其他人正常执行?
谢谢,Sunny
看起来你可以调用
gcc -c ... -Werror ... -Wno-error ...
没有GCC抱怨(GCC 4.7.1)。因此,您可以将-Wno-error
添加到您需要的一个makefile中的其他位置设置的CFLAGS。如果你在一个makefile中使用GNU make
,你可以添加:
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系统的中心部分。您的同事一见钟情也不太可能理解。
正确的方法是使用filter-out
function。
放
CFLAGS := $(filter-out -Werror,$(CFLAGS))
在Makefile中你要覆盖它,并且将在该Makefile中删除-Werror
的CFLAGS
部分。
您甚至可以使用它来使用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
将使用包含CFLAGS
的默认-Werror
构建,但bar
将在没有构建的情况下构建。
这是一个通用的解决方案,适用于所有程序的所有参数,而不是要求每个程序为每个--no-foo
选项提供--foo
。因为无法从Make命令行完成,所以它不直接回答您链接的问题。但是,从命令行覆盖Make变量以强制构建内容是一种非常好的方法,可以使您的unbuildable代码更难以维护!
您可以在Git Makefile中看到CFLAGS
中的变量覆盖示例,现在可以在使用DEVELOPER=YesPlease
调用Make时进行调整,使用Git 2.22(2019年第2季度)
DEVELOPER
(在Git Makefile中)是group more compiler warning的变量。
参见commit 6d5d4b4,commit 71a7894,commit 8fb2a23,commit 65260a4,commit 9559f8f,commit 4f14a8c,Ævar Arnfjörð Bjarmason (avar
)(2019年2月22日)。
(由Junio C Hamano -- gitster
--合并于commit 3cef676,2019年3月20日)
Makefile
:允许合并DEVELOPER=1
和CFLAGS="..."
自从
DEVELOPER=1
设施推出以来,没有办法定制CFLAGS(例如CFLAGS="-O0 -g -ggdb3"
),同时仍然受益于DEVELOPER=1
启用的一系列警告和断言。这是因为Makefile中变量的语义是这样的,用户设置
CFLAGS
会覆盖我们设置的任何内容,包括我们在config.mak.dev
中所做的事情。所以让我们介绍一个"
DEVELOPER_CFLAGS
" variable inconfig.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
带来的东西。 在GCC
和Clang
之后的设置覆盖了之前的设置。 例如。 “-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