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

Sri*_*ath 61 makefile

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

Max*_*kin 68

假设GNU make:

file := whatever.txt
variable := $(shell cat ${file})
Run Code Online (Sandbox Code Playgroud)

  • Gnu make既不是标准也不比solaris制造更便携."热门"是你的话.如果我们认真考虑可移植性和标准构造,请坚持使用posix. (6认同)
  • @ceving使用标准的GNU make.Solaris make是一个非便携式应用程序. (4认同)
  • 在这种情况下我会选择“流行”——非 GNU Make 太原始了。如果您的目标是继续支持 20 世纪 90 年代的操作系统,那么 @bb- Generation 的答案可能就是您所需要的(尽管在很多情况下它会给您带来麻烦)。在所有其他情况下,GNU Make 要么很容易获得,要么(更有可能)是默认的,所以请使用它。 (3认同)
  • GNU make 可以在任何地方运行,所以它比任何其他 make 都更便携。“标准”可以是主观的、理所当然的。 (3认同)

bb-*_*ion 39

我猜你想在你的Makefile中设置一个变量到另一个文件的内容:

FILE=test.txt
VARIABLE=`cat $(FILE)`

target:
    echo $(VARIABLE)
Run Code Online (Sandbox Code Playgroud)

  • 这是一个错误的答案.`VARIABLE`的值是一个字符串``cat $(FILE)``(引号中),它只在shell中的配方中展开.尝试打印它的值,如`$(info $ {VARIABLE})`. (22认同)
  • 实际上,我不能将VARIABLE定义放在首位:因为在all:target中运行某些命令之前,PATH_TO_MY_DATA_FILE不存在.作为替代方案,我所做的是我将事物分成两个makefile(创建一个子品牌)并在sub-make的顶部声明VARIABLE,它现在就像一个魅力. (3认同)
  • @MaximEgorushkin没错.你只需要考虑`VARIABLE`作为承诺.这是唯一适用于旧版本`make`的版本.`:=`和`$(shell ...)`都是GNU扩展. (3认同)
  • 不赞成投票。每次执行规则时,都会执行“ cat”。通常不打算这样做,应该警告它,因为它很慢。此外,如果文件是管道,则具有意外的副作用。分配应使用`:=`,以便在替换变量时而不是在定义变量时不评估规则。替换值应为$(shell cat $(FILE)),以便使cat命令在本地执行,而不是稍后在配方规则中执行。 (2认同)
  • @antred ,make 是标准 UNIX/POSIX 工具集的一部分,其中还包括 cat。如果您安装 make 安装所有其他基本工具是正常的,并且在极少数情况下会导致任何困难。依靠 `cat` 而不是复杂的替代规则将使你的 makefile 更容易理解,并且几乎是可移植的,有时甚至更可移植。 (2认同)

小智 20

GNU make 4.2支持文件读取操作,因此就Maxim Egorushkin的优秀答案而言,现在有一种可选方法可以解决这个问题:

FILE     := test.txt
variable :=$(file < $(FILE))
Run Code Online (Sandbox Code Playgroud)

  • 在文件包含换行符并且您希望保留它们的情况下,这优于“shell cat”答案 (2认同)

Pav*_*l P 12

cat在Windows上不存在.适用于Linux和Windows的解决方案:

cat := $(if $(filter $(OS),Windows_NT),type,cat)
variable := $(shell $(cat) filename)
Run Code Online (Sandbox Code Playgroud)

说明:似乎在Windows上,总是将OS环境变量定义为等于'Windows_NT'.这样,对于Windows type命令,使用非Windows cat.


gat*_*ich 9

$(file op filename)添加以来,简单得多:

VARIABLE = $(file < my_file.txt)
Run Code Online (Sandbox Code Playgroud)

此处的手册页:https : //www.gnu.org/software/make/manual/html_node/File-Function.html#index-file_002c-reading-from

  • 这是在GNU Make 4中引入的,而macOS在2019年仍随附3.81 :-( (2认同)