Makefileをソースコードの処理以外にも活用する

文:Vincent Danen(TechRepublic) 翻訳校正:石橋啓一郎
2009-07-07 08:00:00
  • このエントリーをはてなブックマークに追加

 makeコマンドは、一般にプログラマ以外にはあまり意識されていない。伝統的に、makeとこのコマンドと結びつきの強いMakefileは、ソースコードと一緒に使われ、ソースコードのコンパイルとリンクを行い実行ファイルを作成する作業を簡単にするために使われている。しかし、makeコマンドはソースコードを処理する以外にも、多くの使い方ができる。

 Makefileは、ターゲットとなるファイルの依存関係に応じて実行されるコマンドの羅列以上のものではない。たとえば、「make install」を実行すると、makeコマンドはまず、必要とされるターゲットが最新のものであるかどうかをチェックする。つまり、「compile」ターゲットや、そのファイルが依存関係にあるファイルなどをチェックするということだ。このことによって、「make」は多様な使い方のできるコマンドになっている。またこれは、ソースコード以外のファイルについてもmakeを使用することができることを意味している。たとえば、makeを使ってファイルをコピーさせたり(ローカルでも、リモートでも)、バージョンコントロールをさせたり、ファイルを削除させたりといったことのほか、ファイルの処理に関するあらゆる便利なコマンドを実行させることができる。

 たとえばMakefileを使って、ローカルにあるウェブファイルを、バージョンコントロールレポジトリから取り出して、遠隔サーバにコピーするということもできる。以下に、このような動作を行うMakefileの例を示す。

SVNURL = https://svn.repository.com/svn/website/trunk

REMOTEHOST = user@host:~/public_html/

ifdef REV

REVISION = -r$(REV)

endif

all: dist

clean:

       rm -rf website

       rm -f website.tar.gz

checkout:

       svn co $(SVNURL) $(REVISION) website

dist: clean checkout

       tar czf website.tar.gz website

       rsync -avP -e ssh website/* $(REMOTEHOST)

 正しいMakefileでは、ターゲットに属するコマンドの部分は、タブ文字を使ってインデントさせる必要があることに注意すること。空白文字を使うと、「make」がエラーを出す。上記のMakefileでは、手順1つで(「make」を実行すれば、ターゲットにはデフォルトである「all」が使われる)、現在あるディレクトリを削除し(website/ディレクトリと、ウェブサイトのファイルがアーカイブされている古いtar.gzファイルを削除する)、次にsubversionからコードをチェックアウトし(このコードのURIは$(SVNURL)変数で定義されている)、その後リモートサーバに、このアーカイブファイルの内容をrsyncコマンドを使って同期させる。

 ifdefの定義により、make REV=600というコマンドを使えば、subversionのレポジトリからリビジョン600のファイルをチェックアウトさせることもできる(この場合、subversionのコマンドに-r600というスイッチが引き渡される)。これによって、素早く簡単に変更を元に戻したり、過去の特定の時点のスナップショットを使うこともできる。1つ気をつける必要があるのは、makeはゼロ以外の終了コードをトラップするということだ。つまり、実行しているコマンドがゼロ以外の終了コードを返した場合、makeは終了して問題のコマンドの戻り値を返す。もしゼロ以外の戻り値があった場合でも、makeコマンドの実行を続けさせたければ、次のようなやり方をすればよい。

       ps xyz || echo ""

       cat foo

 上記の例では、ps xyzは常にゼロ以外の値を返す。これは、xyzが正しいコマンドオプションではないためだ。ここでは、その戻り値を「||」というコンストラクトを使ってトラップしている(これは、このコンストラクトより前のコマンドが正常終了しない場合、シェルが後ろのコマンドを実行することを意味している)。この場合、正常終了しなかったコマンドの出力がスクリーンに表示されるが、makeはこのエラーによって止まってしまうことはなく、次のコマンドの処理に進む。

 「make」コマンドとMakefileは、ソースコードのコンパイル以外にも便利に使える。本来はコンパイルのために作られたものかも知れないが、それ以外にも多くの使い道があるのだ。シェルスクリプトを書くよりも便利かと言えば、それはニーズによりけりだ。ただ、「make」は厳密なコードチェックを行っているが、シェルスクリプトでは行っていない(自分で行わない限り)ということは、一部の状況では非常に重要になるかも知れない。

この記事は海外CBS Interactive発の記事をシーネットネットワークスジャパン編集部が日本向けに編集したものです。 原文へ

このサイトでは、利用状況の把握や広告配信などのために、Cookieなどを使用してアクセスデータを取得・利用しています。 これ以降ページを遷移した場合、Cookieなどの設定や使用に同意したことになります。
Cookieなどの設定や使用の詳細、オプトアウトについては詳細をご覧ください。
[ 閉じる ]