我正在尝试创建一个文件并将文件的内容设置为变量,但该变量始终被视为空。
一个例子:
define FILE_VAR
cat /output/1.txt >> /output/2.txt
$(eval s := $(shell cat /output/2.txt))
$(eval FILENAME_BIN=$(word 1, $(s)).$(word 2, $(s)).$(word 3, $(s)).bin)
$(eval FILENAME_JFFS2=$(word 1, $(s)).$(word 2, $(s)).$(word 3, $(s)).jffs2)
endef
如果在运行此之前存在2.txt
,则变量将在运行make之前设置为数据(而不是新的重定向数据),如果2.txt
不存在则变量不是组。看起来它正在评估首次运行make时文件是什么样的,这不是我想要的......
答案 0 :(得分:2)
你不清楚GNU make做了什么,以及什么时候以及shell做了什么, 何时执行食谱。
$(...)
评估表格make
的makefile中的任何位置
除非它在shell命令中以$$(...)
转义。
shell命令,除非在make-function $(shell ...)
或的上下文中
反向标记只能是食谱中的命令:
target: [prerequisite...]
command
...
组成配方的命令按顺序执行,每个命令都是不同的 shell,执行配方。
未转义形式$(...)
中的任何内容都不是命令序列中的命令
除非是你已经定义了扩展到命令的变量或宏的扩展,否则它会被添加到配方中。
目标范围内的一行不必是命令或扩展为命令。它
也可能由一个$(...)
表达式扩展为空,
并简单地指示make
做某事,例如
$(info ...)
展开为空,并告诉make
在标准输出上打印...
。
$(eval ...)
展开为空,并告诉make
评估...
这个食谱只有两个命令,而不是四个:
target: prereq...
$(eval TARGET=$@)
command1
$(info $(TARGET))
command2
评估配方范围内的任何make表达式$(...)
当make决定运行配方并且命令序列是什么时,序列
在他们全部被评估后离开。然后
命令序列运行。例如:
<强>生成文件强>
target:
echo Hello > hello.txt
$(info Begin {)
$(eval s := $(shell cat hello.txt))
$(eval WORD=$(word 1, $(s)))
$(info [$(WORD)])
$(info } End)
运行:
$ make
Begin {
cat: hello.txt: No such file or directory
[]
} End
echo Hello > hello.txt
观察所有的make表达式在之前进行评估 目标的命令运行。
您的FILE_VAR
宏明显打算在配方范围内扩展,因为第一行是shell命令。
因此,剩余的行必须通过shell命令实现其目的如果它们依赖于
运行第一行的效果。他们都没有这样做。剩下的3行
在2.txt
存在之前进行评估,如果它在制作时尚未存在。