在Makefile中使用bash变量

在Makefile中使用bash变量,bash,makefile,environment-variables,timing,Bash,Makefile,Environment Variables,Timing,我想在我的makefile中使用bash定时变量 例如,在我的终端我可以这样做,它的工作 MY_TIME=$SECONDS echo $MY_TIME 但是当我在makefile上写这个时,它就不起作用了 如何在make文件中使用这两行 这就是我正在做的 .PHONY: myProg myProg: MY_TIME=$SECONDS echo $MY_TIME 在Etan Reisner的回答之后 这就是我现在拥有的 .PHONY: myProg myPro

我想在我的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

但是我的echo结果是一个空行,它看起来不像是在存储日期,默认情况下make使用
/bin/sh
作为执行配方行的shell

大概
/bin/sh
不支持
SECONDS
变量

通过给
shell
变量赋值(即
shell:=/bin/bash
),可以告诉make使用不同的shell

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

所以要做你想做的事情,你需要把这两行都写在一行上,或者在换行符上继续这一行

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

也就是说,您几乎肯定最好不要这样做,而是使用在配方开始/结束时调用的
date
,或者直接在要计时的命令上调用的
time

.PHONY: myProg
myProg:
      date
      # Do something
      date

我知道上面的工作原理,就像在我自己的makefile中一样(程序名和对象名被更改以保护无辜者)


变量引用可以在任何上下文中使用:目标、依赖项、命令、大多数指令和新变量值。下面是一个常见情况的示例,其中变量包含程序中所有对象文件的名称:

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

美元符号(
$MY_TIME
)表示make变量,与bash变量不同

要访问bash变量,必须使用双美元符号(
$$MY\u TIME
)对美元进行转义

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

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

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

你把它放在你的makefile里的什么地方?这显然不是一个有效的make变量。如果您将make-up设置为使用
bash
作为shell(而不是默认的
/bin/sh
),它可能会在配方中起作用。每一行都在一个单独的shell中运行,所以不。@EtanReisner我该怎么做?我更新了我的问题。
my_TIME=date
正在运行带有名为
my_TIME
的环境变量的
date
命令,该变量包含一个空字符串。您需要
MY_TIME=$(date)
MY_TIME
变量中捕获
date
的输出。是否有方法将日期的输出存储在变量中以供以后使用?仅适用于事物的行延续版本。或者如果您有足够新的make版本并选择使用。显然,您还可以使用
$(eval LOL:=$(shell echo$$RANDOM))
设置
make
变量(启动时秒数始终为0,因此秒数毫无意义)。在下一行,您可以
echo$(LOL)
写出值。@如果在正常的make上下文中,其他人不需要
$(eval…
。不过,在宏和配方行中都需要它。是的,
SECONDS
在任何非连续场景中几乎都是无用的。您的第一个示例对我来说不适用<代码>$make which stag MYVAR=stag;echo YVAR YVAR这与所问的问题无关,甚至没有试图解决它。
.PHONY: myProg
myProg:
      time some_command
PROGRAM_NAME = myLittleProgram

...

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

$(objects) : defs.h
.PHONY: myProg
myProg:
  MY_TIME=$$SECONDS ; echo $$MY_TIME
.PHONY: myProg
myProg:      # WRONG
  MY_TIME=$$SECONDS
  echo $$MY_TIME