如何从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)