【发布时间】:2014-11-03 15:35:25
【问题描述】:
我正在尝试制定一个规则,该规则将生成有关其名称但与目录无关的文件。
我从这个 makefile 开始(参见a previous question of mine):
TARGETS:=$(patsubst %_tpl,%,$(wildcard *_tpl))
.PHONY: all
all: $(TARGETS)
.SECONDEXPANSION:
$(TARGETS): %: $$(wildcard %*_tpl)
./generate $@_tpl > $@
有了这个,我可以做,例如,make foo.xml。它查看是否存在一组foo.xml*_tpl 文件,将它们视为先决条件并调用generate 脚本来生成目标。
我想做的是,例如make ../ressources/foo.xml,并使用规则创建foo.xml,但在../ressources/目录中创建它,而无需在makefile中明确指定此目录。
我目前尝试将其添加到 Makefile:
../ressources/%: $(notdir %)
mv $< $@
这可行,但我想避免在将文件移动到目标文件夹之前在当前目录中创建文件。我还希望不必在 makefile 中指定可能的目标文件夹(但这不太重要)。
但首先,这有意义吗?还是我想做的只是概念上的错误?
编辑:关于_tpl 文件和generate 脚本的一些精确度以避免混淆:
每个目标都有一个主模板 ($@_tpl),其中包括其他目标 ($@-part1_tpl、$@-part2_tpl...),generate 脚本仅将主模板作为参数。模板是用 Jinja2 编写的({% include %} jinja 指令中包含的子部分)。
【问题讨论】:
-
创建
foo.xml所需的文件是否也应该与foo.xml本身位于同一目录中?bar.xml可能位于不同的目录中,但其依赖项与bar.xml是否位于同一目录中?还是我误会了? -
你懂的。所有
_tpl文件都在makefile 所在的同一目录中。我正在尝试编写一个匹配foo.xml、path/to/foo.xml、../ressources/foo.xml等的规则。但当我想到它时,我开始相信它与 make 的工作方式相去甚远,我应该重新考虑我正在做的事情的整个结构。
标签: makefile