このパッケージはlog4jをmakeする環境に関する段階的なチュートリアルです。 まずはじめに、自分の環境にmake環境をあわせる方法をお教えします。一度 自分のシステム環境に合わせてしまえば、いくつかjavaのソースファイルを コンパイルして、make環境を動かすことが確認できます。 次に、チュートリアルは他人があなたのコードを楽にコンパイル できるように、あなたのMakefileを書く方法をお教えします。 マスター・ルール・ファイル ========================== マスター・ルール・ファイルはソースコードをコンパイルするのにgnu-makeが 使用するルールを定義します。"make/make/inc"にありますが、書き換える必要は ありません。 マスター・ルール・ファイルは、"make/make.loc"というファイルを探します。 このファイルはローカルシステムに依存する部分を解決する方法を示しています。 ローカルシステム依存 ==================== システム依存は"make"ディレクトリの下にある"make.loc"というファイルに 集められてます。 この make.loc ファイルはlog4j配布の一部ではありません。 ですので、** 自身でファイルを作らなければなりません **。作り方は、 make/READMEを読んでください。 gnu-makeを使ってコンパイルする ============================== make/make.locファイルを作成し、JAVAC, JAVAC_FLAGS, CLASS_DIRの 各変数を設定したら、"test"ディレクトリ下でjavaファイルをコンパイル できます。 makeディレクトリ内のmakeコマンドフォームを実行して、make環境をテスト できます。コマンドの実行は以下のとおりです: > make lib こうすると、テスト用のソースコードをコンパイルし、出来上がったclass ファイルをCLASS_DIRにおくはずです。Hello.classとX.classが作成され、 CLASS_DIR/make/testとそれぞれのCLASS_DIR/make/test/subdirにおかれて いることを確認して下さい。 もしコンパイラーが"X"が見つからないともらしたら、CLASSPATHの設定が 間違っている可能性があります。 CLASSPATHには、*ソースツリー*のパスに加えて、CLASS_DIRディレクトリも 含んでいるべきであることを忘れないでください。もし含まれていなければ、 javaコンパイラーはソースコードの依存問題を解決することができません。 "make lib"コマンドの実行は、makeディレクトリからでも、その下のtestディレク トリからでも可能です。make環境はサブディレクトリにも再帰的に適応されます。 たぶん、Hello.javaをコンパイルしたときに"make/test/subdir/X.java"も コンパイルされていたことにお気づきでしょう。自動的に必要なファイルを コンパイルすることも、ほとんどのjavaコンパイラーの共通した仕様です。 では、試しに空行を追加して、test/subdirにある"X.java"を更新してみましょう。 "make lib"コマンドを実行すると、GNU-makeがmake/test/subdirディレクトリに 再帰的に適応されて、きちんとX.javaをコンパイルしているのが確認できます。 "Hello.java"は更新されていないので、コンパイルしません。 全ソースコードをコンパイルする ============================== "make lib"コマンドを実行することで、配布ファイルを展開したディレクトリ から全ソースコードをコンパイルすることができます。 Makefile ======== makeを使うと自動的にコンパイルされるので、コードを追加するのは非常に 簡単です。Makefileをソースコードの各パッケージに追加するだけです。 javaでは、各ディレクトリがパッケージに対応しているので、ソースコードの 各ディレクトリにMakefileが存在する必要があります。 このチュートリアルは、不完全なMakefileを含んだ"example"ディレクトリを 使っています。これらのMakefileは下に示すように修正して、完成させなければ なりません。 これらのMakefielは以下のような構造をしています: # Start Makefile ================================== PKG_DIR :=name/of/package/separated/by/forward/slashes DEPTH :=the_depth_of_your_make_file: e.g. ../.. (for 2 levels deep) JSOURCES:=Your.java Sources.java SUBDIRS :=space separated list of subdirs that should be recursed into JRMI :=files.java that.java require.java rmic.java compilation.java # include master-rule file include $(DEPTH)/make/make.inc # End Makefile ==================================== PKG_DIR変数には、ドット(.)をスラッシュ(/)に置き換えたパッケージ名を 設定します。たとえば、x.y.zというパッケージであれば、PKG_DIR変数には x/y/zを設定します。 DEPTH変数を設定するルールは、以下のようになります: . トップレベルのMakefile用 .. レベル1のパッケージ用 ../.. レベル2のパッケージ用 ../../.. レベル3のパッケージやその他のパッケージ用 JSOURCES変数は、スペースで区切られた、コンパイルしたいjavaソースファイルの 一覧です。もしファイルのリストがあまりにも長い場合は、行の最後にバック スラッシュ(\)をおいて、次の行から続けることができます。続きの行にスペースが あるのは問題ありませんが、タブは使わないでください。タブ文字はmakeでは 特別な意味を持つからです。 たとえば、 JSOURCES:= XYZ1.java XYZ2.java XYZ3.java XYZ4.java \ XYZ5.java XYZ6.java XYZ7.java XYZ8.java \ XYZ9.java XYZ10.java XYZ11.java XYZ12.java \ XYZ13.java XYZ14.java XYZ15.java\ SUBDIRS変数は、一覧に挙げられたサブディレクトリにも適用するようmakeに 知らせるために使われます。makeはここで上げられたディレクトリにルールを 適用します。リストはスペース区切りでなければなりません。 JRMI変数は、RMIでコンパイルすべきjavaファイルのスペース区切りのリストです。 これらのソースファイルはJSOURCES変数にも書かれている必要があります。 テストパッケージのMakefileは以下のとおりです: # Start Makefile for ackage test==================== PKG_DIR :=test DEPTH :=.. JSOURCES:=Hello.java JRMI := SUBDIRS :=subdir # include master-rule file include $(DEPTH)/make/make.inc # End Makefile ==================================== 練習用として、make/exercise/echo, make/exercise/echo/client, make/exercise/echo/serverディレクトリにあるexerciseの 中のMakefileを完成させてみてください。模範解答は 各ディレクトリ内のMakefile.solファイルにあります。 設定で困ったときには、cgu@urbanet.chまでご連絡ください。 [訳注: これは 網野 勉 が翻訳しました。 日本語訳に対するコメントは、jajakarta-report@nekoyanagi.com 宛に送って下さい。]