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

时间:2016-12-01 09:52:55

标签: c bash macos unix makefile

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

hello:

clean:
    $(RM) hello

当与Makefile在同一目录中存在hello.c文件时,终端构建make可执行文件中的hello命令。运行make clean后,hello会删除rm -f hello可执行文件。因此,$(RM) hello在此处表示rm -f hello

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

3 个答案:

答案 0 :(得分:7)

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

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

make -p

一些最常见的变量可以在10.3 Variables Used by Implicit Rules

找到

您可以按$(NAME)${NAME}

扩展变量

答案 1 :(得分:6)

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

POSIX specifies许多变量,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

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

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

答案 2 :(得分:1)

这是一个make文件variable。以前或在你的环境中你有task printVersions{ print "Version code is $project.android.defaultConfig.versionCode" } 语法,具体取决于shell或者它是否在make本身,现在你只是执行。

您可以运行RM="rm -f",但要使用pwd,您需要设置$(PWD)