让我们考虑一下这个文件结构:
/project
+ Makefile
+ projectA
| + Makefile
| + foo.c
| + bar.c
| + ...
|
+ projectB
+ Makefile
+ oak.c
+ ...
如何快速检查子邮件是否是最新的?
在我的主要作品中我有:
all:
make -C projectA
在submakefile中
all: a.txt b.txt
%.txt:%.xtx
cp $< $@
这个解决方案的问题在于我总是会调用submake,无论它无关。我想避免它。
我发现的丑陋的解决方案是在我的submakefile中创建一个make规则来回显所有依赖于主目标的文件。然后我可以使用shell命令调用submake:
listfiles=$(shell make -C projectA listfiles)
all: $(listfiles)
make -C projectA
修改
更好的方法是在每个子项目中都有一个shell脚本,它返回所有项目依赖项的列表。例如:
项目C / listdep.sh:
#!/usr/bin/bash
find . -iname *.[ch]
然后我可以在父make:
中使用这个脚本 projectc/a.out: $(shell projectc/listdep.sh)
make -C $(dir $@)
通过这种方式,如果projectc/a.out
存在,并且更新近它的依赖关系,父母就不会调用该方法。
答案 0 :(得分:1)
我希望您的projectA
和projectB
是“自足的”。这意味着,他们的构建不会从该项目外部读取任何源或构建中间文件。他们可能会使用gcc
之类的工具,或者像上面示例cp
中那样使用工具,但不能使用其目录之外的源,而不能使用其他人构建的任何文件。换句话说,如果您删除了树的其余部分,并且只使用projectA
自己构建projectB
和Makefile
,那么它们就会很好地构建。
在这种情况下,可以使用递归Make。
如果你使用递归Make,你必须做你正在做的事情,
make -C projectA
没有更好的方法。这是“快速检查”“submake”是否是最新的最佳方式。