2015/10/12

コンパイル以外で使うMakefile

おっさんなのでMakefileが好きです。好きな理由としては`make`がキーボードで打ちやすい点、`make`というコマンド名がシンプルで美しい点が特に気に入っています。

とは言え、僕はC言語で何かを書く機会は殆ど無くなり、今やコンパイルの手順や依存関係の記述には使わなくなりました。しかし、C言語を書かないからといって`make`が無用の長物である事はなく、寧ろいつも実行する作業(コマンドとか)の自動化という点で役に立つ場面があります。


手書きのMakefile

Makefileと言っても、`configure`を実行してMakefile.am, Makefile.inから作られる複雑で長大なMakefileではなく、僕が使っているのは手書きのMakefileです。Vimとか手に馴染んだエディタで数行〜数十行程度の、よく使うコマンドやよく実行する作業、あるいはたまにしか実行しないけど引数がわりと長くて覚えてないコマンドを定型処理としてMakefileに書いておくという使い方です。

Makefileなので、Makefileが置いてあるディレクトリ・ディレクトリにあるファイルに特化した処理を書いています。

うちのMakefileを紹介

~/Makefile

ここは然程たいした事は書いてなくて、SSHの公開鍵をマクロで指定したサーバにばらまいたり、GPGの鍵一覧を出力したり、Ansibleで失敗したPlaybookの残骸(*.retry)を掃除したりするぐらいです。


~/.ssh/Makefile

ここは~/Makefileから呼ばれる公開鍵を指定したサーバにばらまくターゲットに`known_hosts`の整理整頓をするターゲット、それとknown_hostsに書いてあるホスト一覧を出力するターゲットを書いています。

SSHREMOTEHOSTマクロに公開鍵を登録したいホスト名を入れて`make deploy-publickey`を実行すると手元にある公開鍵を纏めて転送先の`.ssh/authorized_keys`に書き込みます。手元にある公開鍵が、普段使っているMacの鍵、踏み台にするサーバの鍵、iPhoneのSSHアプリで使う鍵とそこそこの量があるので`make`を使うと楽になるようにしています。
% make SSHREMOTEHOST=192.0.2.222 deploy-publickey
cd .ssh && /usr/bin/make SSHREMOTEHOST=konoe deploy-publickey
cat public-key-ring | ssh -42 192.0.2.222 \
  "mkdir -p -m 0700 .ssh && cat > .ssh/authorized_keys && chmod 600 .ssh/authorized_keys"
Host key fingerprint is cf:b6:d1:22:55:22:18:6e:38:3a:22:60:66:9d:7a:22

どこか/リポジトリ/Makefile

GitHubとリモートリポジトリに`make push`で纏めて`git push`できるターゲットを書いています。他には`make clean`で掃除をするターゲットやそのリポジトリ特有のターゲットがあります。`make`だけで実行されるターゲットとして`git-status`は、リポジトリでは圧倒的な高頻度で実行する`git status`のラッパーとして登録しています。

`make`だけ実行するとMakefileの一番最初に書いたターゲットが実行されるので、よく使うターゲットを一番上に書いても良いのですが、`.DEFAULT_GOAL`ってマクロにターゲット名を書くと、そのターゲットがデフォルトで実行されるターゲットになります。

このあたりはaliasでもgit-nekoみたいなサブコマンドを作っても良いと思いますが、`git`コマンド自体リポジトリの中でしか実行しないのでMakefileでも充分というか合理的な気がします。

Vagrantの置き場/Makefile

`vagrant`コマンドのラッパー的なターゲットとして、`make up`, `make down`とか、それと仮想マシンを捨てるターゲットとかを書いています。依存する物にVagrantfileを指定していたり、`make login`あるいは`make`だけで起動している仮想マシンにSSHでログイン出来るようにしています。

Vagrantを多少便利に使うMakefileについては「AnsibleとServerspecでインベントリファイルを共通化した」でも少し触れています。

Makefileを書くのに参考になるサイト

Rakefile

エンジニアであれば普段使いする端末には必ず`make`が入っているのでディレクトリ指向な処理はMakefileを書くだけで良いって利点はあります。しかし条件分岐とかタスクの内容が複雑になってくると読みにくい代物が出来上がってしまい、保守性が極端に悪くなるって不利点もあります。

なので、今からこういったディレクトリ位置に依存する処理を書く、且つ、Rubyに慣れているならRakefileで書いたほうが楽やと思います。あるいはPerlに慣れている人ならDaikuも良い選択肢かもしれません。

なにより`rake -T`でターゲットの一覧が表示されるのが便利ですし、次の行に続くコマンドをバックスラッシュで繋いだりしなくても良いですし、変数を$$Xって書かなくても良いですし。

0 件のコメント:

コメントを投稿