Miranda コンパイル方法

本ページでは本家svn木から入手したソースファイルを手元でコンパイルする方法をまとめます。 なお、コンパイルには無償で入手できるVisual C++ Express版を用います。

※MirandaにはMinGW用のMakefileも入っていますが、このMakefileが作成後メンテナンスされていないこと、 及びMinGWのWin32APIに問題があり、MinGWでコンパイルした場合の実行結果に問題がでる恐れがあることを理由に推奨されていません。

http://forums.miranda-im.org/showthread.php?23614-Building-Miranda-with-MinGW

Miranda ソースの問題点

本家サイトのsubversionで公開されているソースを取得し手元でコンパイルしようとしても、 まずエラーが発生してコンパイル完了までたどり着けません。

これには以下の原因があります。

  1. 一部のソースコードが古いため、古い版のVisual C++が必要となる個所がある
  2. 同じ理由で、今のVisual C++には含まれないヘッダファイルを参照している
  3. ソースコードの文字コードが1so8859-1(Latin-1)のため日本語Windows環境では文字化けする

環境構築 - 旧版VC++必要問題

Mirandaのpluginの一つはコンパイルに最新版のVisual C++ 2010ではなく2008を使うことを前提としています。 VC++ 2010環境でコンパイルすると、2008のライブラリが存在しないためリンカがエラーを吐きます。 この問題の対策は、VC++ 2010に加えて2008もインストールすることです。

Mirandaをコンパイルするために必要なプログラムの一覧を以下に示します。

  • Visual C++ 2010 Express

ダウンロードページ→ http://www.microsoft.com/japan/msdn/vstudio/express/

  • Visual C++ 2008 Express

ダウンロードページ→ http://www.microsoft.com/japan/msdn/vstudio/2008/product/express/

  • Windows SDK

Windows7, .NET FrameWork 4用→ http://www.microsoft.com/download/en/details.aspx?id=8279
Windows7, .NET FrameWork 3.5SP1用→ http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=3138
※ファイル名が同じなので注意のこと。なお、.NET Frameworkは事前にWindwos Updateで最新版に更新しておきます。

また、それぞれをインストールするたびにWindows Updateを実行してパッチをあてるようにします。

環境構築 - 存在しないヘッダファイル問題

Mirandaをコンパイルすると、ヘッダファイルwinres.hとafxres.hが存在しないというエラーになります。 この解決法は以下の通りです。

* winres.h
ソース木の\miranda\include\mingw にファイルwinres.hがあるので、これを以下のパスにコピーします。

  • C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include
  • C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include

* afxres.h
以下の内容:

#ifndef _AFXRES_
#define _AFXRES_
#include <windows.h>
#define IDC_STATIC -1

#endif // _AFXRES_
のファイルafxres.hを以下のパスに作成します。

  • C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include

ソースコード文字列がLatin-1のため日本語Windowsでコンパイルできない問題

Mirandaのソースコードは数千のファイルから構成されていますが、そのうちの約350個のファイルの文字コードは ASCIIではなくiso8859-1(Latin-1)です。しかも多くはコメントではなく文字列リテラルに使用されています。

コンパイラがgccであるならば、よほどのことがない限りコンパイルに文字コードが問題を引き起こす、ということはありませんが、 Visual C++ではそうはいきません。現実問題、現時点で以下の様なエラーを引き起こしてくれます。

5>  viewmodes.cpp
5>SRC\viewmodes.cpp : warning C4819: ファイルは、現在のコード ページ (932) で表示できない
文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してください。
10>  yahoo_httplib.c
5>SRC\viewmodes.cpp(87): error C2001: 定数が 2 行目に続いています。
5>SRC\viewmodes.cpp(88): error C2143: 構文エラー : ')' が 'return' の前にありません。

Visual C++ ではファイルにASCIIコードにない文字を発見した場合には、以下の様に処理するようです。

  1. ファイル先頭にBOM(Byte Order Mark - Unicodeであるか否かを示すバイト列)がついているか調べる
  2. BOM付きファイルであるならばUnicodeとして処理する
  3. BOMなしファイルであるならば、その環境のデフォルトコードページ(日本語Windowsならばcp932、いわゆるSJIS)として処理する

つまり、ファイルがiso8859-1で書かれているにもかかわらずcp932として扱おうとし、結果文字化けが発生してエラーとなるのです。

iso8859-1をcp932に変換することはできないので、Visual C++で扱えかつiso8859-1から変換可能な文字コードであるBOM付きUTF-8に ファイルを変換することにします(実際のところBOM付きであるならばUTF-16でもUTF-32でもいいのですが、 UTF-8であるならばメモ帳でも開けます。

この変換は、例えばUnix環境であるならば、findコマンドとuconv( http://site.icu-project.org/ )あたりを使用すれば簡単に実現できます。 ですがWindows環境では少々厄介です。 それに、iso8859-1で書かれているのは一部のファイルであり、ASCIIで書かれたファイルもあります。それらはわざわざUTF-8に変換したくは ないものです。

そこで、指定したパス以下のC/C++ソースコードに関して、必要な場合に指定した文字コードからBOM付きUTF-8に変換するユーティリティを作成しています。

変換対象のフォルダとしてsubversionで取得したMirandaのソース木のフォルダ(例えばstable)、文字コードとしてiso8859-1を指定し、 変換実行すれば処理されます。再度svn updateする場合は、その前に逆変換しておくとよいでしょう。

実際のコンパイル手順

実際のコンパイル手順は以下の通りです。

  1. subversionを用いてソースコードを取得する
    URLは本家サイト(http://code.google.com/p/miranda/source/checkout )参照のこと。なお、このページの例で書かれたURLはα版なので、 安定開発版を使用する場合はbranches/stableを使用します。 TortoiseSVNならば、「インポート」で「リポジトリのURL」として
    http://miranda.googlecode.com/svn/branches/stable/
    
    を指定して実行するとよいでしょう。
  2. BOM付きUTF-8へコード変換する
    前述のユーティリティを用いるなどしてBOM付きUTF-8にコード変換します。
  3. ソリューションファイルを開く
    ファイルstable\miranda\bin10\miranda32.slnをダブルクリックし、VC++ 2010で開きます。
  4. ソリューション構成などを設定する
    ソリューション構成を「Release Unicode」に、「ソリューションプラットホーム」を「Win32」に設定します。
  5. ビルドを開始する
    ソリューションエクスプローラーから「ソリューション'miranda32'」を選択し右クリック、「ソリューションのビルド」を選んで コンパイル開始します。無事終了したならば、stable\miranda\bin10\Release Unicode\下にバイナリが生成されるので、 それを使用します。

以上でMirandaを手元でコンパイルすることが可能になります。

FrontPage