Makefile中与目录无关的目标

Makefile中与目录无关的目标,makefile,Makefile,我正在尝试制定一个规则,该规则将生成有关其名称但不考虑目录的文件 我从这个makefile开始(请参阅): 有了这个,我可以做,例如,makefoo.xml。如果一组 fo.x**tpl 文件在那里,将它们视为先决条件,并调用生成< /Cord>脚本生成目标。 例如,我想做的是,make../resources/foo.xml并使用规则创建foo.xml,但在。/resources/目录中创建它,而不必在makefile中明确指定此目录 我目前尝试的是将以下内容添加到Makefile中: ../

我正在尝试制定一个规则,该规则将生成有关其名称但不考虑目录的文件

我从这个makefile开始(请参阅):

有了这个,我可以做,例如,
makefoo.xml
。如果一组<代码> fo.x**tpl 文件在那里,将它们视为先决条件,并调用<代码>生成< /Cord>脚本生成目标。

例如,我想做的是,
make../resources/foo.xml
并使用规则创建
foo.xml
,但在
。/resources/
目录中创建它,而不必在makefile中明确指定此目录

我目前尝试的是将以下内容添加到Makefile中:

../ressources/%: $(notdir %)
    mv $< $@
。/resources/%:$(notdir%)
mv$<$@
这是可行的,但我希望在将文件移动到目标文件夹之前避免在当前目录中创建该文件。我还希望不必在makefile中指定可能的目标文件夹(但这不太重要)

但首先,这有意义吗?或者我想做的只是概念上的错误

编辑:有关
\u tpl
文件和
生成
脚本的一些精确性,以避免混淆:


每个目标都有一个主模板(
$@\u tpl
),其中包括其他模板(
$@-part1\u tpl
$@-part2\u tpl
),
生成脚本仅将主模板作为参数。模板是用Jinja2编写的(包含在
{%include%}
jinja指令中的子部分)。

如果您总是希望目标位于另一个目录中,只需这样说即可

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

.PHONY: all
all: $(TARGETS)

.SECONDEXPANSION:
$(TARGETS): ../resources/%: $$(wildcard %*_tpl)
    ./generate $@_tpl > $@
我不确定您是否应该让
生成$^>$@
;表面上看,这更有意义

如果每个目标都有多个
*\u tpl
文件(即
tpl
文件比
xml
文件多),则
目标的定义并不正确;但是我们没有足够的信息来修复它


另一方面,如果目标目录可以改变很多,明智的方法可能是将
cd
放入目标目录,并使用
make-f../path/to/Makefile
——只需确保设置了
VPATH
,以便可以找到源文件。

,谢谢。
目标
的定义是正确的:每个目标都有一个主模板(
$@\u tpl
),其中包括其他模板(
$@-part1\u tpl
$@-part2\u tpl
),
生成脚本仅将主模板作为参数。我对您的答案投了赞成票,但在接受之前,我将等待看是否有办法避免明确指定
。/resources/
作为可能的目标文件夹。无论如何谢谢你!你也可以参数化目录名<代码>目标:=$(patsubst%\u tpl,$(TARGETDIR)/%,$(通配符*\u tpl))
并使用
使TARGETDIR=../resources
调用它(显然需要更改其余部分以使用相同的变量)。您当前的
目标定义不正确;它将(最终)尝试使
foo-part1
以及
foo
。如果模式是规则的,那么修复它并不困难。它不会尝试使
foo-part1
,因为它已经存在并且没有任何依赖性。还是我遗漏了什么?我将使用
VPATH
来研究
make-f
的思想,但现在我认为它可能过于复杂,因为
生成
脚本不会从正确的工作目录中调用(我将在调用它之前查看是否有一种干净的
cd
的方法),将文件生成到任意目录的能力太不自然,也不够重要(我几乎没有可能的目标目录,并且在两个不同的位置不需要任何文件)。再次感谢你的回答!创建
foo.xml
所需的文件是否也应该与
foo.xml
本身位于同一目录中?和
bar.xml
可以位于不同的目录中,但其依赖项将与
bar.xml
位于同一目录中?还是我误会了?你很明白。所有的
\u tpl
文件都位于makefile所在的同一目录中。我正在尝试编写一个规则,它将匹配
foo.xml
path/to/foo.xml
。/resources/foo.xml
等等。但是当我想到它时,我开始相信它离make应该如何工作太远了,我应该重新思考我正在做的事情的整体结构。
TARGETS:=$(patsubst %_tpl,../resources/%,$(wildcard *_tpl))

.PHONY: all
all: $(TARGETS)

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