繁体   English   中英

从bash脚本读取makefile变量

[英]reading makefile variables from bash script

我有一个makefile ,其中我试图设置一些我写过的bash脚本中已经存在的变量: set-vars.sh (它只包含变量名和值)。

我在其他几个bash脚本中使用了这些变量。 我还需要能够在我的makefile使用它们。

经过大量研究并试图找出在makefilebash脚本设置变量的最佳方法是什么,我找到了一种makefile的方法。 如下:

set-vars.sh

# set vars
foo=FOO1
bar=BAR1
baz=BAZ1

# if a command line arg is given (e.g. foo) 
# echo value command line arg (e.g. echo $foo)

if ! [ -z ${1+x} ]; then echo ${!1}; fi

魔术是最后一行,它echo一个变量的值,如果有命令行参数,该变量的名称在命令行参数中提供。 我在makefile调用此脚本,并提供变量名称,并使用echo ed值设置makefile变量。

Makefile

.PHONY:  target1 target2 target3

export foo = $(shell sh set-vars.sh foo)

target1:
    @echo $(foo)

# ... other targets which reference $(foo) ...

这行得通,但是这可能是一种不明智的做法。 我想知道是否有更简单,更优雅的方式来完成我想做的事情。

我在StackOverflow上遇到了几个类似的问题和答案,但没有发现任何适用于我的示例的内容。 如果我已经错过了答案,请指出。

非常感谢!

您可以在一个文件中定义变量,该文件可以从您的Shell脚本获取并包含在您的Makefile中:

$ cat vardef.txt
foo=FOO1
bar=BAR1
baz=BAZ1
$ cat set-vars.sh
source ./vardef.txt
echo "$foo $bar $baz"
$ sh ./set-vars.sh
FOO1 BAR1 BAZ1
$ cat Makefile
include vardef.txt
all:
    @echo "$(foo) $(bar) $(baz)"
$ make
FOO1 BAR1 BAZ1

当两种语言部分使用相同的语法时,这不是很好吗?

不知道它是否不太hacky,但是您可以“创建”一个可以包含在Makefile中的文件。 在运行时。 像这样:

$(shell grep '=' vars.sh > /tmp/vars.tmp)
include /tmp/vars.tmp
$(shell rm /tmp/vars.tmp)

将第一行替换为更合理的名称。

构建系统依赖于环境变量通常被认为是较差的做法,因为如果输出系统不仅依赖于命令行而且依赖于环境变量的状态,那么如果您突然依赖环境变量,那么您会突然遇到可再现性问题。

警告您之后,所有环境变量都可以在make中访问,例如:

user := ${USER} # ${USER} comes from the environment.
all :
    @echo ${user}

换句话说,有一个脚本来设置环境变量并调用make

#!/bin/bash
export foo=FOO1
export bar=BAR1
export baz=BAZ1
exec make "$@"

另外,您可以使用仅带有export foo=FOO1语句的shell脚本。 事实证明这是有效的makefile语法,因此您可以在Makefile include set-vars.sh

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM