「Erlang実験室:makeによるビルド」で、ErlangアプリケーションをビルドするMakefileを紹介しました。わずかに手直ししたので、修正差分と補足の説明をします。
目的/前提とenv.mk
まず、このMakefileの目的は、複数のアプリケーション/複数の開発者で単一のMakefileを修正しないで使えるようにすることです。複数のアプリケーション/複数の開発者は同一のリビジョン管理システム(リポジトリ・サーバー)を使っている前提です。以下、$LOCAL_DEVをローカル開発ディレクトリ、$REMOTE_DEVをリモートの共有ディレクトリとします。$APPはアプリケーション名(ディレクトリ名でもある)です。
ローカルでは、$LOCAL_DEV/$APP/がアプリケーション開発ディレクトリになります。もちろん、ローカルの環境の違いはあるわけで、それはenv.mkというファイルで吸収します。env.mkを$LOCAL_DEV/$APP/env.mkに置くと、$REMOTE_DEV/$APP/env.mk にコミットされてしまい具合が悪いですね。$LOCAL_DEV/$APP/env.mkをリビジョン管理から外すか、$LOCAL_DEV/env.mkに置いてください。
カスタマイズ用ファイル
以前、カスタマイズをするファイルがいくつもありましたが、集約しました。
ファイル | 定義/上書きする変数 |
---|---|
$APP/vsn.mk | FOO_VSN(アプリケーション名をfooとして) |
$APP/app.mk | APP_NAMEなど |
$APP/src/specific.mk | SOURCES, NOT_SOURCESなど |
どれも必須ではなく、デフォルトを変更したいときだけ作ったり編集したりします。
overview.edocは自動的に確認
Makefileのなかで、$APP/doc/overview.edocの存在を検出し、危険性を知らせるようにしました。
specific.mkの書き方
specific.mk内で、変数SOURCES, NOT_SOURCES, INCLUDES, NOT_INCLUDESを設定します。ただし、若干の注意が必要です。
ではだめで、$(SRC_DIR)/を前置する必要があります。
SOURCES:=foo.erl bar.erl baz.erl
SOURCES:=$(SRC_DIR)/foo.erl $(SRC_DIR)/bar.erl $(SRC_DIR)/baz.erl
次のようにすると分かりやすいでしょう。
SOURCE_FILES:=foo.erl bar.erl baz.erl
SOURCES:=$(addprefix $(SRC_DIR)/, $(SOURCE_FILES))
その他の修正
hintsというターゲットを追加しました。make -n ターゲット
、make print_vars
と同様、状況がよくわからない場合や困ったときの助けになります。
doc_clean, print_varsにはアンダスコアを除いたdocclean, printvarsという別名も用意しました(そういう命名が習慣らしいので)。
問題点
以前の問題点は解消されてません(^^; さらに、変数SOURCESなどを定義してもEDocに渡す方法が(いまのところ)ないので、Edocは$APP/src/内のすべてのファイルをドキュメンテーションしようとします。ファイル冒頭に%% @hidden
というEDocコマンドを入れるとドキュメンテーション対象から外れますが、あまりいい方法ではないですね。