我一起使用两种编程语言。编译器使用第一种语言(源语言)编写程序,并将它们翻译成第二种语言(目标语言,对我来说,C语言)。这种方式生成了一些文件,也是手工编写的文件。最后,我将所有这些文件(目标语言)编译成可执行代码。
我设法为源语言生成自动依赖文件(经典命名的.d文件),告诉Makefile(我使用GNU Makefile)以及何时调用第一个编译器。 (顺序对于这个编译器很重要。)我也知道如何为目标语言生成依赖项(使用GCC)。我使用include指令自动包含所有依赖项。 Makefile将找到调用哪个规则来生成依赖文件并包含它们。
Makefile分三个阶段进行。首先,它包括已经生成的所有内容。其次,如果可能,它会生成缺失的包含。第三,它试图建立目标。
现在,为了自动生成目标语言的依赖项,我首先需要使用第一个编译器生成所有文件(因为包含了一些生成的头文件)。
问题出在第二阶段:当Makefile想要为目标代码生成依赖文件时,它将首先尝试从源代码生成此目标代码。但是,即使它已经生成了源代码的依赖关系,它也没有加载这些依赖关系(依赖关系只会在这个阶段结束时读取)。因此它将无法编译源代码,因为它通常取决于编译顺序。
有没有办法解决这个问题?可以指示Makefile在生成后立即包含生成的依赖项吗?有没有办法改变" 3阶段" Makefile的行为?
答案 0 :(得分:0)
假设您使用目标语言的文件是foo.c
,这是从foo.x
生成的。您对foo.c
的依赖项位于文件foo.d
中。假设foo.x
的依赖关系位于foo.xd
。
如果您运行make foo.c
,则表明您有一个用于构建或重建foo.d
的规则,该规则显示在foo.d
本身或主makefile中。看起来foo.d
取决于foo.xd
,它还不存在(或foo.d
取决于foo.c
,这取决于foo.xd
。)如果我理解正确,foo.xd
由于某种原因无法构建(与make
正在处理makefile的顺序有关)。
您可以使用不依赖于foo.d
的其他方式构建foo.xd
。它可以单独依赖foo.c
吗?
我不确定这个问题有多相关,但值得注意的是,第一次构建文件时不需要依赖文件 - 如果它不存在,则必须建立它的依赖并不重要。