2009-02-17 41 views
3

如果我有一个调用另一个生成文件的makefile,我如何让主makefile正确检查下级makefile的依赖关系是否已经改变?如何在调用子版本时检查依赖项,以便在发生更改时进行构建?

举例来说,如果我有规则

server: 
    @cd $(SERVERDIR) && $(MAKE) 

调用使我在其中建立一个可执行的“服务器”的子目录。但是,如果我更改构成服务器的文件之一,则父系制造商不会看到更改并拒绝重新生成服务器 - “make:`服务器”是最新的。“

我怎样才能获得主生成文件时,有在相关文件(像$(SERVERDIR)/server.c的一个变化正确地检测,例如?

回答

7

看起来要使用假目标

.PHONY: server 
server: 
    @cd $(SERVERDIR) && $(MAKE) 

还有的假目标here的详细说明,但简短的描述是你告诉生成文件永远不会有一个文件与此服务器目标相对应,因此如果目录中存在名为server的文件,它不会将服务器视为最新的。

+0

这通常是一个很好的解决方案,但我不想*总是重建目标,我希望它像一个正常的非递归目标行为,并且只有在发生了某些变化时才会生成。 – Zxaos 2009-02-17 15:48:03

1

你的目标名称的名称相匹配在你的主目录Makefile的文件或目录的一个

假设你需要在一个名为server子目录建立的一切,这条规则:

server: 
    $(MAKE) -C server 

将无法​​正常工作,为目标server是一个目录,没有源文件,也不需要建立。

这一个:

srv: 
    $(MAKE) -C server 

将工作,只要没有所谓srv文件或目录。