我有一个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传递这些标志(而是需要制造变量) .
那么添加隐式规则使用的编译器标志的正确方法是什么?覆盖 and 累积变量都将我视为Makefile的常见任务;必须有一些方法来做到这一点...我已经搜索了make documentation但没有找到任何东西!
一个简单的方法显然是引入一些辅助变量:
CXXFLAGS = -std=c++11 $(EXTRA_CXXFLAGS)
然后从外部设置此辅助变量:
make EXTRA_CXXFLAGS="-g -O2"
但是:这个辅助变量是否有标准名称? (如果是这样,哪一个?记录在哪里?)更好的是,是否还有一个自动添加到隐式规则的变量(所以我不必手动附加FLAGS?)
为什么在我的原始Makefile中累积变量的两个变量只能用于envvars,而不能用make变量来解释原因是什么原因?
1 回答
Environment 变量can be modified在
makefile
中使用正常分配 . 设置CFLAGS
,CXXFLAGS
之类的变量是常见的,它们可以在环境中的makefile
中追加(或以某种方式修改):相反,使用正常分配在
makefile
中的make
command line ,cannot be modified中设置变量 . 这样你可以在makefile
中设置用作某个开关的变量:Makefile示例:
在命令行中覆盖变量集的唯一方法是使用override directive:
*Modifying CXXFLAGS and other FLAGS variables
假设具体
makefile
允许用户影响标志(也就是说,它不使用直接赋值来对它们进行硬编码,例如CXXFLAGS := -g
) . 你想影响旗帜 .正常方法是设置 environment variable ,它将在
makefile
本身中设置标志 . 由makefile
设置的这些附加标志是正确编译和链接所必需的 .但是,您可以尝试使用 command line 中的变量集覆盖整个标志 . 在这种情况下,没有人保证你不会突然破坏编辑,但它可能会奏效 .
至于追加标志..好吧,通常需要
makefile
设置的覆盖标志(否则使用环境变量预先标记就足够了) . 因此,任何保证将再次消失 . 那么,为什么不使用previos方式(通过命令行变量赋值设置整个标志)?至少,如果出现问题,你肯定会知道问题在于你的标志,而不是由makefile
设置的标志 .