从bash脚本读取makefile变量

tam*_*jd1 2 linux variables bash shell makefile

makefile在其中尝试设置一些已存在于我编写的 bash 脚本中的变量,该脚本称为 :(set-vars.sh它仅包含变量名称和值)。

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

经过大量研究,并试图弄清楚什么是从设置变量的最佳方式的bash脚本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
Run Code Online (Sandbox Code Playgroud)

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

Makefile

.PHONY:  target1 target2 target3

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

target1:
    @echo $(foo)

# ... other targets which reference $(foo) ...
Run Code Online (Sandbox Code Playgroud)

这有效,但它可能是一种hacky方式。我想知道是否有一种更简单、更优雅的方式来做我想做的事情。

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

非常感谢!

Ren*_*let 6

您可以在一个文件中定义您的变量,该文件可以来自您的 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
Run Code Online (Sandbox Code Playgroud)

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