包括自动生成的makefile作为强制执行食谱的技巧

时间:2018-10-15 13:17:53

标签: makefile gnu-make

我在这里慢慢失去理智。首先,让我描述一下我要做什么。我们有一个编译器,可以喷出奇怪格式的依赖文件。为了使这些makefile成为GNU Make可以理解的格式,它们需要首先由Perl脚本处理。从技术上讲,Perl脚本不会对其传递的输入依赖文件进行转换;而是为每个输入的依赖文件创建一个格式正确的新依赖文件。

现在,为了使GNU Make知道哪些翻译单元需要重新编译而哪些不需要,显然,在尝试使翻译单元成为目标之前,它必须已经查看了那些依赖文件,因此在主makefile中有以下行:

include $(PROCESSED_EXISTING_DEPENDENCY_FILES)

其中$(PROCESSED_EXISTING_DEPENDENCY_FILES)是所有已转换的依赖项文件的列表。我的想法是(ab-)使用一个自动生成的makefile,其配方不仅可以构建该makefile,而且可以触发$(PROCESSED_EXISTING_DEPENDENCY_FILES)列表中提到的所有依赖文件的创建,并在包含转换后的依赖文件之前包括该makefile。为了确保进行转换,Make进程的父进程将首先删除自动创建的makefile(我们有一个Perl包装器进程来控制GNU Make)。主makefile中的相关部分如下所示:

# Phony target that creates processed dependency files.
CONVERTED_EXISTING_DEPENDENCY_FILES :
    <recipe here>

$(PRE_CONVERTED_DEPENDENCY_FILE_INCLUSION_HOOK) : CONVERTED_EXISTING_DEPENDENCY_FILES
    $(info $(TARGET_BUILD_MESSAGE_PREFIX) Building $(notdir $@) ...)
    $(file >$@,# Automatically generated makefile that gets included before including the existing, converted dependency files.)
    $(file >>$@,$(DOLLAR)(info Including pre-converted-dependency-files-inclusion hook file ...))
    $(file >>$@,)

include $(PRE_CONVERTED_DEPENDENCY_FILE_INCLUSION_HOOK)
include $(PROCESSED_EXISTING_DEPENDENCY_FILES)

在其他几种情况下,我们已经使用了相同的基本原理,到目前为止,它已经可以很好地工作了,但是由于某些原因,当我尝试这样做时,GNU Make陷入了一个无限循环中,它将不断重新评估主生成文件,包括所有其他生成文件,然后再次返回以重新评估主生成文件。

$(PRE_CONVERTED_DEPENDENCY_FILE_INCLUSION_HOOK)确实已创建,并且如果有任何要转换的依赖文件,它们也将被处理,但是我仍然不知道是什么导致了Make中的无限循环。我们正在Windows 10(64位)系统上为Windows使用GNU Make 4.2.1。

1 个答案:

答案 0 :(得分:0)

我建议您完全重做模型,以避免任何知道如何构建包含文件的方法,而应遵循in this post(基于automake处理依赖关系生成的方式)所述的模型来进行自动依赖关系生成。

然后在后处理步骤中直接将其添加到生成依赖项文件的同一配方中,而不用使用单独的规则来执行此操作。我认为没有必要设置两个单独的规则,因为您确实不希望在此进行中间步骤:您只想生成make prerequisites定义...类似于通常我们没有单独的预处理规则,编译,组装目标文件:即使涉及多个步骤,一条规则也会做到这一点。