Doxygenによるソースドキュメントの機械生成 ● Doxygenとは JavaSoftが出している、最も基本的なフリーのJava言語の開発環境J2SE (以前のJDK)に、「JavaDoc」 というツールが含まれているのをご存知でしょうか。 これはソースプログラムに一定の形で書かれたコメントを抜き出して、 HTML文書に自動的に変換してくれるツールです。 フリーウェアDoxygenは、 このJavaDocと同じように、 C++やC言語で書かれたソースプログラムのコメントからHTML文書を生成するツールで、
Doxygenの利用例で有名なのは、強力なUNIX&Windows向けのGUIクラスライブラリの Qtでしょう。 QtはC++言語のクラスライブラリで、 そのリファレンスドキュメントはDoxygenで生成されています。 ここでは、個人または非商用の小さなアプリケーションのソースドキュメント作成用として必要十分な基本機能のみを紹介しています。 Doxygenのマニュアルは非常に量が多いので、 興味をもたれた方ははまってみてくださいね。
● ダウンロードしよう
● ソースを書こう /*! * こめんと… */という、Qtのソースプログラムで使われている方法で、 JavaDoc互換は読んで字のごとしのJavaDocと同じフォーマットで、 /** * こめんと… */という形です。他にも1行コメントなどもありますが、 とっつきはこんな感じということで!
/** * \file KAKURETCL.C * \brief VisualBasicやPowerBuilderからロードして使えるDLLのソースプログラム * @author M.Urano - K.Ushirodani (C) 2000 * @date 2000-06-10 */ #include <string.h> #include <stdio.h> #include <windows.h> #include "tcl.h" #ifndef DISABLE_TK #include "tk.h" #endif #define STDCALL __stdcall #define TIS_MAX 10 /** * \struct TTCL_INTERP_STRUCT * \brief インタープリタ構造体 * * インタープリタは整数のハンドルで扱います。 * この構造体のインデックスがそのままハンドルになります。 */ typedef struct { Tcl_Interp* interp; /**< Tclインタープリタ */ int used; /**< 1...使っている 0...使っていない */ } TTCL_INTERP_STRUCT; static TTCL_INTERP_STRUCT tis[TIS_MAX]; char* appname = "aaa"; /** * \var tis * インタープリタ構造体の配列変数(static) * * それぞれ別のTclインタープリタを保持することができます。 */ /** * \var appname * 仮の実行形式の名前(static) * * Tcl_FindExecutableに渡す仮の名前です。 * Tcl_FindExecutableは、Tcl_Initの実行前に必ず実行する必要があります。 */ /** * \fn int Etcl_Start(void) * \brief インタープリタの作成 * * DLLエクスポート関数です。 * インタープリタを作って返します。 * \see Etcl_End * \see Etcl_Eval * \see Etcl_EvalFile * \return 成功時…正の整数(ハンドル)、失敗時…負の整数 */ DLLEXPORT int STDCALL Etcl_Start(void){ int i, found = 0; for(i=0; i<TIS_MAX; i++){ if(! tis[i].used){ tis[i].interp = Tcl_CreateInterp(); found = 1; tis[i].used = 1; break; } } if(! found) return -1; return i; } /** * \fn int Etcl_End(int id) * \brief インタープリタの解放 * * DLLエクスポート関数です。 * インタープリタを解放します。 * \param id Etcl_Startが返したハンドル * @see Etcl_Start * \return 0 ... OK, 1 ... エラー */ DLLEXPORT int STDCALL Etcl_End(int id){ if(id < 0 || id >= TIS_MAX || ! tis[id].used) return 1; /* interpreter not initialized */ Tcl_DeleteInterp(tis[id].interp); tis[id].used = 0; return 0; } /** * \fn int Etcl_Eval(int id, char* command, char* result, int maxlen) * \brief Tclコマンドの解釈実行 * * DLLエクスポート関数です。 * 指定した文字列をTclコマンドとして実行します。 * \param id Etcl_Startで作ったインタープリタのハンドル * \param command Tclコマンド * \param result 実行結果を格納する文字列領域 * \param maxlen resultに格納可能な最大文字数。これを越える場合、カットされます * @see Etcl_Start * \return 0 ... OK, 正の整数 ... エラー */ DLLEXPORT int STDCALL Etcl_Eval(int id, char* command, char* result, int maxlen){ /* (中略) */ return 0; } /** * \fn static int Etcl_Init(void) * \brief 初期化 * * 初期化関数です。ライブラリのロード時にDllMainに呼ばれ、 * インタープリタ構造体を初期化します。 * @see DllMain * @return 常に0 */ static int Etcl_Init(void){ int i; for(i=0; i<TIS_MAX; i++) tis[i].used = 0; return 0; } /** * \fn static int Etcl_Finalize(void) * \brief あとしまつ * * ライブラリのアンロード時にDllMainに呼ばれ、 * 解放されずに残っているインタープリタを解放して回ります。 * @see DllMain * @return 常に0 */ static int Etcl_Finalize(void){ int i; for(i=0; i<TIS_MAX; i++){ if(tis[i].used) Tcl_DeleteInterp(tis[i].interp); } return 0; } /** * \fn BOOL APIENTRY DllMain(HINSTANCE hInst, DWORD reason, LPVOID reserved) * \brief ライブラリのメイン関数 * @see Etcl_Init * @see Etcl_Finalize */ BOOL APIENTRY DllMain(HINSTANCE hInst, DWORD reason, LPVOID reserved){ /* (中略) */ return TRUE; } /** * \fn BOOL APIENTRY DllEntryPoint(HINSTANCE hInst, DWORD reason, LPVOID reserved) * \brief ライブラリのエントリポイント * @see DllMain */ BOOL APIENTRY DllEntryPoint(HINSTANCE hInst, DWORD reason, LPVOID reserved){ return DllMain(hInst, reason, reserved); } /* end. */ 上の例は先述の「隠れTcl DLL」を作るソースプログラムを抜粋したもので、 名前を kakuretcl.c とでもしましょう。 色が赤いところがJavaDocに認識されるコメント部分で、 各関数、構造体、大域変数、typedef、#defineなどに対するコメントを適宜書くことができます。 @see とか \brief とかが何なのかというのはすぐ想像がつくと思うので、 細かくは省きますね。あと先頭が@だったり\だったりというのは? どちらでもよかったんでしたっけ(うろ覚え) もっと細かい指定をすると美しいドキュメントにすることができるんだろうと思いますが、 先述の通り個人とか組織内レベルでとりあえず出せればいいにゃーといういい加減スタイルなので、これで強行してしまいます。
● ドキュメントを生成しよう まず、Doxygenのコンフィグレーションファイルを作ります。 dos> C:\the\path\of\doxygen -g hogeratta.cfgとすると、「hogeratta.cfg」というコンフィグレーションファイル (の雛型)が作られます(ファイル名は何でもOKです)。 そして、テキストエディタでこれを適宜編集するのですが、 最低限編集が必要な項目は次の7つだけです。 PROJECT_NAME = "KAKURETCL LIBRARY" PROJECT_NUMBER = 0.10 OUTPUT_DIRECTORY = C:\Usr\Ushirodani\kakuretcl\doc OUTPUT_LANGUAGE = Japanese EXTRACT_ALL = YES INPUT = /usr/ushirodani/kakuretcl FILE_PATTERNS = *.cPROJECT_NAMEは、 ドキュメントのタイトルに使われる名前を適当に指定します。 PROJECT_NUMBERはバージョンで、 これも自由に決められます。 OUTPUT_DIRECTORYは出力ドキュメントを格納するトップディレクトリを指定します。 OUTPUT_LANGUAGEはドキュメントのヘッダー・フッターに自動的につけられる文章の言語です。 まさか、プログラマが書いたコメントを翻訳してくれると思った人はいないですよね? 私だけですよね?(ネタ) おっと、そんなことより、ここで日本語を指定したとき使われる文字コードは日本語EUCです。なので、この場合、 ソースプログラム内のコメントも日本語EUCコードで書く必要があるのに注意してください。 私はMeadowという、 シフトJISでも日本語EUCでも書けるテキストエディタを使っているので、 これなら簡単です。 EXTRACT_ALLはC言語のときは必ずYESにしときましょう。 INPUTとFILE_PATTERNで読みこむ対象にするソースファイルを指定します。 これらのほか、「このディレクトリのファイルなんだけど、 これとこれはテストプログラムなので対象から外してくれえ」 などの指定もできます。 このほか、「俺はLaTeX形式は作らなくていいよ」 「画像ファイルも使うよ」というような細かい指定も全部このコンフィグレーションファイルで可能なので、英語のコメントを見ながら設定していけばよいでしょう。 コンフィグレーションファイルができたら、いよいよ実行です。 dos> C:\the\path\of\doxygen hogeratta.cfg結果はもちろんWebブラウザで確認できます。 Doxygenで生成したドキュメントの著作権は、 たぶん「生成した人」でOKだと思うのですが、 細かいことは勉強中です。日本語の資料がないか探しているところです。 |