我有下一个情况:
来源 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
如何在没有.mk
和其他解析技术的情况下从.sh
文件到我的grep + sed
文件变量。
修改
我无法更改.mk
文件
答案 0 :(得分:3)
如果您不能使用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变量安全值,如_
,这是搜索替换正在进行的操作。
答案 1 :(得分:3)
动态创建一个makefile以加载test.mk
文件并打印变量:
value=$(make -f - 2>/dev/null <<\EOF
include test.mk
all:
@echo $(test_var)
EOF
)
echo "The value is $value"
答案 2 :(得分:2)
使用以下代码在makefile中创建规则print_var
:
print_var:
echo $(test_var)
在test.sh
中,请执行:
$test_var = $(make print_var)
您还必须考虑将print_var
部分放在.PHONY
部分
答案 3 :(得分:2)
@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-ability的鲜为人知的功能,使用多个Makefile
选项从命令行读取多个-f
。