この記事は 一分で読める小ネタのカレンダー | Advent Calendar 2023 - Qiita の13日目
make
- make (UNIX) - Wikipedia
- プログラムのビルドツールと説明されているが、要は指定したラベルに含まれるコマンドを実行してくれるだけ
- Wikipedia にも記載があるとおり、複数の実装と、複数の関連(代替)ツールがある
- 好きなビルドツールを使えばいいと思うけど、一番手軽で情報も多い make は比較的簡単
- リポジトリトップでだけ使えるエイリアスとして使い始めると勉強にもってこい
本文はここまで。以下は時間外w
Makefile
- 昨日の記事に書いた fortune で遊んでいたら、
f 100% jp_xxx
みたいなことができているはず - これを shell alias ではなく make ターゲットにする(
make jp_xxx
のようにする。make を m で alias していればm jp_xxx
にできる)
Makefile
# 最初のタスクが make のデフォルトになる
# default ターゲットをダミーで書いて、後ろに実行するターゲットを書けば並びを気にしなくていい
default: list
# list all targets
# see https://stackoverflow.com/questions/4219255/how-do-you-get-the-list-of-targets-in-a-makefile/26339924#26339924
list:
@LC_ALL=C $(MAKE) -pRrq -f $(firstword $(MAKEFILE_LIST)) : 2>/dev/null | awk -v RS= -F: '/(^|\n)# Files(\n|$$)/,/(^|\n)# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' | sort | grep -E -v -e '^[^[:alnum:]]' -e '^$@$$'
# ターゲットと同名のファイルやディレクトリがあると make できないのでダミーターゲットとしておくことで回避できる
.PHONY: default list jp_xxx
# 本題の fortune を実行するターゲット
jp_xxx:
@fortune 100% jp_xxx
- このまま使えるので
jp_xxx
だけ合わせればOK -
alias m="make"
しておくと楽。これは dotfiles で管理して常に使えるようにしておくといい -
m
デフォルトでは Makefile の先頭のターゲットdefault
を呼び出すのでlist
ターゲットが実行される -
m
とm default
とm list
の結果は同じになるということ -
m jp_xxx
でfortune 100% jp_xxx
が実行される(先頭の@
は実行コマンドを出力しない)
やってみよう
- ターゲットを増やしてできることを増やす
- 他の fortune のファイルを呼べるようにする。用途に応じて
m launch
やm books
のようにする -
fortune/build.sh
を実行できるようにして、たくさん作ってもすぐ試せるようにする(実務での使い方はまさにこれ) - my-til に日記を書いていたら、make を使ってテンプレートを出力させてみよう
- 同じく日記を書いていたら、日記を add,commit,push する(その間に pre-commit が入る)ようにしてみよう
- よく使うものを default ターゲットで指定して、
m
で実行できるようにする
その後
- 先にも書いたとおり、make は代替ツールがたくさんある
- 方言(別実装)はともかく、代替ツールを知るのは大事
- 言語毎にそれなりにビルドツールが存在していて、make ではなくそちらを使うのが業務では一般的
- 特にフロントエンド界隈では毎年のように流行りが変わるので、リポジトリによってツールが変わるのもザラ
- そこで make からそれらツールを呼べるようにすれば、どのリポジトリでも自分の中では
m
で済む - もっとも、フロント界隈だと IDE から実行させてコマンドを直接叩くことも少ないけど
- チームやリポジトリによって違うコマンドを使うけど、make によって自分の中では同じコマンドで処理できる、ようにできると副業とか多数の業務を抱える時とかも楽できる(かもね)
改善依頼
- フロント界隈でフレームワークビルドをラップして make を使っている例(リポジトリ)
- make でこんな処理しているぜ、とか