如何检查submake是否为最新版本 让我们考虑这个文件结构: /project + Makefile + projectA | + Makefile | + foo.c | + bar.c | + ... | + projectB + Makefile + oak.c + ...
如何快速检查submake是否为最新版本 在我的主要成就中,我有:如何检查submake是否为最新版本 让我们考虑这个文件结构: /project + Makefile + projectA | + Makefile | + foo.c | + bar.c | + ... | + projectB + Makefile + oak.c + ...,makefile,Makefile,如何快速检查submake是否为最新版本 在我的主要成就中,我有: all: make -C projectA 在子磁盘文件中 all: a.txt b.txt %.txt:%.xtx cp $< $@ 编辑 更好的方法是在每个子项目中都有一个shell脚本,返回项目所有依赖项的列表。例如: projectc/listdep.sh: #!/usr/bin/bash find . -iname *.[ch] 然后,我可以在父项make中使用此脚本: p
all:
make -C projectA
在子磁盘文件中
all: a.txt b.txt
%.txt:%.xtx
cp $< $@
编辑
更好的方法是在每个子项目中都有一个shell脚本,返回项目所有依赖项的列表。例如:
projectc/listdep.sh:
#!/usr/bin/bash
find . -iname *.[ch]
然后,我可以在父项make中使用此脚本:
projectc/a.out: $(shell projectc/listdep.sh)
make -C $(dir $@)
通过这种方式,如果
projectc/a.out
存在并且比它的依赖项更新,则父make不会调用配方。我希望您的projectA
和projectB
是“自包含的”。这意味着,它们的构建不会从项目外部读取任何源或构建中间文件。他们可能会使用工具,如gcc
,或者,正如您在上面的示例中所使用的cp
,但不会使用其目录外的源,也不会使用其他人生成的任何文件。换句话说,如果您删除了树的整个其余部分,并且仅使用它们的Makefile
s自己构建projectA
和projectB
,那么它们将构建得很好
在这种情况下,可以使用递归Make
如果你使用递归Make,你必须做你正在做的事情
make -C projectA
没有更好的办法了。这是“快速检查”submake是否最新的最好方法 除非你真的需要避免额外拨打电话的费用,否则不要费心玩这些游戏。(事实上,我认为,你丑陋的解决方案比什么都不做更糟糕,因为你总是会运行make一次(即使不需要运行该目标),如果你首先需要运行子make,那么现在就运行它两次。)这个问题的唯一解决方案是首先不使用递归make。这就是全部内容(pdf链接)。有关此内容的一些讨论,请参阅。请阅读
make
手册。提示:至少在GNUmake
上,有一个命令行选项(make-q
)可以简单地测试是否需要做某事…@twalberg很好,但我如何在父Makefile中使用它?在这种情况下,您不想使用make-q
。考虑:如果make-q
返回“not-update”,您想做什么?您想运行make
。如果make-q
返回“最新”,那么您已经运行了make,即使您没有给出-q
,它也不会做任何事情。所以,最好的情况是你做同样的工作,最坏的情况是你做两倍的工作。只需在子目录中运行make
。没有比这更有效的了(除了使用非递归的makefiles)。您的解决方案的问题是我没有检查依赖项。使用projectC:\n$(MAKE)-C projectC/
MAKE不知道目标(即projectC.out
)及其所有源(即projectC.C``projectC.h
)是否自上次生成以来被修改。所以我需要使用这个:projectC/projectC.out:projectC/projectC.c projectC/projectC.h\n$(MAKE)-c projectC/
。在这种情况下,最好的解决方案应该是projectc/projectc.out:$(shell make-C projectc get\u src\u list)\n make-C projectc/
。你怎么认为?
make -C projectA