如何使“制作”附加额外的标准标志

uml*_*ute 8 makefile gnu-make

我有一个 Makefile(实际上不在我的控制之下),它定义了一些隐式规则使用的变量:

CPPFLAGS := $(CPPFLAGS) -I../../../../modules
CXXFLAGS += -std=c++11
Run Code Online (Sandbox Code Playgroud)

现在,我想为这些变量添加一些额外的标志作为make variables。就像是:

 make CPPFLAGS="-D_FORTIFY_SOURCE=2" CXXFLAGS="-g -O2"
Run Code Online (Sandbox Code Playgroud)

不幸的是这导致了覆盖整个CPPFLAGS CXXLAGS在Makefile中定义的,而我想他们积累/(其实我想追加外部设置标志,即使上面的代码显然试图前插

无论出于何种原因,将这些变量指定为环境变量(而不是make variables)都有效:

 CPPFLAGS="-D_FORTIFY_SOURCE=2" CXXFLAGS="-g -O2" make
Run Code Online (Sandbox Code Playgroud)

现在由于外部原因,我很难通过 envvars 传递这些标志(而是需要make vars)。

那么添加隐式规则使用的编译器标志的正确方法是什么?无论覆盖 积累变量打我作为Makefile文件的共同任务; 还有必须有某种方式来做到这一点...我已经搜查了补充文件,但没有发现任何东西!

一个简单的方法显然是引入一些辅助变量:

 CXXFLAGS = -std=c++11 $(EXTRA_CXXFLAGS)
Run Code Online (Sandbox Code Playgroud)

然后从外部设置这个辅助变量:

 make EXTRA_CXXFLAGS="-g -O2"
Run Code Online (Sandbox Code Playgroud)

但是:这种辅助变量有标准名称吗?(如果是,哪个?记录在哪里??)更好的是,是否还有其他变量会自动添加到隐式规则中(因此我不必手动附加 FLAGS?)

为什么我的原始 Makefile 中用于累积变量的两种变体仅适用于 envvars 而不适用于 make vars 的原因是什么?

Tsy*_*rev 7

环境变量可以makefile使用正常赋值的情况下进行修改。并且在环境中设置诸如 之类的变量是很常见的CFLAGSCXXFLAGS这些变量可以附加(或以某种方式修改)在makefile, 中:

CPPFLAGS="-D_FORTIFY_SOURCE=2" CXXFLAGS="-g -O2" make
Run Code Online (Sandbox Code Playgroud)

如相反,变量设置make 命令行不能被修改makefile使用正常的分配。通过这种方式,您可以设置用作某些开关的变量makefile

make V=1
Run Code Online (Sandbox Code Playgroud)

生成文件示例:

V=0 # Will be overriden by variable set in `make` command line
ifneq ($(V),0)
# output some debug information
endif
Run Code Online (Sandbox Code Playgroud)

覆盖命令行中设置的变量的唯一方法是使用override 指令

override CPPFLAGS := $(CPPFLAGS) -I../../../../modules # Will append string to variable, even if it set by command line

override CXXFLAGS += -std=c++11 # Similar but in the simpler form
Run Code Online (Sandbox Code Playgroud)

修改CXXFLAGS和其他*FLAGS变量

假设具体makefile允许用户影响标志(即,它不使用直接赋值等硬编码它们CXXFLAGS := -g)。你想影响标志。

  1. 正常方法是设置环境变量,该变量将在其自身中设置标志makefile。这些由 设置的附加标志makefile是正确编译和链接所必需的。

  2. 但是,您可以尝试使用命令行中设置的变量覆盖整个标志。在这种情况下,没有人保证您不会突然破坏编译,但它可能会起作用。

  3. 至于附加标志......好吧,它通常需要覆盖设置的标志makefile(否则使用环境变量预先设置标志就足够了)。因此,任何担保都将再次消失。那么,为什么不使用 previos 方式(通过命令行变量赋值设置整个标志)?至少,如果出现问题,您肯定会知道问题出在您的标志上,而不是由makefile.