Makefile 为什么只对简单的shell命令名使用递归变量?
我知道makefile中简单变量和递归变量之间的区别。Makefile 为什么只对简单的shell命令名使用递归变量?,makefile,gnu-make,Makefile,Gnu Make,我知道makefile中简单变量和递归变量之间的区别。 我见过许多makefiles(包括linux内核),它们使用递归变量作为简单的shell命令名。 我认为在这种情况下使用简单变量就足够了。 但大多数使用递归变量。 使用递归变量是否有比使用简单变量更具体的原因 CC = cc AR = ar RM = rm -f DIFF = diff TAR = tar FIND = find INSTALL = install TCL_PATH = tclsh TCLTK_PATH = wish XGE
我见过许多makefiles(包括linux内核),它们使用递归变量作为简单的shell命令名。
我认为在这种情况下使用简单变量就足够了。
但大多数使用递归变量。
使用递归变量是否有比使用简单变量更具体的原因
CC = cc
AR = ar
RM = rm -f
DIFF = diff
TAR = tar
FIND = find
INSTALL = install
TCL_PATH = tclsh
TCLTK_PATH = wish
XGETTEXT = xgettext
MSGFMT = msgfmt
CURL_CONFIG = curl-config
PTHREAD_LIBS = -lpthread
使用递归有什么具体的原因吗
变量比简单变量更重要
是:简单分配的变量是GNUmake
扩展名。传统的make
没有该功能,POSIX也没有指定该功能。所以
make
不是GNUmake
的环境中工作的人甚至可能对简单的赋值或其他GNU扩展不感兴趣可能还有其他的。请注意,即使是GNU自动工具也会生成一些makefiles,这些makefiles避开了直接分配,而倾向于普通分配,尽管它们的作者和维护人员非常了解GNU
make
及其特性。我相信这是出于可移植性的目的,因为Autotools努力通过使用可移植代码和构造来最大限度地减少适应构建环境的(实质性)需求。为了完整起见,最新的POSIX标准将提供一个简单的扩展变量变体,使用操作符::=
,因为:=
已经在传统的SunOS产品中用于其他方面。然而,由于这是一个全新的功能,它仍然存在可移植性问题。我不知道这一点,@madscitist。作为将来的参考,截至本文撰写之时,POSIX最新发布的版本是2018版,并且没有描述:=
(或:=
)宏定义运算符。我不确定为什么不这样做。该请求于2011年被接受。请注意,:=
不是标准的一部分:它不能被使用,因为它在make的两个竞争版本中已经有很长的历史了。也许在线文档在应用更改时丢失了,或者它被接受了,但实际上从未应用过。如果您已经或有兴趣在Austin Group的bug tracker上创建登录,那么在那里提出一个新问题可能是值得的。如果事实上该变更根本没有被应用,那么尽管有接受该变更的记录,但它(尚未)在POSIX中。