【问题标题】:Set newly created file as variable in makefile在makefile中将新创建的文件设置为变量
【发布时间】:2017-01-12 09:17:51
【问题描述】:

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

一个例子:

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

【问题讨论】:

标签: bash variables makefile buildroot


【解决方案1】:

你不清楚 GNU make 做了什么,什么时候,以及 shell 做了什么, 以及何时执行配方。

$(...) 形式的 makefile 中的任何内容都由 make 评估 除非它在 ​​shell 命令中转义为 $$(...)

一个 shell 命令,除非在 make-function $(shell ...) 的上下文中或 反引号只能是配方中的命令:

target: [prerequisite...]
    command
    ...

组成配方的命令按顺序执行,每个命令都有不同的 shell,执行配方。

未转义形式$(...) 中的任何内容都不是命令序列中的命令 配方的扩展,除非它是您定义的变量或宏的扩展,扩展为命令。

目标范围内的行不必是命令或扩展为命令。它 也可能包含一个扩展为空的$(...) 表达式, 并简单地指示make 做某事,例如

$(info ...)

扩展为空并告诉make 在标准输出上打印...

$(eval ...)

扩展为空并告诉make 评估...

这个食谱只有两个命令,而不是四个:

target: prereq...
    $(eval TARGET=$@)
    command1
    $(info $(TARGET))
    command2

配方范围内的任何 make-expressions $(...) 都在 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-expressions 在 之前 运行目标的命令。

你的 FILE_VAR 宏显然是为了在配方范围内扩展,因为第一行是一个 shell 命令。 因此,如果剩余的行依赖于 运行第一行的效果。他们都没有这样做。剩下的 3 行 在2.txt 存在之前进行评估,如果它在生成时不存在。

【讨论】:

  • 谢谢迈克,很好的回答。以前从未使用过make,所以它非常有用。我主要从 ti 那里得到解决我的问题的是 Make 在我希望它们之前评估表达式,所以应该通过 shell 来做所有事情。这也是为什么如果我的文件在生成时确实存在并且被更改,我正在读取文件中的旧值。
  • 是的。在扩展普通的全局 make-variables 和宏之后,创建一个 shell 命令或扩展为 shell 命令的行几乎总是正确的。 $(eval ...) 在配方中可用的情况并不常见。请参阅How make Reads a Makefile 并在一般情况下咨询manual 以获得指导。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-22
  • 2015-02-01
  • 2013-10-28
  • 1970-01-01
  • 2011-06-11
相关资源
最近更新 更多