GNU Make允许您使用MAKEFILES
环境变量指定额外的Makefile文件。引用来自info'(make)MAKEFILES Variable'
:
默认目标从这些Makefile文件中(或由它们包含的任何Makefile文件)不会被选取,并且如果在'MAKEFILES'中列出的文件未找到,则不会出现错误。
如果您正在无指定Makefile文件的情况下运行'make',则在'MAKEFILES'中的一个Makefile文件可以做一些有用的事情,以帮助内置的隐式规则更好地工作。
例如,在当前目录中没有Makefile文件,并且以下`.mk`文件位于`make`的包含路径中(例如通过`MAKEFLAGS=--include-dir="$HOME"/.local/lib/make/`),您可以创建子目录gen/
并通过运行来转换my_graph.dot
或dot/my_graph.dot
:
MAKEFILES=dot.mk make gen/my_graph.png
为了进一步节省输入,我们很容易在会话环境中添加
MAKEFILES=dot.mk
,但在启动文件中定义
MAKEFILES
可能会使事情变得完全不透明。因此,我更喜欢在命令行上看到
MAKEFILES=…
。
文件:
dot.mk
include common.mk
genDir ?= gen/
dotDir ?= dot/
dotFlags ?= $(if $(DEBUG),-v)
Tvariant ?= :cairo:cairo
vpath %.dot $(dotDir)
$(genDir)%.png $(genDir)%.svg $(genDir)%.eps : %.dot | $(genDir).
dot $(dotFlags) $< -o $@ -T'$(patsubst .%,%,$(suffix $@))$(Tvariant)'
包含的
common.mk
是您存储通用定义以管理目录创建、诊断等的位置,例如:
.PRECIOUS: %/. ## preempt 'unlink: ...: Is a directory'
%/. : ; $(if $(wildcard $@),,mkdir -p -- $(@D))
参考资料:
?=
=
:=
… - info '(make)Reading Makefiles'
(读取Makefile文件)
vpath
- info '(make)Selective Search'
(选择性搜索)
- 仅限顺序先决条件(例如,
| $(genDir).
)- info '(make)Prerequisite Types'
(先决条件类型)
.PRECIOUS
- info '(make)Chained Rules'
(链接规则)
make my_graph.dot
会尝试从其他文件制作名为my_graph.dot
的文件。使用 Makefile,您必须使用make my_graph.eps
。 - Bodo