ここ数日、何で突然 doxygen のソースコードを引っ張ってきて、あーだこーだやり始めたかと言うと「日本語ファイル名が付いてるファイルが一切扱えない」という問題を解決したかったからなのですよ。
理由は次のとおり。
- doxywizerdで、日本語ファイル名/フォルダ名が化けるのがムカついた。
- Skipと出て扱えて結局スルーされるんですが…なんつーか、見た目が嫌(ぉ
- ソースコードファイル自体にはに日本語ファイル名は無いものの、リソースファイル等に日本語ファイル名が利用されてる。
- 日本語ファイル名が扱えるようになったら、ついでに「プロジェクトを構成しているファイルの1つ」として、出力結果に登録されるようにしてみようかしら。 (<- 今考えるとココがなんか変)
でまぁ、どーせファイルの列挙でマルチバイトを一切考慮して無いんだろうと思い調べていったら、まぁ案の定だったんです。 が、doxygen 側の問題じゃなくて、利用しているライブラリ (古い)QTライブラリ に問題が有る事が解ったのですよ。
…この発見が大惨事の始まりだったんです……
ライブラリ最新のものに更新しようぜ!
付属されているQTライブラリの年度を見ると「2000年」。こりゃー古いわ。
当時は大して UNICODE は流行っていなかった -> ライブラリの対応も貧弱 という状況だった気がするので、ASCII以外を考慮したアプリ(==コード)の方が珍しかったような気がします。*1
しかし時は既に 2006年! インターネットによる国を超えた交流が手軽になり、UNICODEが愛用される時代になりました。 もう、QTライブラリ側も 日本語とか普通に扱えるようになってるだろう -> ライブラリの文字列操作関係更新したら上手く行くんじゃね!? とか思っちゃったんですねー。
今から考えてみればバカでしたねー。 オープンソースなプロジェクト == いろんな人が見てるのに、なんであえて古いライブラリが付属してるとか考えられていればねー…あー。orz
QTライブラリとお近づきになる。
というわけで、ライブラリの最新版を引っ張ってくることにしたのです。 …が、マズですねぇ…サイトが重めでちょっと萎える。それでも無事発見して、DLしたのですが、完了するまでに10分ぐらいかかったりと割と無駄に疲れてきます。orz
ソースコードを抽出してみた
DLしたライブラリを見るとえらい数のコードがありましたが、目的の「文字列操作関係等の小物ツール群」は1つのフォルダに入っていたので*2、それをごっそり doxygen の方にコピー。include 関係を微調整すれば何とかなるだろう…
…かと思ったのですが、まぁ案の定上手く行かず。(ぉ
どうも "configure を通せ!" なんていわれちゃったわけですよ。 じゃぁとりあえず configure するかと。
configure してみた
付属のドキュメントを見ると、-platform オプションで現在利用しているコンパイラとかを指定しなくてはならない様で*3、VC用としては win32-msvc 等が定義されている模様。
というわけで
>configure -platform win32-msvc
なんてコマンド打ってみると「"win32-msvc" なんてサポートしてねぇよ。ReadMe 見て、コマンド構文もう一度見直せやヴォケが」とか言われる。 ...はて? ReadMe には確り win32-msvc が定義されている訳ですが…大文字小文字等も試してみましたが、前々ダメ。 おまえは何やねん…。
しゃーないので、情報集めてみると、ム板のQTライブラリスレで「オープンソース版は MinGW じゃないとビルドできません」とかねもうね。
………ReadMe にそう書いておいてくれよ!!!(涙 orz*4
それでも VC で頑張ってみる
VCじゃ利用できないのか…なんて思いましたが、幸い無いなことに、オープンソース版でも VC等の商用コンパイラでビルドできるパッチが 公開されている 事を知り何とか助かった感じです。
でなんとか configure が完了。 本当にソースコードが正常にビルドできる状態になったのか不安であったので、試しに make してみたのです。
……1時間30分ぐらいコンパイルしてましたね。ハハハ…。orz
ソースコード適正確認 - 再度 doxygen への統合作業へ
今度は make ファイル等も生成されているので、コンパイラオプションを確認しつつ、小物ツール以外の必要なファイルをコピーして、VCのプロジェクト設定で適正なpathを通し、プリプロセッサを定義して…
よし、static link library が(多分)生成できた!!!
よしよし、あとは doxygen 側と上手く統合するだけ!! がんばるにょ!!
fatal error C1083: include ファイルを開けません。'xxx.h': No such file or directory fatal error C1083: include ファイルを開けません。'yyy.h': No such file or directory fatal error C1083: include ファイルを開けません。'zzz.h': No such file or directory
orz
大体はpathの設定がおかしかっただけだったりしたんですが、特定の少数のヘッダは そもそも無くなってたりしましてね、もうね。
あぁ、
こりゃ、
無理だ。
━━その時、空は美しい黄金色に輝いていた…
さすがに疲れた
正直やる気低下してしまったので、RSSでも巡回して気分転換してたのですよ。面白そうなネタでも探してこようではないかと。blogも更新するべきですし。
で、一通りネタをかき集めてblogの記事書いていたら、書き込み終わり間際に プニルが落ちるとかね。もうね。 ここでノックアウトですよ。
記事が消えたってのも問題ですが、プニル再起動させたら、巡回していたウィンドウ各種がごちゃごちゃになってしまい、わけわけめの状態になるってのも問題な訳で…
これは正直辛かった。
これが昨日の更新時におきた事件でした。
既存のライブラリを弄繰り回す。
ひとまず飯食って一息入れてから作業開始。
QTライブラリ側で発生しているマルチバイト文字列の問題は internalAsciiToUnicode という関数で発生している事は解っていたのです。
いやー、この関数の実装見たときはビックラこきました。
// 概要
static QChar* internalAsciiToUnicode(const char* str)
{
int l = strlen(str);
QChar* result = new QChar[l];
// unicode化…らしい
for(int i = 0; i < l; ++i)
result[i] = str[i];
return result;
}
QTライブラリ側で用意されている char型 に1文字ずつ代入していくんですが、代入元はどう頑張っても char 単位なわけで。 これで unicode 化できたら感動だよなー とか思ってました。(ぉ
結局この関数内を ::MultiByteToWideChar …だと、WinAPI になってしまうので、C標準関数である mbstowcs を利用して unicode化し、1文字ずつコピーするようなコードにしました。*5
で、この変更はとりあえずは上手くいった模様で、日本語名のファイルが "Skip" と表示されなくなって良かった………かと思ったんですが、ドキュメントを吐いてくれなかったんですよ。…はて?
再度トレスしてみると、ファイルのフィルタリングで問題がある模様でした。
Doxygen には、利用するファイル名だけを抽出する FILE_PATTERNS という項目があります。ここに *.cpp, *.h, *.java なり記述して、ソースコードだけを抽出します。
で、内部で正規表現を利用してマッチングを行っているようなのですが、折角 Unicode1文字単位で QChar に格納したのに、char 単位で処理が行われるような箇所があるようで、こりゃー修正しないとなーと。
………ん?
「ソースコードだけを抽出します」?
当初やりたかったこと。
現実
- FILE_PATTERNS によって、ソースコードファイルのみが抽出されコードを解析しファイルの一覧を含むドキュメントが生成される。
doxygen がメモリリークしているのではないか? という件について
知り合いからツッコミが入りまして
doxygen.cpp(8713) に確り delete xxx ってあるじゃネーかボケェ!! まぁただ、コメント行になってるから機能して無ぇけどなー!!
マジか!?
// delete Doxygen::symbolMap; <- we cannot do this unless all static lists // (such as Doxygen::namespaceSDict) // with objects based on Definition are made // dynamic first
マジだ。(ただ、バージョンが違ったようなので、別の行 (8356) にありました。)
"we cannot do this unless all static lists with objects based on Definition are made dynamic first." ? おまえは何を言っているんだ?
私達はxxxなのでコレ(delete)を行えません。
xxx = 全ての静的リスト と 基本となる Definition クラス*6のオブジェクトが最初動的に創られる?
おまえは何を言っているんだ?(※大学院2年)
んまぁでも、複雑な事情により delete をしていない事は解りました。ちなみに、実際に delete を有効にしてみたところ、落ちるときと落ちないときと。 なんちゅーか、ちょっと設計ミスちゃったよ臭いものを感じる気がします。(ぉ
ただ、delete に成功したらリークがなくなるのかと思ったのですが、それでも doxygen.cpp(8296)*7 の ParserManager ってのがリークしてると VCのデバッグライブラリから報告されます。delete が関係が上手く行っていないようなので、その余波を食らっているだけなのかもしれませんが…。
まとめ
えらい長ったらしい文章になったので、最後にまとめてみる。
- doxygen の日本語ファイル名をどうにかし様と思ったけど、その必要性が無いことが後に発覚。結局無意味に。orz
- doxygen は、現状大人の事情によりあえてメモリリークを起こしている。
- QTライブラリの古いヤツは、ascii -> unicode 化に問題がある。
- QTライブラリのオープンソース版は、そのままでは商用コンパイラで make する事が出来ない。 ただし、パッチを適用すればOK。
- 辛い事もあったけど、私は元気です。
さーて、数日間が無駄になったぞー。ひゃっはー!
余談
ParserInterface を派生して、パーサを増やせばいろんな言語に対応できる様。 …つまり、リソース用の「ファイルの中身解析は何もしない」パーサを追加してあげれば、目的の「ファイル一覧」にリソースファイルの追加が実現できるのでは無いか?
…なんて思ったけど、日本語ファイル名の問題解決してないし、もういいや… orz
*1:まだ Win9x が主流だった頃のハズ -> UNICODE 対応貧弱 -> みんな使わない って感じだった気がしますし。
*2:それでも corelib ってフォルダ名の中にありましたケド
*3:オプションつけないと %QMAKESPEC% を見に行く様
*4:ちなみに、今同じように configure すると「MinGW じゃないとビルドできません」とメッセージが出てくる。…なんで?私の苦労は一体…
*5:ちなみに、UNICODE から multibyte に戻すのには WideCharToMultiByte 使ってるご様子でした……
*6:そんなクラスがあった
*7:1.4.7_20060810