gpt4 book ai didi

makefile - GNU 制作 : Ensure existence of prerequisite and disable implicit rule search

转载 作者:行者123 更新时间:2023-12-04 20:27:53 25 4
gpt4 key购买 nike

问题:

如何禁用对先决条件的隐式规则搜索,同时仍确保先决条件实际存在?

背景:

考虑以下初始 Makefile :

b: a
@echo MAKING B
cp a b
a是制作 b 所需的文件.如果文件 a存在, make b运行成功。如果它不存在,我们会得到以下错误:
make: *** No rule to make target `a', needed by `b'.  Stop.` 

这正是我们所期望的,但是在检查 make --debug=a b 的输出时,我们看到即使 a存在, make正在搜索预定义的隐式规则拟合 a以查看是否可以重新制作。例如,如果文件 a.c碰巧存在,然后 make会尝试编译 a.c生成文件 a .为了防止这种情况,我们为 a 定义了一个明确的规则。用一个空的食谱。这给了我们更新的 Makefile :
a: ;

b: a
@echo MAKING B
cp a b

现在的问题是 make b 的配方即使运行 a不存在,导致失败。有没有其他方法可以表明 a应该存在,而不是搜索隐式规则来构建 a ?我想在不提供 a 的食谱的情况下执行此操作它检查它的存在。

最佳答案

我将尝试总结到目前为止我们的讨论状态。也许有人仍然会提出另一个/更好的见解。

除了问题本身中也提到的选项(有关此方法的最新迭代的解释器,请参见下文):

a:
$(error missing file "$@")
b: a
@echo MAKING B
cp a b

从理论上讲,应该可以完全禁用隐式模式规则或通过 defining a no recipe target rule 禁用特定(组)目标。 ( % : %.c ) 或 defining static pattern rule ( a: % : %.c )。尽管如此,如果出现 a.c文件,似乎与 a: 的空规则相同. IE。 make b只是在没有文件的情况下进行 a存在(并且我们后来尝试访问它失败)。

由于至少一些隐含规则似乎被实现为 suffix rules ,可以禁用对诸如 a.c 之类的输入的考虑通过清除默认列表就足够了:
.SUFFIXES:

或者通过使用 -r 调用 make 来完全禁止使用隐式内置规则。 (或 --no-builtin-rules )选项。然而,这些是相当严厉的,因为它们影响了 Makefile 中所有规则的处理。 .

要在以下位置处理评论:

如前所述,禁用 C 编译的一些内置规则似乎会产生所需的结果,即:
% : %.c
% : %.o

将导致 a.c现在和没有 amake: *** No rule to make target 'a', needed by 'b'. Stop.
但是(如 -r)它具有侵入性,因为在依赖隐式规则的所有其他目标中都会受到影响。同时它也没有那么深远,因为它不包括其他情况,例如 a.C , a.cpp , a,v ,...

静态规则应该能够在适用的情况下替换模式规则(匹配时将更具体的规则应用于更通用的规则)。但实际上将其限制为单个目标基本上与特定的 a: 相提并论。规则。

我实际上不确定树的其余部分是什么样的,以及所有可能的构建步骤都可能发生什么。根据目前的理解,我仍然倾向于使用文件存在检查的显式目标,如果文件名称冲突的可能性和问题。

最新版简单失败规则说明:

@Stein跟进这个话题,他实际上非常有帮助地指出:“建筑”的简单(总是)失败规则 a完全足够。如果存在该名称的文件 ( a ),则目标规则为 a永远不会运行它的配方。对于文件不存在的情况,我们可以有一个失败并显示错误消息的配方。

关于makefile - GNU 制作 : Ensure existence of prerequisite and disable implicit rule search,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54172409/

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