在我正在阅读的makefile中,有许多对变量projdir
的引用,在调用make的shell脚本中定义和导出; makefile中有许多$(projdir)
个实例。
在http://www.gnu.org/software/make/manual/make.html#Reference的make手册中,只有两种类型的变量:递归扩展变量和简单扩展变量。似乎projdir
不是一个。
问题1:由于makefile有效,因此makefile可以访问父shell环境中定义的shell变量。为什么没有记录(或者我没有找到正确的文档)?
问题2:与问题1无关,我在第6.2节中看到了行all:;echo $(foo)
。为什么这里需要分号;
?
答案 0 :(得分:2)
问题1.环境变量自动变为make
个变量。这在section 6.10:
make中的变量可以来自运行make的环境。在启动时查看的每个环境变量都将转换为具有相同名称和值的make变量。
问题2:在规则名称和可选的先决条件之后放置分号可以让您在同一行上启动配方。这在section 4.2:
中有解释第一个配方行可能出现在先决条件之后的行上,带有制表符,或者可能出现在同一行,带有分号。
为简洁起见,他们在6.2中的示例中使用了这种语法,因此他们可以在句子中显示内联的整个规则;我认为它在实践中很少使用。
答案 1 :(得分:1)
来自make
manual:
make
中的变量可以来自运行make
的环境。make
启动时看到的每个环境变量都会转换为具有相同名称和值的make变量。
至于你的第二个问题:
为什么这里需要分号
;
?
如果没有分号,:
的右侧将指定依赖项列表。分号终止该(空)列表。
答案 2 :(得分:1)
变量 flavor
和origin
。
扩展类型为flavor
。
make包含flavor
function,可用于查找相关变量的类型。它将返回undefined
,recursive
或simple
中的一个。
变量也有一个origin
,这是它们的价值来源。你在这里看到的是其中一个可能的起源。
origin
function将告诉您变量的来源。
有七种可能的来源:undefined
,default
,environment
,environment override
,file
,command line
,override
和automatic
。
因此,您的projdir
变量的flavor
simple
和origin
environment
。