我有一个 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 的原因是什么?
环境变量可以在makefile使用正常赋值的情况下进行修改。并且在环境中设置诸如 之类的变量是很常见的CFLAGS,CXXFLAGS这些变量可以附加(或以某种方式修改)在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)。你想影响标志。
正常方法是设置环境变量,该变量将在其自身中设置标志makefile。这些由 设置的附加标志makefile是正确编译和链接所必需的。
但是,您可以尝试使用命令行中设置的变量覆盖整个标志。在这种情况下,没有人保证您不会突然破坏编译,但它可能会起作用。
至于附加标志......好吧,它通常需要覆盖设置的标志makefile(否则使用环境变量预先设置标志就足够了)。因此,任何担保都将再次消失。那么,为什么不使用 previos 方式(通过命令行变量赋值设置整个标志)?至少,如果出现问题,您肯定会知道问题出在您的标志上,而不是由makefile.
| 归档时间: |
|
| 查看次数: |
4513 次 |
| 最近记录: |