通过读取另一个文件的内容在makefile中创建一个变量

时间:2011-07-20 19:32:55

标签: makefile

如何从makefile中即时创建变量,其值将是另一个数据文件的全部内容。

8 个答案:

答案 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)