从生成文件到 bash 的变量



我有下一个情况:
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"
好吧,

如果您不能使用 sedgrep ,那么您必须在解析后读取 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

相关内容

  • 没有找到相关文章

最新更新