从Makefile到Bash的变量

3
我有一个这样的情况:
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文件。

4个回答

4
动态创建 Makefile 文件,加载 test.mk 文件并输出变量的值:
value=$(make -f - 2>/dev/null <<\EOF
include test.mk
all:
    @echo $(test_var)
EOF
)

echo "The value is $value"

3

如果您无法使用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-variable安全值的_进行替换,这就是搜索替换正在做的事情。

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的较少知道的功能 - 使用多个-f选项从命令行读取多个Makefile


这是最一致的答案,因为make相当复杂,解析起来很困难,而像二次扩展之类的机制可能会导致不良结果。但我想强调选择一个足够独特的目标名称的重要性,与@Idelic的答案相反。 - edupo

2
在您的makefile中创建一个名为print_var的规则,并使用以下代码:
print_var:
        echo $(test_var)

在你的test.sh文件中,执行以下操作:

 $test_var = $(make print_var)

你还需要考虑将print_var规则放在.PHONY部分。

我无法编辑Makefile,我已经编辑了我的帖子,抱歉我忘记写关于它的内容。 - Laser
@Pepelac 那么你就需要解析你的 makefile。 - banuj
你确定这只是单向的吗? - Laser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接