我可以通过变量的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 /
make
或make 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。