来自 手册 :
make中的变量可以来自运行make的环境。在启动时查看的每个环境变量都将转换为具有相同名称和值的make变量。但是,makefile中的显式赋值或命令参数会覆盖环境。
所以你可以做(从bash):
FOOBAR=1 make
产生一个变量 FOOBAR 在你的Makefile中。
FOOBAR
export ROOT_DIR=<path/value>
然后使用变量, $(ROOT_DIR) 在Makefile中。
$(ROOT_DIR)
您有几个选项可以从makefile外部设置变量:
的 来自环境 强> - 将每个环境变量转换为具有相同名称和值的makefile变量。
您可能还想设置 -e 选项(又名 --environments-override )on,你的环境变量将覆盖makefile中的赋值(除非这些赋值本身使用了 override 指示 。但是,不推荐使用它,使用起来更好,更灵活 ?= 赋值(条件变量赋值运算符,只有在尚未定义变量时才有效):
-e
--environments-override
override
?=
FOO?=default_value_if_not_set_in_environment
请注意,某些变量不是从环境继承的:
MAKE
SHELL
/bin/sh
的 从命令行 强> - make 可以将变量赋值作为其命令行的一部分,与目标混合:
make
make target FOO=bar
但是之后 所有作业 FOO makefile中的变量将被忽略 除非你使用 override 指示 在任务中。 (效果与。相同 -e 环境变量的选项)。
FOO
的 从父Make导出 强> - 如果从Makefile调用Make,通常不应该显式地写这样的变量赋值:
# 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 没有争论。
export
假设您有一个这样的makefile:
action: echo argument is $(argument)
然后你会打电话给它 make action argument=something
make action argument=something
最简单的方法是:
make foo=bar target
然后在你的makefile中你可以参考 $(foo) 。请注意,这不会自动传播到子品牌。
$(foo)
如果您使用的是子品牌,请参阅此文章: 将变量传递给子制作
如果你创建一个名为Makefile的文件并添加一个像这样的变量$(unittest) 然后,即使使用通配符,您也可以在Makefile中使用此变量
例如:
make unittest=*
我使用BOOST_TEST并给参数设置了一个通配符--run_test = $(unittest) 然后我将能够使用正则表达式过滤掉我想要我的Makefile的测试 跑步
这里没有引用的另一个选项包含在Stallman和McGrath的GNU Make书中(参见 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 :
MAKEFLAGS
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
make all
make -r