はうすてんぼぶ

コードかいてて疑問に思ったことや、興味あることをつらつらと暇なときに書く場所、ここはそんな場所

astah* UML + DoxygenでC++のクラス図を自動生成 @Mac

C++コードレビューに向けてクラス図を作ろうと思い、astah*とDoxygenの力を借りて作ってみたので、その方法をまとめとく。

公式サイトにも詳しい説明があるのだけれども、Windows環境のことしか書いてないのでMac環境でのやり方をここに書くよ。
あとC++のクラス図の生成のやり方しかトライしてないので、他の言語でのやり方は分かりません!

準備するもの

  1. Mac
  2. astah* UML
  3. Doxygen(Doxygen GUIがあると便利)
  4. コード(今回は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版はおっけー。

Linux版を落とした場合

zipのダウンロードが終わったら解凍したディレクトリastah_umlを適当な場所に置きましょう。
俺は「~/Developer」に置いた。

Linux版は解凍したのをわかりやすいところに置いとけばおっけー。

Doxygen

Doxygenは、javaでいうdocを作ってくれるアプリ。

これ単体だと無理だけど、Graphvizと併せて使うとクラス図や参照関係を図で出力してくれるから便利!

インストール

方法は2つ

MacPortsを使う
% sudo port install doxygen

注意しなければいけないのは、この方法だとDoxygen GUIが付いてこないこと。
下の公式ページからダウンロードしてインストールしたほうが良いと思う。

ただ、MacPortsを使うとクラス図とか出力する際に使われるGraphvizが自動でインストールされるので便利。

公式サイトからダウンロード

ダウンロードページへのリンク: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でクラス図を作成

あとは、今作られたファイルをダブルクリックして、astah* UMLで開いてワンアクションするだけ!

具体的には、下の画像のようにコンバート時に生成したファイル名のとこで[右クリック]→[詳細クラス図を自動生成する]でおっけー!
f:id:Silent-Bob:20120712153105p:image:w100

そうするとこんな感じにクラス図が生成されるので、あとはいらないクラスとかを間引いて全体を整えましょう。
f:id:Silent-Bob:20120712153139p:image:w100

間引いたあとにメニューバーの[整列]→[全図要素の自動レイアウト]を選ぶと再配置されるよ。

まとめ

astah* UMLDoxygenを使った、C++プロジェクトのクラス図の生成方法について書いた。
この2つを使うと結構簡単にクラス図ができてイイね!
astah*を使えば後から間引いたり配置の調整ができたりするので見やすさも整えやすいってのもイイ。

DoxygenGraphvizを使ってもクラス図を作ることはできるけど、
これは後から要素位置の調整ができないし、何より全体のクラス図の生成は作ってくれなかった気がする(選択したクラスの周辺だけ)。

全体のクラス図を作りたい時はastah* UML + Doxygenが良いのかも。
Doxygen + Graphivizもdoc生成ツールとして優秀なので、活用しましょう。

以上。


他にもクラス図を自動生成してくるようなアプリがあったら誰か教えて下さい。