我有一个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
这里的魔力是echo
es的一个变量值的最后一行,如果有一个命令行参数,则该变量的名称在命令行参数中提供。我在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) ...
这很有效,但它可能是一种 hacky 方式。我想知道是否有一种更简单,更优雅的方式来做我想做的事。
我在StackOverflow上遇到过几个类似的问题和答案,但没有找到适用于我的示例的任何内容。如果我已经错过了答案,请指出。
非常感谢!
答案 0 :(得分:3)
您可以在一个文件中定义变量,该文件可以从您的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
当两种语言部分使用相同的语法时,它真的很棒吗?
答案 1 :(得分:1)
不确定它是否不那么hacky,但你可以“创建”一个可以包含在Makefile中的文件。在运行时。像这样:
$(shell grep '=' vars.sh > /tmp/vars.tmp)
include /tmp/vars.tmp
$(shell rm /tmp/vars.tmp)
用更健全的东西替换第一行。
答案 2 :(得分:1)
通常认为构建系统依赖于环境变量的做法很糟糕,因为如果它们确实存在重复性问题,那么输出不仅取决于命令行,还取决于环境变量的状态。
警告过您,所有环境变量都可以在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语法,因此您可以在include set-vars.sh
中执行Makefile
。