在 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
我想在我的 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
如
在下面的示例中,SECONDS
的值将始终为 0
,因为它会被第二行的 shell 的生成重置。
.PHONY: myProg
myProg: # WRONG
MY_TIME=$$SECONDS
echo $$MY_TIME