2008/02/19
Make を有効活用する
以前、一つのファイルに複数のサブコマンドを記述して定型作業を楽にする方法を書きましたが [1] 、今回はそれをもう少し一般化してみたいと思います。
[1] | http://dev.ariel-networks.com/Members/matsuyama/s |
やりたい事
Makefile:
updatedb: cd ~/ && updatedb cd ~/music && updatedb sync: unison -ui text default
上のような Makefile をホームディレクトリあたりに置いて、定型作業を楽にしている人は結構いると思いますが、 make の仕様により、以下のようなことができません。
Makefile:
say: echo "$(ARGS)" # コマンドライン引数を echo
% make say hello make: *** No rule to make target `hello'. Stop.
make の引数には実行したいターゲットを書くので、 hello ターゲットがないというエラーになるのは当然のことなのですが、引数に指定された文字列で音楽ファイルの検索を行い再生する以下のようなターゲットが書けないのは結構残念です。
Makefile:
play: cd ~/music && locate -0 -r --regextype=egrep "$(ARGS).*\.(mp3|ogg|flac)$$" | xargs -0 -n 1 mplayer
% make play The Beatles # これを動かしたい
ラッパースクリプト
もうほとんど十八番ですが、ラッパースクリプトを書いて対処します。本エントリに添付されているスクリプトをダウンロードして ~/bin あたりにインストールしてください。
% type make # インストールされているかチェック /home/tomo/bin/make
このラッパースクリプトは実行対象の Makefile に #pragma args というコメントがファイル上部に記述されている場合にコマンドライン引数の変換を行います。
% cat Makefile #pragma args say: echo "$(ARGS)" % make say hello to him # => /usr/bin/make ARG1=hello ARG2=to ARG3=him ARGS='hello to him' say
渡された引数を取るには $(ARGn) あるいは $(ARGS) を使います。
また、このラッパースクリプトは、 -f オプションで Makefile が指定されていない場合に、ディレクトリを上に辿って Makefile を検索し、 -f オプションを自動補完します
% ls Makefile Makefile % cd tmp % ls Makefile ls: cannot access Makefile: No such file or directory % make # => make -f ../Makefile
この機能は flymake などを使う場合に便利です。
Make your life better with make!
- Category(s)
- linux
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/matsuyama/use-make/tbping