【问题标题】:Directory independent target in MakefileMakefile 中与目录无关的目标
【发布时间】: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.xmlpath/to/foo.xml../ressources/foo.xml 等的规则。但当我想到它时,我开始相信它与 make 的工作方式相去甚远,我应该重新考虑我正在做的事情的整个结构。

标签: makefile


【解决方案1】:

如果您总是希望目标位于另一个目录中,请直接说出来。

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

.PHONY: all
all: $(TARGETS)

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

我不确定您是否应该改用generate $^ &gt;$@;从表面上看,这会更有意义。

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

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

【讨论】:

  • 这行得通,谢谢。 TARGETS 的定义是正确的:每个目标都有一个主模板 ($@_tpl),其中包括其他模板 ($@-part1_tpl$@-part2_tpl...),而 generate 脚本仅将主模板作为参数。我赞成您的回答,但会等着看是否有办法避免在接受之前明确指定../ressources/ 作为可能的目标文件夹。不管怎么说,还是要谢谢你!这有帮助。
  • 你也可以只参数化目录名; TARGETS:=$(patsubst %_tpl,$(TARGETDIR)/%,$(wildcard *_tpl)) 并使用 make TARGETDIR=../resources 调用它(您显然需要更改其余部分以使用相同的变量)。
  • 那么您当前的TARGETS 定义不正确;它将(最终)尝试生成foo-part1foo。如果模式是规则的,那么修复它不会很困难。
  • 它不会尝试生成foo-part1,因为它已经存在并且没有任何依赖关系。还是我错过了什么?我会用VPATH 看看make -f 的想法,但现在我认为它可能过于复杂,因为不会从正确的工作目录调用generate 脚本(我会看看是否有在调用它之前干净地cd)。
  • 最后,将文件生成到任意目录的能力太不自然而且不够重要(我可能的目标目录真的很少,而且在两个不同的位置确实不需要文件)。再次感谢您的回答!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-25
  • 1970-01-01
  • 2017-12-21
相关资源
最近更新 更多