Gnu-Make无法包含makefile

时间:2015-09-21 09:10:39

标签: c shell makefile gnu-make

来自docs

  

include指令告诉make暂停读取当前内容   makefile并在继续之前读取一个或多个其他makefile。该   指令是makefile中的一行,如下所示:

 include FILENAMES...
     

FILENAMES可以包含shell文件名模式。


<小时/>

现在,给出一个Makefile:

# we define 'include' from the command-line.
ifdef include


# We create the included Makefile
$(shell echo 'all : ;' >makefile.include)

# And we include it.
# The docs say: "FILENAMES can contain shell file name patterns."
include *.include


else


endif

正在运行,我们得到:

$ rm -rf makefile.include && make include=1
makefile:6: *.include: No such file or directory


那么,这里发生了什么?我们显然有:

  • 在以下位置创建了要包含的Makefile:

    $(shell echo 'all : ;' >makefile.include)
    
  • 后来包含了这个makefile,因为我们可以使用“shell文件名模式”,如文档中引用的那样 - 因此,我们在makefile中有:

    include *.include
    

那么,为什么Gnu-Make未能找到这个新创建的makefile?

1 个答案:

答案 0 :(得分:7)

您面临的问题不是包含,而是执行顺序。

make不是一种过程语言,而是一个声明性语言,因此执行顺序有时会有点棘手。

在您的特定情况下,make将在第一遍中解析整个Makefile,包括include语句,从而导致错误的Makefile,因为还没有makefile.include。< / p>

然后然后执行shell命令来创建makefile.include(但同样为时已晚:包含将在之前发生)。

第二轮make将正确地包含makefile.include

注意:

对于直接使用include *.includeinclude $(wildcard *.include)的情况都是如此,但只有前者会导致错误(因为后者会将*.include扩展为空集,然后才会(不)被包括在内,而前者将尝试包括文字*.include - 类似于shell上的迷路cat *.nonexistent