Makefile上でGitHubのPull Request URLからPull Request Numberを取り出す方法

たとえばCIRCLE_PULL_REQUESTという環境変数にフルのGitHub Pull Requestの URLが入っているとする。具体的にはこんな感じ:

export CIRCLE_PULL_REQUEST=https://github.com/octocat/Spoon-Knife/issues/1
echo $CIRCLE_PULL_REQUEST
# https://github.com/octocat/Spoon-Knife/issues/1

この変数からpullreq-numberを取り出すのは、通常のシェルではカンタンに実現できる:

echo ${CIRCLE_PULL_REQUEST##*/}
# 1

しかしMakefile上では事前に変数が展開されてしまうため、以下のようなファイルを用意し:

SHELL:=/bin/sh

test:
        echo blam! && \
                echo ${CIRCLE_PULL_REQUEST##*/} && \
                echo 'done.'

実行すると:

make test
# echo blam! && \
#      echo  && \
#      echo 'done.'
# blam!
# 
# done.

うまくいかないのである。


すなわちescapeすればよい:

SHELL:=/bin/sh

test:
        echo blam! && \
                echo $${CIRCLE_PULL_REQUEST##*/} && \
                echo 'done.'

diff

5c5
<       echo ${CIRCLE_PULL_REQUEST##*/} && \
---
>        echo $${CIRCLE_PULL_REQUEST##*/} && \

これでうまくいく。

make test
# echo blam! && \
#      echo ${CIRCLE_PULL_REQUEST##*/} && \
#      echo 'done.'
# blam!
# 1
# done.

変数に収めたい時はこうするとよい:

SHELL:=/bin/sh
CIRCLE_PR_NUMBER?=$(shell echo $${CIRCLE_PULL_REQUEST\#\#*/})

test:
        echo blam! && \
                echo ${CIRCLE_PR_NUMBER} && \
                echo 'done.'
make test
# echo blam! && \
#      echo 1 && \
#      echo 'done.'
# blam!
# 1
# done.