さて、始める前にまずMakefileを見てもらおう
#---------------------------------------------------------------------------- # $Id$ #---------------------------------------------------------------------------- #---------------------------------------------------------------------------- # Local macros #---------------------------------------------------------------------------- # ACE のどのサンプルプロジェクトでも Makefile がテストやライブラリ指定のために用いられているのを # 見付けることができるだろう。このファイルもそのようなサンプルから持って来たものだ。 # 作成したいバイナリの名前を定義する。同じ名前の CPP ファイル $(BIN).cpp が # 存在するべきだが、その中に main() が定義されている必要はない。 # まあ、大抵の場合は書いてあるものだけど。 BIN = server # いくつかのアプリケーションは一つのソースファイルだけでできている。 # FILES マクロを使って、コンパイルすべきファイルのリストを管理することにする。 # ここで BIN と同様にファイルの拡張子を省略できることに注意してほしい。 FILES = FILES += client_handler # BUILD マクロは ACE のメイクファイルから利用される。 # 通常はシステムがビルドを要求していることを示す。 # 私は VBIN が BIN の値から生成される何かだとしか知らないが、とりあえずこのまま書いておく。 BUILD = $(VBIN) # ここで SRC マクロを準備するために GNU make のいくつかの拡張機能を利用する。 # 一般的には BIN と FILES の各項目の後ろに .cpp を付加すればよい。 SRC = $(addsuffix .cpp,$(BIN)) $(addsuffix .cpp,$(FILES)) # このマクロは下のインデントされたターゲット中で使っている。 # これは標準的な ACE の設定ではないので、いらない時は外してよい。 HDR = *.h #---------------------------------------------------------------------------- # Include macros and targets #---------------------------------------------------------------------------- # ここに真の力がある! # ここでインクルードしている makefile は ACE における C++ テンプレートの # ようなものだ。これらはインクルードするだけで非常に多くの仕事をしてくれる。 # 実際、私はこれらのファイルをインクルードした "app.mk"ファイル一つしか作っていない。 # このプロジェクトのメイクファイルは app.mk をインクルードするだけで十分となる。 include $(ACE_ROOT)/include/makeinclude/wrapper_macros.GNU include $(ACE_ROOT)/include/makeinclude/macros.GNU include $(ACE_ROOT)/include/makeinclude/rules.common.GNU include $(ACE_ROOT)/include/makeinclude/rules.nonested.GNU include $(ACE_ROOT)/include/makeinclude/rules.bin.GNU include $(ACE_ROOT)/include/makeinclude/rules.local.GNU #---------------------------------------------------------------------------- # Local targets #---------------------------------------------------------------------------- # 私は時々コードを読みやすくするために整形し直すことがある。 # これは往々にして他のことよりも有用である。 # 不幸にして indent プログラムは C++ を完全には把握してくれないので # その出力を若干変更しなければならない。 Indent : # for i in $(SRC) $(HDR) ; do \ indent -npsl -l80 -fca -fc1 -cli0 -cdb < $$i | \ sed -e 's/: :/::/g' \ -e 's/^.*\(public:\)/\1/' \ -e 's/^.*\(protected:\)/\1/' \ -e 's/^.*\(private:\)/\1/' \ -e 's/:\(public\)/ : \1/' \ -e 's/:\(protected\)/ : \1/' \ -e 's/:\(private\)/ : \1/' \ > $$i~ ;\ mv $$i~ $$i ;\ done # ACE のメイクファイル中のターゲットの一つに depend がある。 # これはコンパイラを(コードの)依存関係リストを生成するために起動する。 # すばらしい事だろう!だが残念な事に、この機能は生成したリストの内容を # Makefile 中に直接ばらまいてしまう。 # 私は自分の Makefile をきれいに片付けておきたい。 # ここで紹介する perl スクリプトは、Makefile 中から依存関係を取り出し、 # .dependというファイルに移してくれる。 # あとは上でやったようにそれをincludeすればよい。 # # 付記:'depend' ターゲットは GCC が使えることを期待する。 # 読者は同じことを他のコンパイラでもできるが、ACE のメイクファイルと # ユーティリティは GCC と一緒に動作することを仮定している。 Depend : depend perl ../fix.Makefile .depend : # touch .depend HTML : # [ -f hdr ] || $(MAKE) UNSHAR perl ../combine *.pre ; chmod +r *.html SHAR : # [ ! -f combine.shar ] || exit 1 shar -T hdr bodies *.pre > combine.shar && $(RM) hdr bodies *.pre *.pst UNSHAR : # sh combine.shar CLEAN : realclean $(RM) hdr bodies *.pre *.pst .depend #---------------------------------------------------------------------------- # Dependencies #---------------------------------------------------------------------------- # この下には何も書いてはいけない。 # depend ターゲットと fix.Makefile によって # それらの内容が消されてしまうからだ。 # これは fix.Makefile スクリプトによって挿入された。 include .depend