Makefile中与目录无关的目标

时间:2014-11-03 15:35:25

标签: makefile

我正在尝试制定一个规则来生成有关其名称的文件,但不管目录是什么。

我从这个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指令中包含的子部分)编写。

1 个答案:

答案 0 :(得分:2)

如果你总是希望目标在另一个目录中,那就这么说吧。

TARGETS:=$(patsubst %_tpl,../resources/%,$(wildcard *_tpl))

.PHONY: all
all: $(TARGETS)

.SECONDEXPANSION:
$(TARGETS): ../resources/%: $$(wildcard %*_tpl)
    ./generate $@_tpl > $@

我不确定你是否应该generate $^ >$@;从表面上看,这会更有意义。

如果每个目标有多个*_tpl个文件(即tpl个文件多于xml个文件,那么TARGETS定义并不正确;但是我们没有足够的信息来实际修复它。

另一方面,如果目标目录可以改变很多,那么前进的方法可能是cd到目标目录并使用make -f ../path/to/Makefile - 只需确保你的VPATH设置为可以找到源文件。