Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检查submake是否为最新版本 让我们考虑这个文件结构: /project + Makefile + projectA | + Makefile | + foo.c | + bar.c | + ... | + projectB + Makefile + oak.c + ..._Makefile - Fatal编程技术网

如何检查submake是否为最新版本 让我们考虑这个文件结构: /project + Makefile + projectA | + Makefile | + foo.c | + bar.c | + ... | + projectB + Makefile + oak.c + ...

如何检查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

如何快速检查submake是否为最新版本

在我的主要成就中,我有:

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
手册。提示:至少在GNU
make
上,有一个命令行选项(
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