【发布时间】:2018-01-15 22:03:02
【问题描述】:
我有两个使用 GNU make 构建的项目。项目 B 依赖于项目 A 的输出之一。我们称之为 OUTPUT。所以项目 B 的 Makefile 包含如下内容:
target: ../ProjectA/OUTPUT
do stuff
为确保 OUTPUT 是最新的,我希望 B 的 Makefile 启动 A 的 make,然后仅在 OUTPUT 被重建(或已经比目标更新)时“做一些事情”。
我第一次尝试这样做:
../ProjectA/OUTPUT:
(cd ../ProjectA; $(MAKE) OUTPUT)
但是由于没有为 OUTPUT 提供依赖项,make 将简单地假设它是最新的(如果存在)并且不会运行子 make。
将 OUTPUT 声明为假可确保子 make 将运行:
.PHONY: ../ProjectA/OUTPUT
../ProjectA/OUTPUT:
(cd ../ProjectA; $(MAKE) OUTPUT)
但现在 make 将忽略 OUTPUT 上的实际日期并始终认为它比目标更新,这意味着“做事”将始终执行。
我发现唯一可行的方法是在 B 的 Makefile 中复制 OUTPUT 的整个依赖关系树。这太可怕了,无法考虑。稍微不那么可怕的是将 OUTPUT 的依赖树放在两个项目的 Makefile 包含的单独文件中。
有没有更好的方法让 make 做我想做的事?
【问题讨论】:
-
有一篇关于在项目之间使用 make 的困难的经典文章,值得一读:aegis.sourceforge.net/auug97.pdf
-
看起来你还没有完全定义你的依赖关系。要么你可以找到ProjectA所依赖的ProjectB的结果,要么没有,那么不重建不是make的错。如果您的项目管理人员只想拥有新的时间戳,请将它们明确化并让 ProjectA 和 B 依赖它们。