我有一个Makefile(实际上并不在我的控制之下),它定义了隐式规则使用的一些变量:
CPPFLAGS := $(CPPFLAGS) -I../../../../modules
CXXFLAGS += -std=c++11
现在,我想在 make variables 中为这些变量添加一些额外的标志。类似的东西:
make CPPFLAGS="-D_FORTIFY_SOURCE=2" CXXFLAGS="-g -O2"
遗憾的是,这导致覆盖在Makefile中定义的整个CPPFLAGS / CXXLAGS,而我想积累它们(实际上我想追加外部设置的标志,即使上面的代码显然试图 prepend )
无论出于何种原因,将这些变量指定为环境变量(而不是 make variables )可以起作用:
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?
的原因是什么?答案 0 :(得分:4)
makefile
内 环境变量can be modified。设置CFLAGS
,CXXFLAGS
之类的变量是常见的,这些变量可以在makefile
中在环境中附加(或以某种方式修改):
CPPFLAGS="-D_FORTIFY_SOURCE=2" CXXFLAGS="-g -O2" make
相反,使用正常分配在make
makefile
makefile
内make V=1
命令行,cannot be modified设置变量。这样你可以设置用作V=0 # Will be overriden by variable set in `make` command line
ifneq ($(V),0)
# output some debug information
endif
中的某些开关的变量:
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
Makefile 的示例:
CXXFLAGS
在命令行中覆盖变量集的唯一方法是使用override directive:
*FLAGS
修改makefile
和其他CXXFLAGS := -g
变量
假设具体makefile
允许用户影响标记(也就是说,它不使用直接赋值(makefile
)对它们进行硬编码。而且你想影响旗帜。
正常方法是设置环境变量,它将 prepend 标志设置在makefile
本身。正确的编译和链接需要这些由makefile
设置的附加标志。
但是,您可以尝试使用命令行中设置的变量覆盖整个标记。在这种情况下,没有人保证你不会突然破坏编辑,但它可能有效。
至于附加标志..好吧,Send-MailMessage
设置的覆盖标志通常需要它(否则使用环境变量预先标记的是足够)。因此,任何保证将再次消失。那么,为什么不使用previos方式(通过命令行变量赋值设置整个标志)?至少,如果出现问题,你肯定会知道问题在于你的旗帜,而不是$fpath = "C:\original.csv"
$imported = Import-Csv $fpath -Delimiter "," -Header "DATE","TIME","DIR","LOC","EMP","TYPE","NEW","OLD","TOTAL","FILE","DIRE","FILE SIZE","FILE UPDATE DATE","PROGRAM" | Where-Object {$_.NEW -eq "0"}
设置的问题。