如何从makefile即时创建变量,其值将是另一个数据文件的全部内容。
Answers:
我猜想您想在Makefile中将一个变量设置为另一个文件的内容:
FILE=test.txt
VARIABLE=`cat $(FILE)`
target:
echo $(VARIABLE)
VARIABLE
是一个字符串cat $(FILE)
(用引号引起来),仅在外壳程序的配方中进行扩展。尝试像一样打印它的值$(info ${VARIABLE})
。
VARIABLE
一个诺言。这是与旧版本兼容的唯一版本make
。这两个:=
和$(shell ...)
是GNU扩展。
cat
每次执行规则时执行。通常不打算这样做,应该警告它,因为它很慢。此外,如果文件是管道,则具有意外的副作用。分配应为with,:=
以便在替换变量时而不是在定义变量时不会评估规则。替换值应该是$(shell cat $(FILE))
这样,以便cat
命令可以通过make就地执行,而不是稍后由配方规则执行。
cat
而不是复杂的替代规则将使您的makefile更加易于理解,并且几乎可以移植,有时甚至可以移植。
假设GNU make:
file := whatever.txt
variable := $(shell cat ${file})
GNU make 4.2版支持文件读取操作,因此对于Maxim Egorushkin的一个很好的答案,现在有一种解决此问题的可选方法:
FILE := test.txt
variable :=$(file < $(FILE))
自$(file op filename)
添加以来,简单得多:
VARIABLE = $(file < my_file.txt)
此处的手册页:https : //www.gnu.org/software/make/manual/html_node/File-Function.html#index-file_002c-reading-from
如果您使用的是GNU make,则获得此效果的另一种方法是使用另一个makefile的make“ include”:
从Makefile:
include "./MyFile.mak"
创建一个包含内容的文件“ MyFile.mak”:
FILE := "my file content"
FILE += "more content 1"
FILE += "more content 2"
Makefile:1: "./MyFile.mak": No such file or directory
make -v
给出GNU Make 3.81
include ./MyFile
这是一种更可移植的解决方案,可与MAKE
版本3一起使用,该版本的file
指令不可用。缺点是它需要在该过程中创建一个临时文件。
$(shell echo define my_variable > file.tmp)
$(shell cat my_file.txt >> file.tmp)
$(shell echo endef >> file.tmp)
include file.tmp
主要思想是使用define
伪指令,该伪指令专门用于声明多行变量。当然,shell
如果可以显式写入文件内容以供Makefile使用,则可以避免使用和使用临时文件。
请记住,如果您的文件包含 $
符号,MAKE
则在扩展时my_variable
(或使用定义时:=
),将尝试将它们扩展为变量/伪指令。如果要避免这种情况,则需要在包含文件内容之前对它们进行转义。例如,cat
您可以执行以下操作:
$(shell sed 's/\$$/$$$$/g' my_file.txt >> file.tmp)