从makefile到bash的变量

时间:2012-12-18 07:51:30

标签: bash shell makefile

我有下一个情况:
来源 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文件

4 个答案:

答案 0 :(得分: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变量安全值,如_,这是搜索替换正在进行的操作。

答案 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