さて、始める前にまず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