从命令行传递更多的变量,使从命令行传递更多的变量,使(Passing additional vari

2019-05-10 10:54发布

我可以通过变量的GNU Makefile文件作为命令行参数? 换句话说,我想传递一些参数,这将最终成为在Makefile中的变量。

Answer 1:

您有几种选择,从你的makefile外设立变量:

  • 从环境 -每个环境变量被转换成具有相同的名称和值的生成文件的变量。

    您可能还需要设置-e选项(又名--environments-override )上,和你的环境变量将覆盖制作成生成文件(除非这些分配自己使用分配override指令 ,但不推荐,它的要好得多,灵活使用?=分配(条件变量赋值运算符,它只有一个效果如果变量尚未定义):

     FOO?=default_value_if_not_set_in_environment 

    请注意,某些变量不从环境中继承:

    • MAKE从脚本的名称得到
    • SHELL要么生成文件内设置,或默认为/bin/sh (理由:命令生成文件内指定的,而且他们壳特异性)。
  • 从命令行 - make可以变量赋值为他的命令行,用夹杂着目标的一部分:

     make target FOO=bar 

    随后所有的作业FOO ,除非你使用makefile文件中的变量将被忽略 override指令的分配。 (该效果是一样的,与-e选项的环境变量)。

  • 从父制作导出 -如果你调用从一个Makefile做,你通常应该没有明确写变量赋值是这样的:

     # Don't do this! target: $(MAKE) -C target CC=$(CC) CFLAGS=$(CFLAGS) 

    取而代之的是,更好的解决方案可能是导出这些变量。 导出变量使得它成为每一个shell调用的环境,使如上规定这些命令调用选择这些环境变量。

     # Do like this CFLAGS=-g export CFLAGS target: $(MAKE) -C target 

    您也可以通过使用导出所有变量export不带参数。



Answer 2:

最简单的方法是:

make foo=bar target

然后,在你的makefile,你可以参考$(foo) 。 请注意,这将不会传播到自动分让。

如果你是使用子品牌,看到这篇文章: 通讯变量子化妆



Answer 3:

Say you have a makefile like this:

action:
    echo argument is $(argument)

You would then call it make action argument=something



Answer 4:

从手册 :

在make变量可以来自这使运行环境。 在启动时被转换成具有相同的名称和值的make变量每个环境变量,使看到的。 然而,在生成文件明确任务,或命令参数,覆盖了环境。

所以,你可以(从bash)的事:

FOOBAR=1 make

导致变量FOOBAR在你的Makefile。



Answer 5:

这里有没有引用另一种选择包含在由斯托曼和麦格拉斯(请参阅GNU让书http://www.chemie.fu-berlin.de/chemnet/use/info/make/make_7.html )。 它提供了例如:

archive.a: ...
ifneq (,$(findstring t,$(MAKEFLAGS)))
        +touch archive.a
        +ranlib -t archive.a
else
        ranlib archive.a
endif

如果给定的参数出现在它涉及到验证MAKEFLAGS 。 例如..假设你正在学习关于C ++ 11线程,你分在多个文件(你的学习class01 ,..., classNM ),你想:然后编译所有并单独运行或编译一个在时间和运行它,如果被指定的标志( -r ,例如)。 所以,你能想出以下Makefile

CXX=clang++-3.5
CXXFLAGS = -Wall -Werror -std=c++11
LDLIBS = -lpthread

SOURCES = class01 class02 class03

%: %.cxx
    $(CXX) $(CXXFLAGS) -o $@.out $^ $(LDLIBS)
ifneq (,$(findstring r,  $(MAKEFLAGS)))
    ./$@.out
endif

all: $(SOURCES)

.PHONY: clean

clean:
    find . -name "*.out" -delete

有了这样的,你会:

  • 建立和运行一个文件瓦特/ make -r class02 ;
  • 建立所有W / makemake all ;
  • 构建和运行所有的W / make -r (假设它们都含有一定的那种断言的东西,你只是想测试他们全部)


Answer 6:

如果你犯了一个名为makefile文件,添加一个变量这样$(单元测试),那么你就可以用通配符,甚至使用Makefile这里面变量

例如:

make unittest=*

我用BOOST_TEST并给予通配符参数--run_test = $(单元测试),那么我就可以使用正则表达式来筛选出测试我想我的Makefile运行



Answer 7:

export ROOT_DIR=<path/value>

然后使用变量$(ROOT_DIR)在Makefile。



文章来源: Passing additional variables from command line to make