首页 文章

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

提问于
浏览
3

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

  • 4

    Environment 变量can be modifiedmakefile 中使用正常分配 . 设置 CFLAGSCXXFLAGS 之类的变量是常见的,它们可以在环境中的 makefile 中追加(或以某种方式修改):

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

    相反,使用正常分配在 makefile 中的 make command linecannot be modified中设置变量 . 这样你可以在 makefile 中设置用作某个开关的变量:

    make V=1
    

    Makefile示例:

    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
    

    *Modifying CXXFLAGS and other FLAGS variables

    假设具体 makefile 允许用户影响标志(也就是说,它不使用直接赋值来对它们进行硬编码,例如 CXXFLAGS := -g ) . 你想影响旗帜 .

    • 正常方法是设置 environment variable ,它将在 makefile 本身中设置标志 . 由 makefile 设置的这些附加标志是正确编译和链接所必需的 .

    • 但是,您可以尝试使用 command line 中的变量集覆盖整个标志 . 在这种情况下,没有人保证你不会突然破坏编辑,但它可能会奏效 .

    • 至于追加标志..好吧,通常需要 makefile 设置的覆盖标志(否则使用环境变量预先标记就足够了) . 因此,任何保证将再次消失 . 那么,为什么不使用previos方式(通过命令行变量赋值设置整个标志)?至少,如果出现问题,你肯定会知道问题在于你的标志,而不是由 makefile 设置的标志 .

相关问题