Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Variables from makefile to bash

I have next situation:
source of test.mk:

test_var := test_me

source of test.sh:

$test_var = some method that get test_var from .mk
if [ "$test_var" = "test_me" ] ; then    
   do something
fi

How can I get variable from .mk file to my .sh file, without grep + sed and other parsing techniques.

EDIT
I can't change .mk file

like image 328
Laser Avatar asked Jun 03 '26 18:06

Laser


2 Answers

Create a makefile on the fly to load the test.mk file and print the variable:

value=$(make -f - 2>/dev/null <<\EOF
include test.mk
all:
    @echo $(test_var)
EOF
)

echo "The value is $value"
like image 63
Idelic Avatar answered Jun 06 '26 07:06

Idelic


Well if you can't use sed or grep, then you'll have to read the makefile database after parsing using something like:

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

this makes sure that something like:

value := 12345
test_var := ${value}

will output 12345, instead of ${value}

If you wanted to create variables representing all those from the makefile, you can change the inner if to:

if [[ ${assign} = ':=' ]]; then
    # any variables containing . are replaced with _
    eval ${var//./_}=\"$value\"
fi

so you will get variables like test_var set to the appropriate value. There are some make variables that start with ., which would need to be replaced with a shell-variable safe value like _, which is what the search-replace is doing.

like image 42
Petesh Avatar answered Jun 06 '26 08:06

Petesh



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!