The thing is when I was writing a Makefile for my project, when I needed to detect the current branch name, in a make rule I did this :
check_branch:
if [ "$(git rev-parse --abbrev-ref HEAD)" == "master" ]; then \
echo "In master"
else \
echo "Not in master"; \
fi
When I called make check_branch, the "$(git rev-parse --abbrev-ref HEAD)" didn't work, it returned "" empty string. But instead when I changed $() to ` `, it worked perfectly.
check_branch:
if [ "`git rev-parse --abbrev-ref HEAD`" == "master" ]; then \
echo "In master"
else \
echo "Not in master"; \
fi
Why is $() not working but `` did? Only for the "git" command.
Note that in my Makefile, I used $() normally in many rules.
Thanks :)
In shell lines, you write shell commands as you would in a shell script. That's why the second operation works.
If you want Make to evaluate git command outside of the shell, you can enclose the operation in a shell function, as in:
$(shell git rev-parse --abbrev-ref HEAD)
And you ought to be good to go, though I often implement this kind of thing as:
branch := $(shell git rev-parse --abbrev-ref HEAD)
target:dep
mkdir -p build/$(branch)
Or something along those lines.
Inside recipes you have to escape dollar signs in order to get them interpreted by the shell. Otherwise, Make treats $(git ...)
as a built-in command or a variable and tries to evaluate it (of course, unsuccessfully).
check_branch: if [ "$$(git rev-parse --abbrev-ref HEAD)" == "master" ]; then \ ...
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With