「Make 補遺の補遺:遊んでいるだけ」とか「Make言語で算術演算 <-- バカ!」とか、わしゃ何やっとんじゃ? あっ! 思い出した。この日、Makefile書こうと思って挫折したんだった。で、その目的は、Erlangのビルドシステムを作ることだった。
内容:
- 目的
- 前提
- 配置とカスタマイズ
- 重要な注意:overview.edocの置き場所
- ファイル名のお約束
- makeの使い方
- 問題点
- Makefile
●目的
「Erlang実験室:お手軽なビルド方法」で、Emakefileを使うビルドを紹介しました。コンパイルするだけならこれで十分だし、一番便利な方法だと思います。しかし、ドキュメンテーションの生成やテストまでやろうとするとEmakefileでは対応できません。
そこで、makeユーティリティを使って、次の作業を行います。
- コンパイル
- EDocによるドキュメンテーションの生成
- EUnitによる単体テスト
●前提
ディレクトリ構成は、「Erlang実験室:お手軽なビルド方法」で述べた標準的構成とします。ただし、$DEV_TOPの代わりに$APPと書きます。その理由は、通常、開発ディレクトリ名はアプリケーション名と同じだからです(それが必須ではないが)。
Erlangの習慣では、$APP/vsn.mkというファイルにアプリケーションのバージョンを書いておきます。アプリケーション名がfooならば、
のような1行を記述します。app.mkがあればビルドに利用しますが、なくてもかまいません。
FOO_VSN = 1.0.1
また、アプリケーション名を明示的に指定したいときは、$APP/app.mkに次のように書きます。
アプリケーション名は、英字小文字と数字だけ使用が無難です*1。app.mkには、他にも、アプリケーション固有の設定を書けます(後述)。
APP_NAME = foo
$APP/../env.mk、または$APP/env.mk には当該コンピュータに固有の設定を書きます。現状は、変数ERLANG_HOMEを書くだけです。
●配置とカスタマイズ
Makefile(へのリンク)はこのエントリーの最後にありますが、$APP/src/Makefileとして置きます。それと、$APP/../env.mk または $APP/env.mk を準備します。その内容は例えば、
これは、MSYSからmakeを使うときの例です。習慣に従い、すべての例で「=」を使ってますが、定数の代入ですから実は「:=」のほうがベターですね(「Makefileの書き方:プログラミング言語Make」参照)。
ERLANG_HOME = /c/Installed/erl5.5.4
標準ディレクトリ構成を守っているなら、これだけで準備OKです。vsn.mkとapp.mkがなければ、必要なときにmakeを起動するとすぐに作られます。
オプショナルなファイルを作り、変数を定義すればカスタマイズができます。アプリケーション名はfooだと仮定します。
変数 | ファイル | 説明 |
---|---|---|
FOO_VSN | $APP/vsn.mk | バージョン、変数名の一部にアプリケーション名 |
APP_NAME | $APP/app.mk | アプリケーション名 |
APP_VSN | $APP/app.mk | バージョン(vsn.mkの値を上書きする) |
ERLC_EXTRA_FLAGS | $APP/app.mk | erlcに渡す追加コンパイルオプション |
EDOC_EXTRA_OPTS | $APP/app.mk | EDocに渡す追加オプション |
DEBUG | $APP/app.mk | デバッグフラグ |
NOT_SOURCES | not_sources.mk | ソースファイルに含ませたくないファイルの一覧 |
SOURCES | sources.mk | ソースファイルの一覧 |
NOT_INCLUDES | not_includes.mk | インクルードファイルに含ませたくないファイルの一覧 |
INCLUDES | includes.mk | インクルードファイルの一覧 |
●重要な注意:overview.edocの置き場所
EDocでは、アプリケーション全体の説明をoverview.edocに書きます。なぜか、overview.edocは../doc/に置くのがデフォルトですが、../doc/に置いてはダメです。makeターゲットdoc_cleanで消されてしまいます。
overview.edocは$APP/src/に置いてください。
●ファイル名のお約束
名前がtmpではじまるファイルは、ソースファイル、インクルードファイルとはみなされません。この制限をはずすには、例えばsources.mkに次のように書けばいいでしょう。
SOURCES = $(wildcard $(SRC_DIR)/*.erl)
アプリケーション・リソース・ファイルとアプリケーション・アップグレード・ファイルのテンプレートは、それぞれ $(SRC_DIR)/$(APP_NAME).app.src と$(SRC_DIR)/$(APP_NAME).appup.src です。
EUnitのテストはt_*.erlという名前にしてください。この名前のファイルがあれば、それはテスト用モジュールとみなされます。
●makeの使い方
主要なmakeターゲットは次のものです。
- obj (デフォルト)-- ソースをコンパイルして.beamファイルを作る。
- doc -- EDocにより、ソースからドキュメンテーションを生成する。
- test -- EUnitにより書かれた単体テストをすべて実行。
その他に、
- desc -- .appファイルと.appupファイルをテンプレートから生成する。
- all -- obj, doc, desc の全てを行う*2。
- clean -- ebin/ の下のファイルとsrc/ 内の無駄なファイルを消す。
- doc_clean -- doc/ の下のファイルをすべて消す。
- print_vars -- makeの変数を表示する。
makeが何を行うかを事前に知るには、make -n ターゲット
としてください。何か問題があるとき make print_vars
も助けになります。
●問題点
- 正しく動くか、まだ検証が不十分。
- 依存関係を考慮してない。
- 配布パッケージの作成、インストールができない。
- Erlangのパッケージ(名前空間)に対応してない。
- ターゲット名や変数名が一部習慣に反している。
- カスタマイズ用のファイルの書き方に注意を要する。
依存関係を考慮してないとは、どのソースファイルもインクルードファイル全体に依存するように書かれていることです。このため、無関係なインクルードファイルが更新されても再コンパイルが盛大に走ってしまいます。
[追記]実際に使ってみて、具合の悪い点は今後直していきます。[/追記]