Makefile:在包含另一个makefile之前需要做一个目标

时间:2011-01-28 15:27:11

标签: include dependencies makefile

我的Makefile的一部分:

CPUDEPS=./mydeps.cpu
(...)
deps: $(CPUDEPS)

$(CPUDEPS): $(CCFILES)
 @echo [DEPS] CPU
 $(CMDECHO)makedepend -Y -s'# CPU sources dependencies generated with "make deps"' \
  -w4096 -f- -- $(CFLAGS) -- $^ 2> /dev/null > $(CPUDEPS)
(...)
sinclude $(CPUDEPS)

问题1 :包括在处理的第一阶段完成,第二阶段的目标;所以,如果./mydeps.cpu不存在而且我“制作deps”,我先得到错误

Makefile:335: ./mydeps.cpu: No such file or directory

我使用sinclude而不是include隐藏错误,但问题仍然存在:包含旧文件,而不是刚生成的文件。必须运行两次以包含更新的文件。这是因为make进行了两阶段处理;有没有办法告诉make在解析包含之前完成目标代码

问题2 :即使文件./mydeps.cpu不存在而且make deps实际创建了它,我总是得到一个“make:没有为deps做什么”。其他目标不会发生这种情况。我不明白为什么以及如何避免它。

2 个答案:

答案 0 :(得分:1)

您尝试实现的目标是无用的:您可以使用在上一次构建期间创建的依赖项文件。这就够了。

该规则背后的主要原因是:

  • 如果您没有更改任何文件,那么依赖项文件是最新的,并且没有任何内容可以构建。
  • 如果您已经更改了任何内容,甚至更深入到#include链中,在先前版本使用的现有文件上,那么依赖项文件已经捕获了它。你将重建所需的东西。
  • 如果您在新文件中更改某些内容(添加该文件!),则以前的版本不会使用它,也不会在依赖项中列出。但是如果你真的想要使用它,那么你必须至少修改之前使用过的其他一个文件,然后再回到上一个案例中。

解决方案是在编译的正常过程中创建依赖项文件,并可选择包含它(使用sinclude)(如果它存在)。

答案 1 :(得分:1)

问题1不存在:在构建目标之前,make会自动重建makefile(如果没有提供明确的规则,则使用隐式规则)。因此,拥有makefile规则可确保始终保持最新状态,无需运行deps两次。此外,由于CPUDEPS是一个makefile,它将在运行任何其他规则之前自动更新,因此必要时将始终更新依赖项,并且不需要make deps。如果[DEPS]中的任何CCFILES变得比依赖文件更新,则可以通过观察被回显的@echo OK行来自己注意到这一点。

对于问题2,在配方中添加任何内容可确保make不会抱怨无所事事。如果没有其他内容,您可以使用@true之类的内容向用户提供反馈,如果您更喜欢完全无声的内容,则可以使用简单的{{1}}。