如何检查子模型是否是最新的



让我们考虑一下这个文件结构:

/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不会调用配方。

我希望您的projectAprojectB是"独立的"。这意味着,他们的构建不会从该项目外部读取任何源代码或构建中间文件。他们可能使用gcccp等工具,但不使用目录外的源,也不使用其他人构建的任何文件。换言之,如果您删除了树的其余部分,并且只使用Makefile自己构建projectAprojectB,那么它们将构建得很好。

在这种情况下,可以使用递归Make。

如果你使用递归Make,你必须做你正在做的事情,

make -C projectA

没有比这更好的办法了。这是"快速检查"submake"是否是最新的最佳方式。

最新更新