プログラムのソースコードを解析して,ドキュメントを作ってくれる便利なツール
ダウンロードは,http://www.doxygen.jp/から。
Doxygenには,次のような特徴がある。
GENERATE_HTMLHELP = YES CHM_FILE = ../xxxxx.chm HHC_LOCATION = "\"C:\Program Files\HTML Help Workshop\hhc.exe\"" GENERATE_CHI = YES CHM_INDEX_ENCODING = CP932
Doxygenのサイトの右側にあるDownloadするところから,Windows用インストーラーをダウンロードする。(doxygen-1.8.2-setup.exe)
これもクリックしてインストールする。
PATHを通しておく必要があるので,短めのディレクトリのほうが良い。
Doxygenを実行する時に,動作を設定するためのdoxyfileをそのプロジェクト・ディレクトリに用意しておく。サンプルDoxyfile: Doxyfile
設定ファイルはDoxywizardっていうGUIツールで作成できる。一度作るとほとんど変更することはないんでエディターで編集して使っている。最初はDoxywizardを使ったほうがいいと思う。実行は,スタートメニューまたはコマンドプロンプト上でdoxywizardを実行すれば,そのディレクトリに作成される。
Wizard | 簡易設定。ウィザード形式で Project ~ Diagrams まで設定してゆく。 |
Expert | 高度な設定。Wizard より細かな設定をおこなえる。 |
Run | ドキュメント生成などを実行できる |
設定はWizardタブを開いて行う。
Project
Project name | プロジェクト名の設定。ドキュメントのタイトルなど,いろいろなところで使われる。 |
Project synopsis | プロジェクト概要。出力形式がHTMLの場合,タイトル直下に説明文として添えられる。 |
Project version or id | プロジェクトのバージョン情報,または識別子。出力形式がHTMLの場合,タイトル右側に添えられる。 |
Project logo | プロジェクトのロゴとなる画像ファイル。出力形式がHTMLの場合,タイトル左側に画像として挿入される。 |
Select code directory | 解析対象とするソースコードを格納したフォルダの場所。相対パスも指定できる。 |
Scan recursively | ソースコードのフォルダが階層化されており,それらも解析する場合はチェックする。 |
Destination directory | ドキュメントの出力先。未指定なら作業フォルダが選ばれる。 |
Mode
Select the desired extraction mode | 解析対象。Documented entities onlyはドキュメント化されたファイルのみ。All Entitiesならすべて。Include cross-referencedはソース間で相互参照がある場合,それらも含む。 |
Select programming language to optimize the result for | 最適化するプログラミング言語。プロジェクトのメイン言語を選ぶ。 |
Output
HTML | plain HTML | 標準のHTMLを出力する。 |
with navigation panel | ページの左側にナビゲーションパネルを持つHTMLを出力する。 | |
prepare for compressed HTML(.chm) | MS Compiled HTML Help(CHM)形式で出力する。 | |
With search function | PHPの稼働しているWeb サーバーに配置したとき,検索機能を有効にする。 | |
Change color… | HTML出力する際の全体的な色を変更できる。既定のデザインを踏襲しつつ,色のみを調整するようになっている。 | |
LaTeX | as intermediate format for hyperlinked PDF | LaTeX用の中間形式としてハイパーリンク形式のPDFを出力する。 |
as intermediate format for PDF | LaTeX用の中間形式として単一のPDFを出力する。 | |
as intermediate format for PostScript | LaTeX用の中間形式としてポストスクリプトファイルを出力する。 | |
Man pages | UNIXのman(マニュアル)コマンド用ファイルを出力する。 | |
Rich Text Format(RTF) | リッチテキスト形式のファイルを出力する。 | |
XML | XML 形式のファイルを出力する。独自の出力形式が欲しい場合,このファイルから変換するのがいいと思う。 |
Diagrams
Diagram to generate | No diagrams | ダイアグラムを出力しない。 |
Use built-in class diagram generator | Doxygenに内蔵されてるジェネレータを利用してダイアグラムを出力する。 | |
Use dot tool from the GraphViz package to generate | GraphVizを利用してダイアグラムを出力する。詳細設定は Dot graphs to generate 欄でおこなう。 | |
Dot graphs to generate | Class diagrams | クラス図を作成する。 |
Collaboration diagrams | コラボレーション図を作成する。 | |
Include dependency graphs | インクルード依存グラフを作成する。 | |
Include by dependency graphs | インクルード依存グラフを作成する。ヘッダの間接インクルードによって生じた依存関係も含むみたい。 | |
Call graphs | 呼び出しグラフを作成する。これをチェックすると関数やメソッドの呼び出し解析が実行されるので,ドキュメント生成の時間がとても長くなる。 | |
Called by graphs | 間接的な呼び出しフラグを作成する。この設定もCall graphs同様,チェックすると時間がかかる。 |
Expertタブ
Doxyfile Encodeing | 設定ファイルDoxyfileのコードを設定する。UTF-8にしておく。 |
OUTPUT_LANGUAGE | 日本語で出力させるために,Japaneseに設定する。 |
OPTIMIZE_OUTPUT_FOR_C | Cソースのみの場合は,YESにしておく。 |
INPUT_ENCODING | 入力ファイルの言語ローケールの設定。S-JISの場合は「CP932」にする。ソースコードに合わせる。 |
EXTRACT_PRIVATE | YESにすると,プライベートメンバーを文書に入れる。 |
EXTRACT_LOCAL_CLASSES | YESで,ローカルクラスを文書に入れる。 |
SHOW_INCLUDE_FILES | YESで,インクルードファイルのリストを文書に入れる。 |
すべての設定が完了したら,Runタブを開き,Run doxygenボタンを押す。しばらく待つとドキュメント作成が完了する。
CHMファイル作成
GENERATE_HTMLHELP | チェックすることで,CHMファイルの出力が有効になる。 |
CHM_FILE | 出力するファイル名。プロジェクト名.chm とするのが分かりやすくてよい。 |
HHC_LOCATION | HTML Help Workshopの実行ファイルへのフルパス。直接入れるかファイルダイアログでhhc.exeを開いて設定する。 |
CHM_INDEX_ENCODING | CHMファイルを開いた時,目次タブに表示される項目のテキストエンコーディング。日本語が含まれるなら「CP932」を設定する。そうしないと文字化けする。 |
DOXYFILE_ENCODING = UTF-8 # SJISの場合は,CP932にする PROJECT_NAME = "XXXXXX PCB Firmware" # 適当に PROJECT_NUMBER = 1.1.0 # 適当に OUTPUT_LANGUAGE = Japanese # やっぱり日本語で HAVE_DOT = YES # Graphvizで図を入れる OUTPUT_DIRECTORY = # 出力ディレクトリ(デフォルトはHTML) TAB_SIZE = 8 # TAB幅 FILE_PATTERNS = *.cpp *.c *.h # 対象ファイルを指定 EXTRACT_PRIVATE = YES # privateメンバも出力するとき
その他,いっぱいオプションがある。doxygen -gとするとコメント付きのDoxyfileを作成するんでそれを見て設定する。
doxygenコメントには,「概要記述」と「詳細記述」の2つのコメントがあります。それぞれの違いは以下のとおり。
doxygenコメント | 内容 | 書き方 |
概要記述(brief description) | 詳細解説およびサマリーに利用されるコメント | 主に1行のコメントで記載 |
詳細記述(detailed description) | 詳細解説の個所のみで利用されるコメント | 複数行のコメントで記載 |
どちらもファイルの先頭,対象となる関数,構造体,C++のクラス,メンバ変数,メソッドなどの宣言や定義の前に記述する。
図は,doxygenが出力するファイルのコメントの例です。doxygenが出力するドキュメントは,「サマリー」と「詳細説明」に分かれる。サマリーには,概要記述で記載した内容が,詳細説明には概要記述と詳細記述で記載した内容が反映されるみたい。サマリーにも反映させたい内容については,概要記述に書くようにする。
/// サマリーだよ
//! サマリーだよ
/* * 詳細記述 * 詳細記述 */ /* 詳細記述 詳細記述 */
/** * 詳細記述 * 詳細記述 */ /** 詳細記述 */
/*! * 詳細説明 * @brief サマリー説明 * 概要説明 * * 詳細説明 */ /*! @brief 文字列の文字数を返す @param [in] s 文字列 @return 文字数 */ /*! @brief 文字列での文字の位置を返す @param [in] s 文字列 @retval 0 見つからなかった @retval 0以外 文字の位置 */
変数定義 /*!< 詳細説明 */
変数定義 /*!< 詳細説明 */
変数定義 ///< サマリーだよ int globBase = 10; ///< 足し算用のパラメータ
変数定義 //!< サマリーだよ
コメントの中では"スペシャルコマンド"や"HTMLコマンド"と呼ぶ書き方で細かな指定が可能。第す。代表的なものを以下に上げてみる。
書き方 | 説明 |
@bほげほげ | ほげほげ |
<b>ほげほげ</b> | ほげほげ |
@emほげほげ | ほげほげ |
em>ほげほげ</em> | ほげほげ |
@code~@endcode | コードブロック |
@verbatim~@endverbatim | 直接表記 |
セクションコマンド | 説明 |
@mainpage | doxygenで作成されるドキュメントの最初のページの説明文になる。 |
@author | 開発者名を記載する。 |
@deprecated | 廃止されたクラスやメソッドであることを,記載する。 |
@param | 関数の引数名と引数の概要(引数の数だけ記述)なんかを記載する。 |
@return | 戻り値を記載する(戻り値がvoidの時は不要) |
@retval | 戻り値を記載する(戻り値がいくつかの値をとる場合) |
@arg / @li | 箇条書き。- (インデントした行頭ハイフン) の場合,全て番号無しリストとして出力される。引数のリストとして@arg,文中の箇条書きとして - がいいかも。-だけはインデントの深さを変えるとネストになる。インデントを合わせて.だけの行を置くと,リストを終了しパラグラフを続けることが出来ます。 -# とすると順序付きリストになります。 |
@par | 段落の開始。引数は,パラグラフタイトルになる。タイトルが無しの時はコマンドのみの改行にする。 |
@see / @sa | 参照すべき箇所や関連するクラスなんかを記載する。文中にも使える。 |
@code / @endcode | コードブロックの指定。この間のテキストはコマンドが全て無効になって,そのまま出力される。コードサンプルなんかを書く時に使う。@verbatin~@endverbatimもほぼ同じだけど,これだとリンクが張られます。 |
@since | 導入された日付なんかを記載する |
@throw | 関数なんかの例外を記載する |
@version | バージョンを記載する |
@note | 覚書のような,メモなんかを記載する |
@attention | 注意書き。現在の使用時なんかでの注意点を記載する |
@warnning | 警告書き。開発者なんかに,動作仕様からは判らない重要な注意事項なんかを記載する |
@date | 日付をつけて履歴なんかを記載するときに使う。複数書いても連結されてしまう。 |
@bug | バグ情報。リストとして一覧が出るので,@dateの代りに履歴として使うという使い方もある。複数書いた場合にパラグラフ結合されないという違いがある。 |
/** * @brief etcクラスはその他のデータを表します。 * * @author yuji * @see labeledETC * @date 2007/04/09 */ class etc{ /** * その他のデータを表す * @note private String name * @deprecated この値を直接操作することは推奨されません。 */ var $name; /** * 名前を設定 * @param name 名前を指定 * @note void setName(String name) */ function setName($name){ $this->name = $name; } /** * 名前の取得 * @return String * @note String getName() */ function getName(){ return $this->name; } }
新しくコメントをつける