Makefile 具有两个或多个依赖项的生成文件模式规则%.sas7bdat:%.sas%.dat

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. 尽管上述规则有明确的定义 然而,将规则简

我似乎在网上找不到任何这样的例子,而且对我来说似乎也不起作用。在具有两个匹配依赖项的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

似乎有效?

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

隐式模式规则不同于静态模式规则或普通的非模式规则,因为它们仅在没有先决条件(“无条件地生成此项”)或先决条件存在时才应用

也就是说,如果需要构建一个目标,如
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方面还是很新的)。谢谢感谢您如此周到的回复!