gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:34:42 36 4
gpt4 key购买 nike

我似乎无法在网上找到任何此类示例,而且它似乎对我不起作用。您可以在具有两个匹配依赖项的 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

似乎工作?

最佳答案

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

隐式模式规则与静态模式规则或普通的非模式规则的不同之处在于,它们仅在没有先决条件(“无条件地制作这个东西”)或先决条件存在时才适用。

也就是说,如果有一个需要构建的target,比如sip84fp.sas7bdat需要更新,那么确实是模式规则%.sas7bdat: %.sas %.dat是候选人。但是进行了检查:sip84fp将词干插入先决条件模式以生成 sip84fp.sas sip84fp.dat .这两个都必须存在。如果它们不存在,则不考虑该规则,并继续搜索其他规则。

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

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

看题目Implicit Rule Search Algorithm在 GNU Make 手册中。

如果 .dat 是预期行为文件可能不存在,您必须以其他方式表达。例如,一种方法是使用一些外部依赖生成来制定许多具体的形式规则:

foo.sas7bdat: foo.dat

将其放入 foo.d文件和 include它进入 Makefile .如果您有一个名为 TARGETS 的变量其中包含所有 .sas7bdat 的名称文件,你可以包含所有的 .d像这样的依赖文件:
-include $(patsubst %.sas7bdat,%.d,$(TARGETS))

这与编译 C 相同。我们不会为 C 程序编写这样的模式规则:
%.o: %.c %.h
# ... build steps

这是因为并非每个 foo.c有一个 foo.h ,因此该规则不适用于此类情况。相反,我们有:
%.o: %.c

然后是任何其他依赖项,例如 foo.o取决于 foo.h在别处表达。隐式规则仅匹配主要交付物:目标文件和翻译单元的“根”文件。

关于具有两个或多个依赖项的 Makefile 模式规则 %.sas7bdat : %. sas %.dat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28355879/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com