在 make 文件中使用 eval

在 make 文件中使用 eval

我运行 buildroot make 并在此构建过程中创建一个文本文件。发生这种情况后,另一个 make 作为构建的一部分运行。我想将生成的文件的内容读入变量并使用它们。这不起作用,因为在我的 buildroot make 开始时它认为该文件不存在,因此即使它是在代码运行之前生成的,make 也已经确定它不存在。

读取的文件格式:

  str1 str2 1.1.0_nightlybuild (1389:1497M@trunk)

我正在尝试使用 eval (这应该在运行时检查文件内容)。然而问题仍然存在,我似乎无法在创建文件后读取该文件。看来 make 可能正在扩展变量,因此 eval 不起作用。

没有从文件内容中设置任何变量。我检查并且文件已正确生成,因此如果我再次运行 make,当文件已生成时,一切正常。 eval 不是执行此操作的正确方法吗?

因此该文件在 make 开始时并不存在,但随后就存在了,然后运行以下代码:

define EXAMPLE
    $(eval s := $(shell cat output/target/version.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)
    mv $(BINARIES_DIR)/$(BOOTIMAGE) $(BINARIES_DIR)/$(FILENAME_BIN)
    mv $(BINARIES_DIR)/$(JFFS2IMAGE) $(BINARIES_DIR)/$(FILENAME_JFFS2)
endef

它不起作用,文件已生成,后续构建将起作用,只是不是第一个在进程开始时文件不存在的构建。第一次只是简单地调用文件...bin,并且...jffs2从文件中读取的变量不会被填充。当它工作时,文件被调用str1.str2.1.1.0_nightlybuild.bin str1.str2. 1.1.0_nightlybuild.jffs2

这是真实的用例 makefilehttp://pastebin.com/6GdKcUg6TEST_DEFAULT_RENAME 是我尝试读取文件的位置,我正在使用 buildroot (因此有很多 make 文件),当我在 buildroot 过程中点击 make 时, version.txt 会一路创建,然后此代码尝试读取此文件但除非在 buildroot 目录中输入 make 之前存在 version.text,否则它不起作用。正如你所看到的,我通过 cat 在其他地方使用 version.txt 但效果很好。

答案1

最好的解决方案是将文件的格式更改为make可以直接解析的格式,然后进行简化-includemake将知道生成它并在完成后自动重新运行。您可以在生成当前文件的规则中进行转换,或添加单独的规则以生成不同的文件。

例如,将其放入Makefile

-include datafile

all: 
    echo VAR is $(VAR)

datafile: Makefile
    echo "VAR=value" > $@

第一次运行时make,您将看到生成的命令datafile。如果你使用,make -d你会看到一行,上面写着Re-executing[1]: make -dwhich is wheremake再次运行并能够读取datafile.

如果运行make一次datafile存在,则它只运行一次。但因为它有依赖关系Makefile,如果您编辑它以更改value为其他字符串,datafile将正确重新生成。

相关内容