Overview
Makefile は1行単位でシェルコマンドで起動されるけど、このシェルを変更したいときとかあるじゃないですか。
具体的には
デフォルトだと /bin/sh
なので、 source
が使えないので bash に差し替えたいときとか。
それ自体は Makefile の SHELL
変数に使いたいシェルを指定してあげれば実現できます。
cf. https://qiita.com/nassy20/items/3183cc17f36a3f21e333
a:
@ echo ${SHELL}
@ echo $${BASH_VERSION}
@ echo $${ZSH_VERSION}
$ make
/bin/sh
3.2.57(1)-release
$ make SHELL=/bin/bash
/bin/bash
3.2.57(1)-release
$ make SHELL=/bin/zsh
/bin/zsh
5.7.1
自前のシェルを使いたい
で、内部的にはたぶん ${SHELL} -c "指定されたコマンド"
が実行されてるんですねこれ。
cf. https://stackoverflow.com/questions/40203215/customize-shell-in-makefile-set-shell-my-shell-sh
なので
上記の stackoverflow のコメントにある通り、
# !/bin/bash
shift # `-c` を除外
echo "自前のシェルだよ"
eval $*
$ chmod +x my.sh
SHELL := ./my.sh
a:
@ echo "make target だよ"
とかやると、
$ make
自前のシェルだよ
make target だよ
とかできちゃうわけです。
pipenv
でもできちゃう
もはやネタの範疇なので、役に立つかというと微妙だけどw
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[packages]
requests = "*"
[dev-packages]
[requires]
python_version = "3.9"
# !/bin/bash
shift
eval pipenv run $*
SHELL := ./pipenv.sh
a:
pip freeze
python -V
pip show requests
$ make
certifi==2021.5.30
charset-normalizer==2.0.4
idna==3.2
requests==2.26.0
urllib3==1.26.6
-------------
Python 3.9.6
-------------
Name: requests
Version: 2.26.0
Summary: Python HTTP for Humans.
Home-page: https://requests.readthedocs.io
Author: Kenneth Reitz
Author-email: me@kennethreitz.org
License: Apache 2.0
Location: /Users/kuryu/workspace/check/pipevn/foo/bar/.venv/lib/python3.9/site-packages
Requires: urllib3, certifi, charset-normalizer, idna
Required-by:
毎回 pipenv run
で起動するのでまぁまぁ遅いです。
pipenv shell
で起動した中で全部実行できれば理想的なんだけどねぇ。
っていう話。
ちなみに
↑の話は Makefile の中だけで全部完結できないかなー?って調べてたのが発端なので、
pipenv shell
で起動した中で全部実行
するだけなら普通に
$ pipenv run make
でできます。