Makefile 具有两个或多个依赖项的生成文件模式规则%.sas7bdat:%.sas%.dat
我似乎在网上找不到任何这样的例子,而且对我来说似乎也不起作用。在具有两个匹配依赖项的make文件中是否有模式规则 比如说Makefile 具有两个或多个依赖项的生成文件模式规则%.sas7bdat:%.sas%.dat,makefile,Makefile,我似乎在网上找不到任何这样的例子,而且对我来说似乎也不起作用。在具有两个匹配依赖项的make文件中是否有模式规则 比如说 %.sas7bdat: %.sas %.dat # build %.sas7bdat using %.sas and %.dat 具体来说,如果我运行make,它会声明 make: *** No rule to make target `sip84fp.sas7bdat', needed by `sipp84'. Stop. 尽管上述规则有明确的定义 然而,将规则简
%.sas7bdat: %.sas %.dat
# build %.sas7bdat using %.sas and %.dat
具体来说,如果我运行make,它会声明
make: *** No rule to make target `sip84fp.sas7bdat', needed by `sipp84'. Stop.
尽管上述规则有明确的定义
然而,将规则简化为此
%.sas7bdat: %.sas
似乎有效?是的,静态模式规则和隐式模式规则都可以有多个先决条件,其中包含对模式干的
%
引用
隐式模式规则不同于静态模式规则或普通的非模式规则,因为它们仅在没有先决条件(“无条件地生成此项”)或先决条件存在时才应用
也就是说,如果需要构建一个目标,如sip84fp.sas7bdat
需要更新,那么模式规则%.sas7bdat:%.sas%.dat
确实是一个候选规则。但是进行了检查:将sip84fp
干插入到先决条件模式中以生成sip84fp.sas sip84fp.dat
。这两者都必须存在。如果它们不存在,则将从考虑中删除该规则,并继续搜索其他一些规则
这就是为什么最后你会收到一条关于“没有规则”的消息:这真的意味着在忽略了所有不适用的隐式规则之后,没有留下任何规则
相反,在静态模式规则或普通规则下,如果目标与规则匹配,并且前提条件不存在,则必须更新前提条件。例如,如果您有foo.o:foo.c
且foo.c
不存在,则不能丢弃该规则,因为它不是隐式的:该规则必须用于foo.o
。Make然后将查找生成foo.c
的规则(可能找不到:错误将是没有规则生成foo.c
,而不是foo.o
)
请参阅GNU Make手册中的主题
如果.dat
文件可能不存在是一种预期行为,则必须用其他方式表示。例如,一种方法是使用一些外部依赖生成来生成表单的许多具体规则:
foo.sas7bdat: foo.dat
将其放入foo.d
文件中,然后将其包含到Makefile
中。如果您有一个名为TARGETS
的变量,该变量包含所有.sas7bdat
文件的名称,则可以包括它们的所有.d
依赖项文件,如下所示:
-include $(patsubst %.sas7bdat,%.d,$(TARGETS))
这与编译C是一样的。我们不会为C程序编写这样的模式规则:
%.o: %.c %.h
# ... build steps
这是因为并非每个foo.c
都有foo.h
,因此该规则不适用于此类情况。相反,我们有:
%.o: %.c
然后,根据foo.h
的任何附加依赖项,如foo.o
都在别处表示。隐式规则只匹配主要可交付成果:目标文件和翻译单元的“根”文件。听起来好像没有sip84fp.dat
文件,它无法创建一个。是吗?啊,我在依赖关系链上遗漏了一些东西(在这个make方面还是很新的)。谢谢感谢您如此周到的回复!