2016-01-11 100 views
3

两个目标是通过一个规则是这样满足:GNU Make中的互斥量?

foo.o foo.h : 
    build_foo # this makes both foo.o and foo.h 

后来,一些目标需要一个,则需要两个:

bar : foo.o 
    build_bar 

baz : foo.h 
    build_baz 

qux : bar baz 
    build qux 

如何防止配方的时候被调用make运行两次与-jN

+1

另外,在GNU Make手册中有一个关于这个的章节:https://www.gnu.org/software/automake/manual/html_node/Multiple-Outputs.html – nos

回答

1

我可以避免模式规则。在你的情况下,你会发现在配方运行后,foo.ofoo.h中的一个比另一个更新(对其使用$ ls --full-time)。

让我们假设你的配方创建foo.h,然后继续创建foo.o。这表明:

foo.o: foo.h ; # Empty recipe 

foo.h: prereq1 prereq2 ... 
    build_foo 

所以,现在如果foo.o是另一个规则prequisite,make将建设foo.h第一,创造foo.o的副作用。然后它会运行foo.o的配方。任务完成。

如果你感到不安, 您可以添加一个简单的断言foo.o确实出现不到foo.h

foo.o: foo.h 
    test [email protected] -nt $< 

欲了解更多有关这个话题,检查出的automake(未作)一章题为Handling Tools that Produce Many Outputs

1

你这样做是通过教导让这个食谱同时建立两个目标

你的目标:

foo.o foo.h : 
    build_foo # this makes both foo.o and foo.h 

是使同这些目标看到:

foo.o : 
    build_foo # this makes both foo.o and foo.h 

foo.h : 
    build_foo # this makes both foo.o and foo.h 

这就是问题所在。

您需要的是一个指定两个目标文件的模式规则。

%.o %.h : 
    build_foo # this makes both foo.o and foo.h 

这对于这个(但你真的想给它理智的先决条件)的作品,因为如何GNU化妆处理pattern rules当他们指定多个目标:

模式规则可能有不止一个目标。与一般规则不同,这不具有许多具有相同先决条件和配方的不同规则。如果模式规则具有多个目标,则make知道规则的配方负责制作所有目标。该配方仅执行一次以制作所有目标。当搜索模式规则以匹配目标时,除了与需要规则的目标相匹配的规则以外的规则的目标模式是偶然的:make仅担心为目前存在问题的文件提供配方和先决条件。但是,在运行此文件的配方时,其他目标被标记为已自行更新。