(再送)すみません、昨日送信してしまった、全体的に文字化けしたメールを文字
化けしないように修正して再送します。
吉田様、皆様
吉田様のご厚意で、日本語環境でビルドした際にしか起こらないビルドエラーに
対応するソースコードの修正をアップストリームへの反映の交渉をしていただけ
るとのことのため、僕が遭遇した日本語環境でしか起こらないビルドエラーと対
策を列挙します。どう英訳しようか悩んでいたところに渡りに船です。よろしくお
願いします。下記の3点になります。
(1) idlc.exeがstd::abortする
(2) filter-showIncludes.awkが失敗する
(3) utf-8のソースファイルのコンパイルが失敗する
また、これらの問題は、英語版のWindowsでも言語環境を日本語にしたり、日本
語版VisualC++をインストールすることで再現できるはずです。逆に、日本語版
のWindowsでも言語環境を英語にし、英語版VisualC++を入れることで再現しなく
なります。
--
(1) idlc.exeがstd::abortする
ビルド中にidlc.exeコマンドを実行しているようなのですが、これが引数などを解析する
際にsal/textenc/textenc.cxxの383行目付近、
if(!module_.loadRelative(&thisModule,SAL_MODULENAME("sal_textenc"))){
SAL_WARN("sal.textenc","Loadingsal_textenclibraryfailed");
std::abort();
}
で、 std::abortでこけます。 原因は、shift_jis用のエンコーディングの関数をsal_textenc.dll
から読む際、sal_textenc.dllがまだビルドされていないことがあるためです。ちなみに、
asciiやutf-8は特別扱いされ、それらの言語だとstd::abortにはならず正常に動作しま
す。そのため、環境変数SOLAR_USER_RTL_TEXTENCODINGを11に指定するな
どし、内部のエンコーディングを強制的にasciiにしてしまえばいちおう動きます。が、
あまりよくない気がします。ビルドの順序を修正すれば解決になると思いますが、今
は調べている時間がないです。
(2) filter-showIncludes.awkが失敗する
filter-showIncludes.awkは、VisualC++のコンパイラ本体のcl.exeから標準出力
された依存関係の文字列を解析するスクリプトのようです。ただ、cl.exeの出力
は各国語版によって内容が変わるので、その内容をconfigureスクリプトで拾っ
て環境変数SHOWINCLUDES_PREFIXに格納し、filter-showIncludes.awkはその環境
変数を利用しているのですが、その中に下記のコードがあります。
showincludes_prefix = ENVIRON["SHOWINCLUDES_PREFIX"];
regex = "^ *"showincludes_prefix" *"
if ($0 ~ regex){
これは、該当の環境変数から正規表現を作っているコードですが、日本語版
cl.exeの場合、その内容はshift_jis「メモ:インクルードファイル:C:\Temp
\stdio.h」などになります。バイナリデータでは
83 81 83 82 3a 20 83 43 83 93 83 4e 83 8b 81 5b |....:.C...N...[|
83 68 20 83 74 83 40 83 43 83 8b 3a 20 20 43 3a |[email protected]..: C:|
5c 54 65 6d 70 5c 73 74 64 69 6f 2e 68 0d 0a |\Temp\stdio.h..|
となり、正規表現の特殊文字『[』が含まれます。これにより、スクリプトが正
規表現でマッチを行っている箇所でエラーになり、依存関係の調査に失敗しま
す。これが修正されるパッチを作りました。
https://gerrit.libreoffice.org/gitweb?p=core.git;a=commitdiff;h=de1188d44e2daa9c7b600ffe74bd588089f7dbdb
これは、正規表現をつかわずindex関数を使うように修正するものです。このコミ
ットをうまい具合にに整形してupstreamへの反映依頼をお願いします。
(3) utf-8のソースファイルのコンパイルが失敗する
cl.exeはソースファイルを読むとき、bomがついている場合はutf-8として、つい
ていない場合はshift_jisで読みます。そのため、shift_jisと相性の悪いutf-8
のデータがソースに書いてあるとコンパイルに失敗してしまいます。
該当ソースは下記です。
sw/qa/extras/ooxmlexport/ooxmlexport.cxx
sw/qa/extras/rtfexport/rtfexport.cxx
sw/qa/extras/rtfimport/rtfimport.cxx
同様のエラーが過去(https://issues.apache.org/ooo/show_bug.cgi?id=76970)
にあり、そのときはutf-8文字列を16進のエスケープ文字に変換したようです
が、今回列挙したコードで利用されているutf-8文字列は、たとえば下記のよう
なものになります。
OUString("sin α ± sin β = 2 sin {1} over {2} left ( ... ");
これをエスケープしてしまうと次のソースになります。
OUString("sin \xCE\xB1 \xC2\xB1 sin \xCE\xB2 = 2 sin {1} over {2} left (
... ");
このようにエスケープ後は意味不明なソースになってしまうため、私としては、
該当ソースにbomを付加する対応をお願いしたいです。副作用として、古いgccで
はbomつきのutf-8を読もうとすると失敗することがあります。古いosxのxcode付
属のgccが危なそうです。
以上になります。
--
茂木勇
--
Unsubscribe instructions: E-mail to [email protected]
Posting guidelines + more: http://wiki.documentfoundation.org/Netiquette
List archive: http://listarchives.libreoffice.org/ja/discuss/
All messages sent to this list will be publicly archived and cannot be deleted