我的makefile使用自动生成的依赖项。为此,我在我的顶级makefile中有类似于:
# Makefile
include target1.deps
include target2.deps
all: target2.deps
cat $^
target2.deps: target1.deps
target1.deps:
echo "target2.deps:" > $@
echo " touch target2.deps" >> $@
最初,target1.deps
和target2.deps
不存在。首次实例化make时,它会解析整个Makefile并搜索生成这些包含文件的方法。在构建它们之后,它会重新调用自身,导致重新分析Makefile并包含此次包含的文件。至少,这是我的理解。
问题在于,当我运行上面的Makefile时,Make first builds target1.deps
,然后执行all
规则的主体,从不构建或包含target2.deps
。这会导致cat
错误:cat: target2.deps: No such file or directory
这似乎与我相矛盾。我明确告诉Make
all
取决于target2.deps
,但它会在满足其先决条件之前尝试执行规则!
预期的行为是target1.deps
应该构建并包含,然后target2.deps
应该使用{中包含的规则构建并包含 {1}},然后应运行target1.deps
。我如何实现这一目标?
上下文:由于这是非常抽象的,这是我的目标:我有一个目标all
,它是从模板index.html
生成的,但我不知道任何关于它的依赖关系。我需要找出(a)在构建index.html.in
之前我需要创建哪些文件,以及(b)在运行时哪些文件index.html
将依赖。
例如index.html
包含一些从index.html
中提取的内联css - 因此我需要在构建global.css
之前构建global.css
。另一方面,index.html
链接到index.html
,因此在我构建about.html
之后,我还要构建index.html
。我将前者称为“构建依赖项”,将后者称为“运行时依赖项”。所以我的makefile看起来像这样:
about.html
我想要发生的是让Make遵循以下步骤:
include index.html.build_deps
include index.html.runtime_deps
all: index.html $(runtime_deps_index.html)
%.build_deps: %.in
./extract_build_deps %< -o %@
%.runtime_deps: %
./extract_runtime_deps %< -o %@
%: %.in
./compile_template %< -o $@
index.html.build_deps
index.html.build_deps
(现在是global.css
的已知先决条件)index.html
index.html
index.html.runtime_deps
index.html.runtime_deps
)$(runtime_deps_index.html)
内
index.html.runtime_deps
实际发生的事情:
all
可以直接从index.html.build_deps
构建;这样做。index.html.in
可以从index.html.runtime_deps
构建,可以从index.html
构建。index.html.in
。它错误,因为尚未构建index.html
。如果global.css
在构建之后包含Make
,那么它就会知道index.html.build_deps
依赖关系。但是因为它在扩展其中任何一个之前尝试构建所有包含文件,所以它不知道依赖性。我想添加依赖项“index.html.runtime_deps取决于已包含的index.html.build_deps ,但我不确定如何指定这样的依赖项。
答案 0 :(得分:3)
@Dario是正确的。更具体一点,这些是以下步骤:
target1.deps
并执行配方。target1.deps
仍然不存在,因此make不会将目标标记为已更新。target1.deps
,它已经构建了,但没有配方,所以make不会将target2.deps
标记为已更新(因为它从未更新过,因此到目前为止正如make可以告诉 - 它没有运行任何更新它的配方。)all
;它看到all
取决于target2.deps
,但已经考虑了该目标,并认为它不需要重建,所以现在make已完成所有工作。您可以运行make -d
并按照决定制定。