astah* UML + DoxygenでC++のクラス図を自動生成 @Mac
C++コードレビューに向けてクラス図を作ろうと思い、astah*とDoxygenの力を借りて作ってみたので、その方法をまとめとく。
公式サイトにも詳しい説明があるのだけれども、Windows環境のことしか書いてないのでMac環境でのやり方をここに書くよ。
あとC++のクラス図の生成のやり方しかトライしてないので、他の言語でのやり方は分かりません!
準備するもの
astha* UML
astah* UMLは、UMLモデリングツールastha* communityの機能強化版。商用。
30日間使用できるけど、有料だからそこんとこ注意。1ライセンス5,250円で、1年ごとに更新が必要がある。これは安いのか高いのかよくわからんが、定期更新する必要があるのはちょっと辛い。
UMLは、Javaのコードをリバースエンジニアリングしてクラス図を作ってくれる機能を持っているらしい。
C++はDoxygenが無いとクラス図の生成はできないっぽい。C++のコードをリバースエンジニアリングするためのプラグインはあるにはあるんだけど、どうなんだろ。もうちょと調べてみる必要がありそう。
インストール
公式サイトの製品 > astah* UMLのページからダウンロードできる。
URL:http://astah.change-vision.com/ja/product/astah-uml.html
で、ここがとても重要で、Mac OS X用をダウンロードするのではなく、Linux用のをzipでダウンロードすること。
理由として、
- なぜかMac版にはクラス図生成までの過程に必要なjarファイルが色々と無い
- jarファイルへのパスが間違ってるというより「存在しない」
- Linux版だと全部入ってるからそっちのほうが良い
- Mac OS X版をインストールした後、必要なjarファイルだけ移してもいいかも
追記:Mac版にもjarがあるとのことをコメントにて教えていただいたので、そっちの解説も加えます。
astah* UMLのダウンロードページに飛んだら、
Mac版のdmgか、Linux版のzipをダウンロードしてください。Mac版の場合、修正箇所が2点あるので注意。
Mac版の場合
ダウンロードしたdmgを開いて普通にインストール。おそらく「/Applications/astah UML/」にインストールされているはず。
確認できたら、astah UMLディレクトリ以下の「/api/sample/sample_doxygen_cplus」に移動。
% cd /Applications/astah\ UML/api/sample/sample_doxygen_cplus/
その後、compile.shとrun.shを編集して、以下の様にする。今回の環境だと両方とも8行目。
# ASTAH_HOME=../../../ 変更前 ASTAH_HOME="../../../astah UML.app/Contents/Resources/Java" # 変更後
これでMac版はおっけー。
Doxygen
Doxygenは、javaでいうdocを作ってくれるアプリ。
これ単体だと無理だけど、Graphvizと併せて使うとクラス図や参照関係を図で出力してくれるから便利!
インストール
方法は2つ
MacPortsを使う
% sudo port install doxygen
注意しなければいけないのは、この方法だとDoxygen GUIが付いてこないこと。
下の公式ページからダウンロードしてインストールしたほうが良いと思う。
公式サイトからダウンロード
ダウンロードページへのリンク:http://www.stack.nl/~dimitri/doxygen/download.html#latestsrc
今日付けでSnow Leopard用みたいなこと書かれてるけど、Lionでも大丈夫。
設定
一応パスが通ってるか確認しましょう。
% which doxygen /opt/local/bin/doxygen
GUIを使う場合
astah*の公式サイトに載ってるのでそちらを参照した方がわかりやすいかも。
http://astah.change-vision.com/ja/feature/cpp-reverse.html
こっちのほうがオススメ。Doxygenの設定ファイルを自力で編集しても良いけどね!
GUIを使わない場合
ソースの置いてあるフォルダで、
% doxygen -g [ConfigFileName]
と入力してまず設定ファイルを作る。
ファイル名が空だとDoxyfileという名前で設定ファイルが作られるが、俺は.doxyrcとした。
次にこの設定ファイルをvimなりで開いて編集する。
絶対に変更が必要な箇所は、3点で以下のようにする。
GENERATE_XML = YES #デフォルトではNO RECURSIVE = YES #デフォルトではNO MACRO_EXPANSION = YES #デフォルトではNO
RECURSIVEが無いと設定ファイルの置いてあるディレクトリしか探索してくれないので、RECURSIVEをYESにしておくのは必須。
GUIだとOptimize output C++の項目があるんだけど、GUI経由で設定ファイルを作っても該当する項目は見つからないのでデフォルトでそうなってるんだと思う。
状況に応じて変更したほうが良い箇所は、
DOXYFILE_ENCODING = UTF-8 INPUT_ENCODING = UTF-8 PROJECT_NAME = "My Project" OUTPUT_DIRECTORY =
文字コードはコードの文字コードといっしょになるように気をつけないといけない。
不要なファイルの生成を防ぎたいなら、以下のようにする。
GENERATE_HTML = NO #デフォルトではYES GENERATE_LATEX = NO #デフォルトではYES
これをやらないと今回は必要ないものまで出力されるので今回はNOでいいと思う。
普通にDoxygenだけ使う場合はGENERATE_LATEXだけNOにするのがオススメ。
編集が終わったら保存して、
% doxygen [ConfigFIleName]
と打ってちょっと待てばxmlというディレクトリが、設定ファイルの置いてあるディレクトリ内に作られるはず。
このxmlディレクトリへのパスは後で使うのでメモっておこう。
これでDoxygenの準備はおっけー。
クラス図を作成
あとちょっと。
astah*で開けるようにxmlファイルをコンバート
まず、「/Applications/astah UML」に移動(Linux版の場合は、さっき解凍したastah_umlディレクトリ)以下の「/api/sample/sample_doxygen_cplus」に移動する。
# Mac版の場合 % cd /Applications/astah\ UML/api/sample/sample_doxygen_cplus/ # Linux版の場合 % cd ~/Developer/astah_uml/api/sample/sample_doxgen_cplus/
そしたら、そのディレクトリ内にあるcompile.shとrun.shの2つのファイルがあると思うので権限を705に変更する。
% sudo chmod 705 compile.sh run.sh
変更が終わったら、compile.shを実行。
% ./compile.sh
追記:Mac版だとsudoが必要かも。
文字化けでなんか警告っぽいのがでるかもしれないけど、doxygen_cplus以下のjavaファイルがコンパイルされてclassファイルが生成されていればおっけー。
classファイルができてることを確認したら、run.shを実行する。
% ./run.sh [XmlFolderPath] [OutputPath]
追記:Mac版だとsudoが必要かも。
第一引数にはさっきメモったxmlディレクトリまでのパス、第二引数には生成されるファイルのパス。
自分の環境の場合は以下のような感じになる。
% ./run.sh ~/Developer/workspace/TestProject/src/xml ~/Developer/workspace/TestProject/src/converted.asta
Importing... please wait..
Import Done.
converted.astaのconvertedは自由だろうけど、.astaにしておくとそのままastah* UMLで開けるので便利だよ。
上みたいにImport Done.って出ればコンバートは成功!
まとめ
astah* UMLとDoxygenを使った、C++プロジェクトのクラス図の生成方法について書いた。
この2つを使うと結構簡単にクラス図ができてイイね!
astah*を使えば後から間引いたり配置の調整ができたりするので見やすさも整えやすいってのもイイ。
DoxygenとGraphvizを使ってもクラス図を作ることはできるけど、
これは後から要素位置の調整ができないし、何より全体のクラス図の生成は作ってくれなかった気がする(選択したクラスの周辺だけ)。
全体のクラス図を作りたい時はastah* UML + Doxygenが良いのかも。
Doxygen + Graphivizもdoc生成ツールとして優秀なので、活用しましょう。
以上。
他にもクラス図を自動生成してくるようなアプリがあったら誰か教えて下さい。