我运行 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
可以直接解析的格式,然后进行简化-include
。make
将知道生成它并在完成后自动重新运行。您可以在生成当前文件的规则中进行转换,或添加单独的规则以生成不同的文件。
例如,将其放入Makefile
:
-include datafile
all:
echo VAR is $(VAR)
datafile: Makefile
echo "VAR=value" > $@
第一次运行时make
,您将看到生成的命令datafile
。如果你使用,make -d
你会看到一行,上面写着Re-executing[1]: make -d
which is wheremake
再次运行并能够读取datafile
.
如果运行make
一次datafile
存在,则它只运行一次。但因为它有依赖关系Makefile
,如果您编辑它以更改value
为其他字符串,datafile
将正确重新生成。