在makefile

时间:2017-01-12 09:17:51

标签: bash variables makefile buildroot

我正在尝试创建一个文件并将文件的内容设置为变量,但该变量始终被视为空。

一个例子:

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时文件是什么样的,这不是我想要的......

1 个答案:

答案 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存在之前进行评估,如果它在制作时尚未存在。