我有下一个情况:
test.mk 来源:
test_var := test_me
test.sh 来源:
$test_var = some method that get test_var from .mk
if [ "$test_var" = "test_me" ] ; then
do something
fi
如何在没有grep + sed
和其他解析技术的情况下将变量从.mk
文件获取到我的.sh
文件。
编辑
我无法更改.mk
file
动态创建一个生成文件以加载test.mk
文件并打印变量:
value=$(make -f - 2>/dev/null <<EOF
include test.mk
all:
@echo $(test_var)
EOF
)
echo "The value is $value"
如果您不能使用 sed
或 grep
,那么您必须在解析后读取 makefile 数据库:
make -pn -f test.mk > /tmp/make.db.txt 2>/dev/null
while read var assign value; do
if [[ ${var} = 'test_var' ]] && [[ ${assign} = ':=' ]]; then
test_var="$value"
break
fi
done </tmp/make.db.txt
rm -f /tmp/make.db.txt
这样可以确保类似以下内容:
value := 12345
test_var := ${value}
将输出12345
,而不是${value}
如果要创建表示 makefile 中所有变量的变量,可以将内部 if 更改为:
if [[ ${assign} = ':=' ]]; then
# any variables containing . are replaced with _
eval ${var//./_}="$value"
fi
因此,您将获得设置为适当值的变量test_var
。有一些 make 变量以 .
开头,需要用像 _
这样的 shell 变量安全值替换,这就是搜索替换正在做的事情。
代码在生成文件中创建一个规则print_var
:
print_var:
echo $(test_var)
在你的test.sh
,做:
$test_var = $(make print_var)
您还必须考虑将print_var
规则放在.PHONY
部分中
前段时间自己想@Idelic答案的变体:
function get_make_var()
{
echo 'unique123:;@echo ${'"$1"'}' |
make -f - -f "$2" --no-print-directory unique123
}
test_var=`get_make_var test_var test.mk`
它使用了GNU make鲜为人知的特性 - 能够使用多个-f
选项从命令行读取多个Makefile
。