Makefile 如果生成所需的include过程已通过,但文件未实际创建,如何使make失败

Makefile 如果生成所需的include过程已通过,但文件未实际创建,如何使make失败,makefile,Makefile,我有一个makefile,它错误地生成了所需的makefile include文件。包含的文件最初不存在,但有一条规则可以创建它。该规则成功运行,但由于一个bug,所需的include文件没有在预期的位置创建(因此make无法包含它)。但是,make并没有失败(由于文件仍然无法包含),而是成功完成 下面是我的makefile1.mak文件 include myfile.mak default: @echo hi myfile.mak: @echo hello 当我执行'ma

我有一个makefile,它错误地生成了所需的makefile include文件。包含的文件最初不存在,但有一条规则可以创建它。该规则成功运行,但由于一个bug,所需的include文件没有在预期的位置创建(因此make无法包含它)。但是,make并没有失败(由于文件仍然无法包含),而是成功完成

下面是我的makefile1.mak文件

include myfile.mak

default:
    @echo hi

myfile.mak:
    @echo hello
当我执行'make-f makefile1.mak'时,我得到:

makefile1.mak:1: myfile.mak: No such file or directory
hello
hi
当然,我最终发现生成myfile.mak的代码没有正确生成它,但我使用的实际makefile有100行长,因此我们没有注意到包含已经有一段时间没有发生了(这是一个非常微妙的构建问题)


因此,我的问题是-有没有办法让上面的示例中的make失败?

在规则中添加一行:

myfile.mak:
    do various things to build myfile.mak
    test -f $@

尽管创建文件失败,您的规则如何成功?修复规则可能是更好的攻击方式,因为如果生成规则失败,则丢失的包含只是一个错误:“只有在尝试重新生成生成文件并失败后,才会将丢失的生成文件诊断为致命错误。”这适用于所有目标(不仅包括文件)通过设计-如果配方成功,则盲目地“相信”目标成功创建。如果这可能是一个问题,您应该手动检查目标是否存在,正如@Beta所建议的那样。@Matt,感谢您指出这是出于设计,尽管对于includes来说这似乎是一个不好的行为。也就是说,如果我不使用“-include”,我会告诉make必须包含该文件,因此如果即使在假定重建后也无法包含该包含文件,则make应该无法继续(因为我告诉它必须包含一个它无法包含的文件)。话虽如此,我明白make就是这样,我必须接受它。@JohnKugelman,谢谢你的回复。然而,我的观点是,我不知道配方不正确,构建继续进行。如果我知道配方不正确,我会更正它:-)。正如我在上面的评论中提到的,如果我知道配方不正确,我会首先正确地编写配方:-)。在我看来,向每个目标添加“测试”是不必要的。@Brett:每个目标?我不知道你想要什么。如果在我的构建过程中,我有100个不同的配方用于构建100个不同的makefile include目标,我需要在makefile include的100个不同目标中的每一个中进行检查。然而,在我看来,如果我告诉make包含一个给定的文件(并且使用“-”语法不忽略该文件是否存在),如果它不能包含我告诉它不要静默包含的文件,那么它应该失败。我希望这更有意义。@Brett:有一种方法可以在不向这些规则中添加命令的情况下获得你想要的效果,但据我所知,没有办法让Make按照你认为应该的方式行事。