我有一个 Makefile(实际上不在我的控制之下),它定义了一些隐式规则使用的变量:
CPPFLAGS := $(CPPFLAGS) -I../../../../modules
CXXFLAGS += -std=c++11
现在,我想为这些变量添加一些额外的标志作为 make 变量。就像是:
make CPPFLAGS="-D_FORTIFY_SOURCE=2" CXXFLAGS="-g -O2"
不幸的是,这会导致覆盖 Makefile 中定义的整个 CPPFLAGS/CXXLAGS,而我想累积它们(实际上我想附加外部设置的标志,即使上面的代码显然试图预先添加)
无论出于何种原因,将这些变量指定为环境变量(而不是 make 变量)都有效:
CPPFLAGS="-D_FORTIFY_SOURCE=2" CXXFLAGS="-g -O2" make
现在由于外部原因,我很难通过 envvars 传递这些标志(而是需要 make vars)。
那么添加隐式规则使用的编译器标志的正确方法是什么?两者都覆盖和 累积变量对我来说是 Makefile 的一项常见任务;一定有办法做到这一点...我已经搜索了 make documentation但还没有找到任何东西!
一个简单的方法显然是引入一些辅助变量:
CXXFLAGS = -std=c++11 $(EXTRA_CXXFLAGS)
然后从外部设置这个辅助变量:
make EXTRA_CXXFLAGS="-g -O2"
但是:这种辅助变量有标准名称吗? (如果是,哪个?记录在哪里??)更好的是,是否还有其他变量会自动添加到隐式规则中(所以我不必手动附加 FLAGS?)
为什么我的原始 Makefile 中用于累积变量的两种变体仅适用于 envvars 而不适用于 make vars 的原因是什么?
最佳答案
环境 变量 can be modified内makefile
使用正常的赋值。并且设置像 CFLAGS
这样的变量是很常见的。 , CXXFLAGS
可以在 makefile
中附加(或以某种方式修改) ,在环境中:
CPPFLAGS="-D_FORTIFY_SOURCE=2" CXXFLAGS="-g -O2" make
相反,变量设置在
make
命令行 , cannot be modified内makefile
使用正常的赋值。这样你就可以在 makefile
中设置用作某个开关的变量:make V=1
生成文件示例:
V=0 # Will be overriden by variable set in `make` command line
ifneq ($(V),0)
# output some debug information
endif
覆盖命令行中设置的变量的唯一方法是使用 override directive :
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
修改
CXXFLAGS
和其他 *FLAGS
变量 假设混凝土
makefile
允许用户影响标志(也就是说,它不会使用直接赋值对它们进行硬编码,例如 CXXFLAGS := -g
)。你想影响标志。makefile
中的标志本身。这些附加标志由 makefile
设置, 是正确编译和链接所必需的。 makefile
设置的标志。 (否则使用环境变量预先设置标志就足够了)。因此,任何担保都将再次消失。那么,为什么不使用 previos 方式(通过命令行变量赋值设置整个标志)?至少,如果出现问题,您肯定会知道问题在于您的标志,而不是由 makefile
设置的标志。 . 关于makefile - 如何使 'make' 附加额外的标准 FLAGS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35072192/