Makefile语法:$(RM)是什么意思?

18

我在网上看到了以下Makefile文件 (这里):

hello:

clean:
    $(RM) hello

当Makefile文件夹中有hello.c文件时,在终端中运行make命令会构建名为hello的可执行文件。运行make clean时,hello可执行文件将被rm -f hello删除。因此,在这里$(RM) hello的意思是rm -f hello

  • $(FOO)是Makefile的特殊语法,用来表示变量。它可以被赋值,并且在Makefile中使用,但不能作为Bash命令直接运行。
  • $(RM)是Makefile中的默认变量,用于表示应该使用哪个命令来删除文件。您可以自己定义其他变量,但是要确保它们与系统中已安装的命令不冲突。

$() 是在 make 中的变量扩展。 - 123
3个回答

25

这是一个Makefile变量。有显式变量(在Makefile内定义)和隐含变量(由make定义,你可以覆盖)。

你可以使用此标志查看隐含变量列表:

make -p

一些最常见的变量可以在此处找到:10.3 Variables Used by Implicit Rules

您可以使用语法$(NAME)${NAME}来扩展变量。


10

$(RM) 是一个“make”变量的引用(或 POSIX 术语中的)。它们有两种语法风格,具有相同的语义:$(NAME)${NAME}(还有一些不需要括号的单字母宏,例如 $a)。

POSIX 规定许多变量(或者说)有默认值:

MAKE=make
AR=ar
ARFLAGS=-rv
YACC=yacc
YFLAGS=
LEX=lex
LFLAGS=
LDFLAGS=
CC=c99
CFLAGS=-O 1
FC=fort77
FFLAGS=-O 1
GET=get
GFLAGS=
SCCSFLAGS=
SCCSGETFLAGS=-s

有趣的是,RM不是其中之一。 在您的make实现中,RM变量的默认值显然是rm -f(并且您的make默认运行在非POSIX模式下)。

请注意,尽管$(PWD)具有与shell命令替换相同的语法(${PWD}与shell参数相同),但它们是完全不同的东西。回答您的问题,不,您不能指望将$(PWD)作为“make”宏来运行pwd实用程序或展开为当前工作目录。未定义的宏将扩展为一个空字符串,即使没有“make”引起任何关注。


谢谢Jens的回答!什么是非POSIX模式?我的make运行在其他模式下吗,因为它在我使用的macOS上运行? - Keita
@Keita 我所知道的所有"make"都不会默认以POSIX模式运行。总是有大量非POSIX特性可用。对于POSIX模式,POSIX规范要求您在makefile顶部附近需要一个名为.POSIX:的特殊目标。 - Jens

2
这是一个 Makefile 变量。之前在你的环境中,你可能使用了 RM="rm -f" 的语法(取决于 shell 或者是否在 Makefile 中),现在你只需要执行它即可。
你可以运行 pwd 命令,但如果要使用 $(PWD),你需要设置 PWD="pwd"

感谢kabanus回答我的问题!我会阅读您在此提供的链接中的文档中的变量章节,以了解更多关于制作变量的内容。 - Keita

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接