RVCT3.0 のエラー形式

RVCT3.0 の ARM コンパイラは、ちゃんとコンパイラオプションを指定することで日本語エラーを出力してくれます。英語を直訳したような日本語な感じもするけど、それでも自分にはとっても便利。
以下のフラグを設定すると日本語になります。

--message_locale ja_JP

また、このエラーメッセージの形式も指定することができて、--diag_style の次に arm, ide, gnu のどれかを指定します。
それぞれ以下のようになります。

// arm の場合
"test.c", line 352: Error #11-D: unrecognized preprocessing directive
// ide の場合
test.c(352,10) : error #11-D: unrecognized preprocessing directive
// gnu の場合
test.c:352:10: Error: #11-D: unrecognized preprocessing directive

VisualStudio で ARM コンパイラを使う場合は ide を指定しておけば、ダブルクリックしたときにちゃんとその行番号に飛べるはずです。
なぜなら、上記の ide のエラー表示は以下の書式を満たしているからです。

出力の書式は次のとおりです。

{filename (line# [, column#]) | toolname} : 
  [anytext] {error | warning} code####: Localizable String
   [
      any text
   ]
カスタム ビルド ステップまたはビルド イベントの出力の書式設定

これで日本語のエラー表示ができて、しかもそのエラーをダブルクリックするだけでその行番号へ飛べるはずです。


しかし、しかし。


日本語のエラー表示と ide を指定した場合のエラー表示は以下のようになります。

test.c(35210) : error #11-D: ほにゃらら

↑の書式と見比べれば分かりますが、line の次の文字が「,」でなくなっているため、VisualStudio のエラー形式ではないと判断されて、ダブルクリックで飛ぶことができなくなってしまうのです。


まあ、この中途半端な対応に文句を言っても仕方が無いので、とりあえず出力される文字列を変換するための exe を C# で適当に書きました。

// Pipe.exe
static void Main(string[] args)
{
    args = args.Select(s => s.Trim('\"')).ToArray();
    ProcessStartInfo info = new ProcessStartInfo(args[0], "\"" + string.Join("\" \"", args, 1, args.Length - 1) + "\"");
    info.RedirectStandardError = true;
    info.UseShellExecute = false;

    Console.WriteLine("command: " + info.FileName);
    Console.WriteLine("arguments: " + info.Arguments);
    Process p = Process.Start(info);
    Console.Write(p.StandardError.ReadToEnd().Replace('、', ','));
    p.WaitForExit();
}

与えられた引数をそのまま実行するだけのプロセスです。このプロセスは、標準エラーに出力される文字列を '、' から ',' に変換して出力します。

Pipe.exe armcc -c -o test.o --message_locale ja_JP --diag_style ide test.c

と書けば、ちゃんと

test.c(352,10) : error #11-D: ほにゃらら

となってくれます。


結局やることは前のバージョンと同じ……orz