make的模式规则如何区分调用者?
How make's Pattern-rules distinguish callers?
我正在阅读dist section of Makefile。
它包含我不知道的语法:
http://www.gnu.org/software/make/manual/make.html#Pattern-Rules
为什么要使用像“%-operation: echo ...”这样的规则? "all-recursive"、"clean-recursive"、"install-recursive"、"uninstall-recursive"、"distcheck-recursive" - 它们都匹配规则 %-递归,
我不明白 % 规则在这些不同情况下的工作方式有何不同
我不确定我是否理解你的问题:不是很清楚。
但是,我认为您要问的是,如果同一规则用于一系列目标(匹配 %
模式字符),那么您如何知道真正的目标是什么?
这是使用 automatic variables 完成的。这些在任何规则中都有助于减少拼写错误并使食谱更易于阅读,但它们最初是为在隐式规则中使用而创建的,它们在那里绝对是必不可少的。
在模式规则的配方中,$@
变量将扩展为正在构建的目标的名称,$<
将扩展为第一个先决条件,$*
将扩展到与模式匹配的目标部分。所以对于这样的规则:
%-foo : %-bar
echo $@ / $< / $*
当 make 构建目标 blah-foo
时,输出将是:
blah-foo / blah-bar / blah
我正在阅读dist section of Makefile。
它包含我不知道的语法: http://www.gnu.org/software/make/manual/make.html#Pattern-Rules
为什么要使用像“%-operation: echo ...”这样的规则? "all-recursive"、"clean-recursive"、"install-recursive"、"uninstall-recursive"、"distcheck-recursive" - 它们都匹配规则 %-递归,
我不明白 % 规则在这些不同情况下的工作方式有何不同
我不确定我是否理解你的问题:不是很清楚。
但是,我认为您要问的是,如果同一规则用于一系列目标(匹配 %
模式字符),那么您如何知道真正的目标是什么?
这是使用 automatic variables 完成的。这些在任何规则中都有助于减少拼写错误并使食谱更易于阅读,但它们最初是为在隐式规则中使用而创建的,它们在那里绝对是必不可少的。
在模式规则的配方中,$@
变量将扩展为正在构建的目标的名称,$<
将扩展为第一个先决条件,$*
将扩展到与模式匹配的目标部分。所以对于这样的规则:
%-foo : %-bar
echo $@ / $< / $*
当 make 构建目标 blah-foo
时,输出将是:
blah-foo / blah-bar / blah