Makefile 为什么只对简单的shell命令名使用递归变量?

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

我知道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
XGETTEXT = xgettext
MSGFMT = msgfmt
CURL_CONFIG = curl-config
PTHREAD_LIBS = -lpthread
使用递归有什么具体的原因吗 变量比简单变量更重要

是:简单分配的变量是GNU
make
扩展名。传统的
make
没有该功能,POSIX也没有指定该功能。所以

  • 使用普通(“递归”)赋值更便于移植。事实上,它是某些环境中唯一可用的替代方案
  • 使用普通赋值更为传统
  • 使用普通作业就是有多少人学会了做它
  • 主要在默认的
    make
    不是GNU
    make
    的环境中工作的人甚至可能对简单的赋值或其他GNU扩展不感兴趣
  • 另外,

  • 在整个过程中只使用一种形式的赋值可以生成一个更容易理解的makefile,而普通赋值具有一些有用的特性,可能会使makefile作者倾向于选择这种类型

  • 可能还有其他的。

    请注意,即使是GNU自动工具也会生成一些makefiles,这些makefiles避开了直接分配,而倾向于普通分配,尽管它们的作者和维护人员非常了解GNU
    make
    及其特性。我相信这是出于可移植性的目的,因为Autotools努力通过使用可移植代码和构造来最大限度地减少适应构建环境的(实质性)需求。为了完整起见,最新的POSIX标准将提供一个简单的扩展变量变体,使用操作符
    ::=
    ,因为
    :=
    已经在传统的SunOS产品中用于其他方面。然而,由于这是一个全新的功能,它仍然存在可移植性问题。我不知道这一点,@madscitist。作为将来的参考,截至本文撰写之时,POSIX最新发布的版本是2018版,并且没有描述
    :=
    (或
    :=
    )宏定义运算符。我不确定为什么不这样做。该请求于2011年被接受。请注意,
    :=
    不是标准的一部分:它不能被使用,因为它在make的两个竞争版本中已经有很长的历史了。也许在线文档在应用更改时丢失了,或者它被接受了,但实际上从未应用过。如果您已经或有兴趣在Austin Group的bug tracker上创建登录,那么在那里提出一个新问题可能是值得的。如果事实上该变更根本没有被应用,那么尽管有接受该变更的记录,但它(尚未)在POSIX中。