如何从makefile中即时创建变量,其值将是另一个数据文件的全部内容。
答案 0 :(得分:58)
假设GNU make:
file := whatever.txt
variable := $(shell cat ${file})
答案 1 :(得分:33)
我猜你想把Makefile中的变量设置为另一个文件的内容:
FILE=test.txt
VARIABLE=`cat $(FILE)`
target:
echo $(VARIABLE)
答案 2 :(得分:14)
GNU make 4.2版支持文件读取操作,因此关于Maxim Egorushkin的好答案,现在有一种可选方法可以解决这个问题:
FILE := test.txt
variable :=$(file < $(FILE))
答案 3 :(得分:11)
cat
在Windows上不存在。适用于Linux和Windows的解决方案:
cat := $(if $(filter $(OS),Windows_NT),type,cat)
variable := $(shell $(cat) filename)
说明:
似乎在On Windows上,始终OS
环境变量定义为等于&#39; Windows_NT&#39;。这样,对于Windows type
命令,使用非Windows cat
。
答案 4 :(得分:6)
自添加$(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
答案 5 :(得分:4)
由于尚未指定平台,因此这是它在Solaris上的工作方式:
VERSION:sh = cat VERSION
all:
echo $(VERSION)
答案 6 :(得分:2)
如果使用的是GNU make,获得此效果的另一种方法是使用另一个makefile的make“ include”:
来自Makefile:
include "./MyFile.mak"
创建一个包含内容的文件“ MyFile.mak”
FILE := "my file content"
FILE += "more content 1"
FILE += "more content 2"
答案 7 :(得分:0)
这是一种更具移植性的解决方案,可与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
指令,该指令专门用于声明多行变量。当然,如果可以显式写入文件内容以供Makefile使用,则可以避免使用shell
和临时文件。
请记住,如果文件中包含$
个符号,MAKE
会在my_variable
扩展时(或在分配时定义)中尝试将它们扩展为变量/指令:=
)。如果要避免这种情况,则需要在包含文件内容之前对它们进行转义。例如,您可以执行以下操作来代替cat
:
$(shell sed 's/\$$/$$$$/g' my_file.txt >> file.tmp)