在Makefile中使用bash变量
我想在我的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
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