让我们考虑一下这个文件结构:
/project
+ Makefile
+ projectA
| + Makefile
| + foo.c
| + bar.c
| + ...
|
+ projectB
+ Makefile
+ oak.c
+ ...
如何快速检查submake是否是最新的?
在我的主要品牌中,我有:
all:
make -C projectA
并且在子模型文件中
all: a.txt b.txt
%.txt:%.xtx
cp $< $@
这个解决方案的问题是,无论它做什么,我都会给它打电话。我想避免它。
我发现的一个丑陋的解决方案是在我的子模型文件中创建一个make规则,以回显所有依赖于主目标的文件。然后我可以用shell命令调用submake:
listfiles=$(shell make -C projectA listfiles)
all: $(listfiles)
make -C projectA
编辑
更好的方法是在每个子项目中都有一个shell脚本,返回项目的所有依赖项列表。例如:
项目c/listdep.sh:
#!/usr/bin/bash
find . -iname *.[ch]
然后我可以在母版中使用这个脚本:
projectc/a.out: $(shell projectc/listdep.sh)
make -C $(dir $@)
这样,如果projectc/a.out
存在并且比其依赖项更新,则父make不会调用配方。
我希望您的projectA
和projectB
是"独立的"。这意味着,他们的构建不会从该项目外部读取任何源代码或构建中间文件。他们可能使用gcc
或cp
等工具,但不使用目录外的源,也不使用其他人构建的任何文件。换言之,如果您删除了树的其余部分,并且只使用Makefile
自己构建projectA
和projectB
,那么它们将构建得很好。
在这种情况下,可以使用递归Make。
如果你使用递归Make,你必须做你正在做的事情,
make -C projectA
没有比这更好的办法了。这是"快速检查"submake"是否是最新的最佳方式。