在 Makefile 中使用 bash 个变量

Using bash variables in Makefile

我想在我的 makefile 中使用 bash 时间变量 例如在我的终端我可以这样做并且它有效

 MY_TIME=$SECONDS 
 echo $MY_TIME

但是当我在我的 makefile 上写这个时它不起作用

如何在我的 make 文件中使用这两行?

这就是我正在做的事情

.PHONY: myProg
myProg:
      MY_TIME=$SECONDS 
      echo $MY_TIME

在 Etan Reisner 的回答之后

这就是我现在拥有的

.PHONY: myProg
 myProg:
        MY_TIME= date; echo $MY_TIME

但是我的回显结果是一个空行,它看起来不像是在存储日期

默认情况下,make 使用 /bin/sh 作为执行配方行的 shell。

推测 /bin/sh 不支持 SECONDS 变量。

您可以通过为 SHELL 变量(即 SHELL := /bin/bash)赋值来告诉 make 使用不同的 shell。

这样做将使 SECONDS 可用,但仍然不允许您在配方行之间携带变量值,因为每个配方行在其自己的 shell 中是 运行。

因此,要执行您想要的操作,您需要将这两行都写在一行上,或者在换行符上继续该行。

.PHONY: myProg
myProg:
      MY_TIME=$SECONDS; echo $MY_TIME

.PHONY: myProg
myProg:
      MY_TIME=$SECONDS; \
      echo $MY_TIME

话虽这么说,你几乎可以肯定 这样做会更好,而是使用在食谱的 start/end 处调用的 date 之类的东西,或者time 调用 on 命令直接计时。

.PHONY: myProg
myProg:
      date
      # Do something
      date

.PHONY: myProg
myProg:
      time some_command
PROGRAM_NAME = myLittleProgram

...

$(PROGRAM_NAME) : myLittleProgram.o

我知道上面的工作原理,因为它在我自己的 makefile 中(更改了程序名称和对象名称以保护无辜者)。


"Variable references can be used in any context: targets, dependencies, commands, most directives, and new variable values. Here is an example of a common case, where a variable holds the names of all the object files in a program:"

objects = program.o foo.o utils.o
program : $(objects)
    cc -o program $(objects)

$(objects) : defs.h

http://web.mit.edu/gnu/doc/html/make_6.html

美元符号($MY_TIME)指的是make变量,与bash变量[=28]不同=].

要访问 bash 变量,您必须使用双美元符号 ($$MY_TIME) 转义美元。

.PHONY: myProg
myProg:
  MY_TIME=$$SECONDS ; echo $$MY_TIME

中所述,您不能将代码拆分为多行(除非您使用反斜杠),因为每个命令都在不同的子 shell 中执行,使得变量无法访问其他线路。

在下面的示例中,SECONDS 的值将始终为 0,因为它会被第二行的 shell 的生成重置。

.PHONY: myProg
myProg:      # WRONG
  MY_TIME=$$SECONDS
  echo $$MY_TIME