Personal tools
You are here: Home ブログ matsuyama Make を有効活用する
Document Actions

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!


make make
Size 1.5 kB - File type application/octet-stream
Category(s)
linux
The URL to Trackback this entry is:
http://dev.ariel-networks.com/Members/matsuyama/use-make/tbping
Add comment

You can add a comment by filling out the form below. Plain text formatting.

(Required)
(Required)
(Required)
(Required)
(Required)
This helps us prevent automated spamming.
Captcha Image


Copyright(C) 2001 - 2006 Ariel Networks, Inc. All rights reserved.