我的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做什么”。其他目标不会发生这种情况。我不明白为什么以及如何避免它。
答案 0 :(得分:1)
您尝试实现的目标是无用的:您可以使用在上一次构建期间创建的依赖项文件。这就够了。
该规则背后的主要原因是:
#include
链中,在先前版本使用的现有文件上,那么依赖项文件已经捕获了它。你将重建所需的东西。解决方案是在编译的正常过程中创建依赖项文件,并可选择包含它(使用sinclude
)(如果它存在)。
答案 1 :(得分:1)
问题1不存在:在构建目标之前,make
会自动重建makefile(如果没有提供明确的规则,则使用隐式规则)。因此,拥有makefile规则可确保始终保持最新状态,无需运行deps两次。此外,由于CPUDEPS
是一个makefile,它将在运行任何其他规则之前自动更新,因此必要时将始终更新依赖项,并且不需要make deps
。如果[DEPS]
中的任何CCFILES
变得比依赖文件更新,则可以通过观察被回显的@echo OK
行来自己注意到这一点。
对于问题2,在配方中添加任何内容可确保make不会抱怨无所事事。如果没有其他内容,您可以使用@true
之类的内容向用户提供反馈,如果您更喜欢完全无声的内容,则可以使用简单的{{1}}。