makefile - 如何使 'make' 附加额外的标准 FLAGS

标签 makefile gnu-make

我有一个 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 modifiedmakefile使用正常的赋值。并且设置像 CFLAGS 这样的变量是很常见的。 , CXXFLAGS可以在 makefile 中附加(或以某种方式修改) ,在环境中:

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

相反,变量设置在 make 命令行 , cannot be modifiedmakefile使用正常的赋值。这样你就可以在 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/

    相关文章:

    c++ - 为 C++ 程序编写 Makefile

    c++ - 带有外部库的 CMake 'no rule to make target'

    c++ - 将 Makefile 转换为 CMAKEList(编译成功但程序行为不同)

    makefile - 发现 Makefile 或 cmake 的 MPI api 版本

    makefile - GNU Make——模式匹配的依赖关系

    makefile - := vs = in make macros

    C++ Makefile 在 .dep 中缺少分隔符

    makefile - make 命令 makefile 错误 :18: *** missing separator. 停止

    c++ - 扩展一个简单的 makefile 以支持不同的隐式编译器标志

    c - 包含多个文件的 Makefile 总是构建一切