来自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?
答案 0 :(得分:7)
您面临的问题不是包含,而是执行顺序。
make
不是一种过程语言,而是一个声明性语言,因此执行顺序有时会有点棘手。
在您的特定情况下,make
将在第一遍中解析整个Makefile,包括include
语句,从而导致错误的Makefile,因为还没有makefile.include
。< / p>
然后然后执行shell
命令来创建makefile.include
(但同样为时已晚:包含将在之前发生)。
第二轮make
将正确地包含makefile.include
。
对于直接使用include *.include
和include $(wildcard *.include)
的情况都是如此,但只有前者会导致错误(因为后者会将*.include
扩展为空集,然后才会(不)被包括在内,而前者将尝试包括文字*.include
- 类似于shell上的迷路cat *.nonexistent
。