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

Kei*_*ita 8 c unix macos bash makefile

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

hello:

clean:
    $(RM) hello
Run Code Online (Sandbox Code Playgroud)

当与Makefile在同一目录中存在hello.c文件时make,终端构建hello可执行文件中的命令.当make clean运行时,hello可执行被删除rm -f hello,而不是.所以,$(RM) hellorm -f hello在这里.

  • $(FOO)是什么意思?它是Makefile的特殊语法,还是bash命令?
  • 我可以运行其他命令以及$(RM),例如$(PWD)吗?

Dan*_*anh 8

这是一个Makefile变量.有显式变量(在Makefile中定义)或隐式变量(由make定义,可以由你覆盖).

隐式变量列表可以通过以下方式找到:

make -p
Run Code Online (Sandbox Code Playgroud)

一些最常见的变量可以在以下位置找到:10.3隐式规则使用的变量

您可以通过$(NAME)或扩展变量${NAME}


Jen*_*ens 7

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

POSIX指定许多变量,errrrr,,以具有默认值:

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
Run Code Online (Sandbox Code Playgroud)

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

请注意,虽然它$(PWD)具有与shell命令替换相同的语法(和${PWD}shell参数相同),但它们完全不同.要回答您的问题,不,您不能指望$(PWD)作为"make"宏来运行该pwd实用程序或扩展到当前工作目录.一个未定义的宏将扩展为一个空字符串,而"make"甚至不会抬起眉毛.