2015-02-05 70 views
1

我似乎无法找到此在线的任何示例,并且它似乎对我无效。你可以在make文件中有一个模式规则,它有两个匹配的依赖关系吗?具有两个或更多依赖关系的Makefile模式规则%.sas7bdat:%.sas%.dat

例如

%.sas7bdat: %.sas %.dat 
    # build %.sas7bdat using %.sas and %.dat 

特别是,如果我运行make,它指出...

make: *** No rule to make target `sip84fp.sas7bdat', needed by `sipp84'. Stop. 

即使该规定显然与上述相同。

然而,减少规则,这...

%.sas7bdat: %.sas 

似乎工作?

+1

听起来像你没有'sip84fp.dat'文件,它不能创建一个。你做? – 2015-02-05 23:18:32

+0

啊,我错过了依赖链的更深层次的东西(在这个东西里仍然很新)。谢谢! – 2015-02-05 23:20:03

回答

2

是的,静态模式规则和隐式模式规则都可以具有多个先决条件,其中包含对模式主干的引用%

隐式模式规则不同于静态模式规则或普通的非模式规则,因为它们只适用于没有先决条件(“无条件地做这件事”)或其他先决条件存在的情况。

也就是说,如果需要构建的目标,如sip84fp.sas7bdat需要更新,那么模式规则%.sas7bdat: %.sas %.dat的确是候选者。但会进行检查:将sip84fp阀杆插入前提条纹图案中以生成sip84fp.sas sip84fp.dat。这两者都必须存在。如果它们不存在,则将该规则从考虑中移除,并且搜索继续进行其他规则。

这就是为什么最后你会得到一条关于“无规则”的消息:它确实意味着在忽略所有不适用的隐式规则后没有规则留下。

相比之下,在静态模式规则或普通规则下,如果目标与规则匹配,并且先决条件不存在,则必须更新先决条件。例如,如果您有foo.o: foo.cfoo.c不存在,则该规则不能被丢弃,因为它不是隐含的:该规则必须用于foo.o。然后Make会寻找一个建立foo.c的规则(并且可能找不到一个:这个错误将会是没有规则制作foo.c而不是foo.o)。

请参阅GNU Make手册中的主题Implicit Rule Search Algorithm

如果这是.dat文件可能不存在的预期行为,则必须以其他方式表示该文件。例如,一种方法是使用一些外部依存产生使窗体的若干具体规则:

foo.sas7bdat: foo.dat 

它放入一个foo.d文件,并includeMakefile。如果你有一个名为TARGETS变量,它包含所有.sas7bdat文件的名称,可以包括所有的.d相关文件是这样的:

-include $(patsubst %.sas7bdat,%.d,$(TARGETS)) 

这是一样的编译C.我们不会写这样的模式规则的C程序:

%.o: %.c %.h 
     # ... build steps 

这是因为不是每个foo.cfoo.h,所以规则并不适用于这种情况。相反,我们有:

%.o: %.c 

,然后任何额外的依赖,就像foo.o取决于foo.h在别处表示。隐式规则仅匹配主要可交付成果:目标文件和翻译单元的“根”文件。

+0

感谢您的这种深思熟虑的回应! – 2015-02-06 01:33:12

相关问题