如何制作'制作'附加额外的标准FLAGS

时间:2016-01-28 21:16:11

标签: makefile gnu-make

我有一个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?

的原因是什么?

1 个答案:

答案 0 :(得分:4)

使用正常分配在makefile

环境变量can be modified。设置CFLAGSCXXFLAGS之类的变量是常见的,这些变量可以在makefile中在环境中附加(或以某种方式修改):

CPPFLAGS="-D_FORTIFY_SOURCE=2" CXXFLAGS="-g -O2" make

相反,使用正常分配在make makefile makefilemake 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)对它们进行硬编码。而且你想影响旗帜。

  1. 正常方法是设置环境变量,它将 prepend 标志设置在makefile本身。正确的编译和链接需要这些由makefile设置的附加标志。

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

  3. 至于附加标志..好吧,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"} 设置的问题。