Wine で Sims2 をプレイする (ビルド)

必要なパッケージをインストール
Wine の実行やビルドに必要なパッケージをインストールします。

Wine の実行に必要なパッケージは、公式の Wine をインストールすれば早いです。
公式の Wine と、自分でビルドした Wine は、多少手順は必要ですが、共存させることができます。

ビルドに必要な開発用パッケージは、それぞれ手動でインストールする必要があります。

なお、configure 時に --without-* オプションを付ければ、いくつか不要な機能を使わないようにすることができます。
Sims2 専用の Wine として使うなら、印刷やネット関連など、明らかに必要のない機能を省いて、無駄なコンパイルを減らせます。
また、それに関連するパッケージもインストールしなくて済みます。
コンパイラについて
gcc または clang でコンパイルできます。
clang の方がコンパイルが速いので、おすすめです。

64bit 環境で gcc を使ってビルドする場合は、32bit のビルドを行うために gcc-multilib パッケージが必要な場合があります。
すでに gcc パッケージがインストールされている状態で、gcc-multilib パッケージを新たにインストールしようとすると、
gccgcc-multilib に置き換えることになります。

※ Arch Linux では、2017/12/08 の時点で gcc-multilib パッケージが廃止されたので、gcc パッケージのみで OK です。
Ubuntu
必要な開発用パッケージについては、Ubuntu Packages Search で調べることができます。

1. Search の Keyword 欄で 「wine」 と入力し、検索する。
2. 「wine-development」 または 「wine-stable」 のリンクを開く。
3. 右側にある "Download Source Package" 部分の 「wine-***_.dsc」 ファイルをダウンロードします。
4. ダウンロードしたファイルをテキストエディタで開きます。
Build-Depends:」 の部分に、ビルドに必要な依存パッケージのリストがあるので、それを参考にインストールしてください。
Arch Linux
(参考) Arch Linux (package) - wine

※ Arch Linux 64bit 環境で multilib リポジトリを有効にしていない場合は、先に設定しておいてください。
 設定方法: Multilib - ArchWiki

インストール方法
# pacman -S --needed <package...>

--needed : すでに最新バージョンがインストールされているパッケージをスキップします。
このオプションがないと、デフォルトで再インストールされてしまいます。

ビルドに必要な追加パッケージ
以下は、Wine のすべての機能を使う場合に必要なパッケージ。
Wine 実行に必要なパッケージは省略しています。

# コンパイラ (いずれか)

clang : clang
gcc   : gcc または gcc-multilib

# メイン

autoconf bison perl fontforge flex libxslt
ncurses : --without-curses で不要

# X11 関連

libxinerama libxcomposite libxmu libxcomposite libxxf86vm

# サウンド関連

libpulse : --without-pulse で不要
alsa-lib alsa-plugins : --without-alsa で不要
openal : OpenAL
mpg123 : MP3 再生

# OpenGL

mesa libgl opencl-icd-loader opencl-headers

# マルチメディア関連

v4l-utils : ウェブカメラなど。--without-v4l で不要
gst-plugins-base-libs : 各コーデックサポート

# ネット関連

gnutls  : SSL/TLS 認証。--without-gnutls で不要
libldap : LDAP。--without-ldap で不要
samba   : Windows ネットワーク。--without-netapi で不要

# 32bit 版ライブラリ (64bit 環境で必要)

lib32-libxslt lib32-giflib lib32-libpng
lib32-libxinerama lib32-libxcomposite lib32-libxmu lib32-libxxf86vm lib32-libxcomposite
lib32-openal lib32-libpulse lib32-alsa-lib lib32-alsa-plugins lib32-mpg123
lib32-mesa lib32-libgl lib32-opencl-icd-loader
lib32-gnutls lib32-libldap
lib32-gst-plugins-base-libs lib32-v4l-utils
Wine のソースコードをダウンロード
まずは、Wine をビルドするための作業用ディレクトリをどこかに作成してください。

次に、http://dl.winehq.org/wine/source/ から、Wine のソースコードをダウンロードして、その作業用ディレクトリ内に置きます。

Wine のバージョンについて
Sims2 が動作するバージョンは、1.8-rc21.9.6 と、2.22 以降です。


アーカイブ展開
ダウンロードしたソースコードのアーカイブを展開します。

(例) 作業用ディレクトリ "~/wine-build"、Wine 2.22 の場合。

$ cd ~/wine-build
$ tar xf wine-2.22.tar.xz

~/wine-build
 ├ wine-2.22.tar.bz2
 └ wine-2.22
  └ aclocal.m4, configure ...
Wine のソースコードを修正する
(参考) http://bugs.winehq.org/attachment.cgi?id=52904 のパッチファイル

上記のパッチについて
以下では、上記のパッチを元に、メッセージ出力部分などの、なくてもいいような処理は取り除いています。

また、上記のパッチでは、"dlls/wined3d/directx.c" も変更されていますが、これはシェーダモデルのバージョンを 2 に固定しているだけです。
シェーダモデルのバージョンは、後からレジストリを編集して変更できるので、directx.c の修正は必要ありません。

修正について
Wine のバージョンや、関連するライブラリのバージョンによって、修正箇所が異なったりするので、テキストエディタを使って、手動で修正してください。

より上が修正元の部分で、 より下が修正後のテキストです。
テキストエディタの検索機能を使って修正元のテキストを検索した後、その部分を修正してください。
configure
ソースのトップディレクトリにある configure ファイルを修正します。

opencl.h
  OpenCL/opencl.h \
    ↓
  CL/opencl.h \

Linux では、opencl.h があるディレクトリは OpenCL ではなく CL になっています。
Mac OS X の場合は、そのままにします。

libOSMesa
Wine 1.9.6 以前で、configure スクリプト実行時に以下のメッセージが出る場合は、修正します。
Wine 2.22 以降の場合は、必要ありません。

configure: libOSMesa 32-bit development files not found (or too old), OpenGL rendering in bitmaps won't be supported.

libOSMesa の開発用ファイルが見つからないとありますが、libOSMesa.so は mesa の開発用ファイルがインストールされていればちゃんと存在しているので、強制的に存在しているものとして進めさせます。

LIBS="-lOSMesa $X_LIBS -lm $X_EXTRA_LIBS $LIBS"
  ↓
LIBS="-lOSMesa -lGLU -lGL $X_LIBS $X_PRE_LIBS $XLIB -lm $X_EXTRA_LIBS $LIBS"

fi
            if test "x$ac_cv_lib_soname_OSMesa" = "x"; then :
  case "x$with_osmesa" in

  ↓

fi
ac_cv_lib_soname_OSMesa=libOSMesa.so
            if test "x$ac_cv_lib_soname_OSMesa" = "x"; then :
  case "x$with_osmesa" in
dlls/d3d9/d3d9_private.h
#define D3D9_MAX_VERTEX_SHADER_CONSTANTF 256
  ↓
#define D3D9_MAX_VERTEX_SHADER_CONSTANTF 1024
dlls/d3d9/d3d9_main.c
1. Direct3DCreate9Ex の後に追加
以下の部分に、指定テキストを新しく追加します。

HRESULT WINAPI DECLSPEC_HOTPATCH Direct3DCreate9Ex(UINT sdk_version, IDirect3D9Ex **d3d9ex)
{
    ...
    return D3D_OK;
}

!!! この間に追加 !!!

/*******************************************************************
 *       Direct3DShaderValidatorCreate9 (D3D9.@)

追加するテキスト:
static int uisv_refcount;

static HRESULT WINAPI uisv_QueryInterface(void *iface, REFIID riid, void **out)
{
    return E_NOINTERFACE;
}

static ULONG WINAPI uisv_AddRef(void *iface)
{
    ULONG refcount = InterlockedIncrement(&uisv_refcount);
    return refcount;
}

static ULONG WINAPI uisv_Release(void *iface)
{
    ULONG refcount = InterlockedDecrement(&uisv_refcount);
    return refcount;
}

static HRESULT WINAPI uisv_DefaultUnimp()
{
    return E_NOTIMPL;
}

static HRESULT WINAPI uisv_1par(DWORD p1)
{
    return S_OK;
}

static HRESULT WINAPI uisv_4par(DWORD p1, DWORD p2, DWORD p3, DWORD p4)
{
    return S_OK;
}

static HRESULT WINAPI uisv_5par(DWORD p1, DWORD p2, DWORD p3, DWORD p4, DWORD p5)
{
    return S_OK;
}

static const void *undefinedInternalShaderValidator_vtbl[] =
{
    /* IUnknown */
    uisv_QueryInterface,
    uisv_AddRef,
    uisv_Release,
    /* interface */
    uisv_4par,
    uisv_5par,
    uisv_1par
};

2. Direct3DShaderValidatorCreate9 関数
1 のすぐ下の関数を置き換えます。

void* WINAPI Direct3DShaderValidatorCreate9(void)
{
    static int once;

    if (!once++) FIXME("stub\n");
    return NULL;
}

   ↓

void* WINAPI Direct3DShaderValidatorCreate9(void)
{
    static int once;
    static void *vtbl_addr=undefinedInternalShaderValidator_vtbl;

    if (!once++) FIXME("stub\n");
    return &vtbl_addr;
}
dlls/wined3d/shader.c
頂点シェーダ数の制限値を 256 から 1024 に変更します。

{WINED3D_SHADER_VERSION(1, 0), WINED3D_SHADER_VERSION(1, 1), { 0,  0, 256,  0, 12,  0}},
{WINED3D_SHADER_VERSION(2, 0), WINED3D_SHADER_VERSION(2, 1), { 0, 16, 256, 16, 12,  0}},
/* ...
 * ... */
{WINED3D_SHADER_VERSION(3, 0), WINED3D_SHADER_VERSION(3, 0), { 4, 16, 256, 16, 12,  0}},

   ↓

{WINED3D_SHADER_VERSION(1, 0), WINED3D_SHADER_VERSION(1, 1), { 0,  0, 1024,  0, 12,  0}},
{WINED3D_SHADER_VERSION(2, 0), WINED3D_SHADER_VERSION(2, 1), { 0, 16, 1024, 16, 12,  0}},
/* ...
 * ... */
{WINED3D_SHADER_VERSION(3, 0), WINED3D_SHADER_VERSION(3, 0), { 4, 16, 1024, 16, 12,  0}},
dlls/wined3d/wined3d_private.h
* Wine 2.22 以降の場合のみ。

#define WINED3D_MAX_VS_CONSTS_F 256
   ↓
#define WINED3D_MAX_VS_CONSTS_F 1024
dlls/secur32/schannel_gnutls.c
* Wine 1.9.6 以前で、GnuTLS のバージョンが 3.5 以降の場合のみ。

Wine 1.9.6 以前では、GnuTLS 3.5 以降の仕様に対応していないためコンパイルエラーが出るので、修正します。 (参考)

## バージョン確認方法 (コマンドがある場合)
$ gnutls-cli --version

extern int gnutls_cipher_get_block_size(gnutls_cipher_algorithm_t algorithm);
   ↓
static int (*pgnutls_cipher_get_block_size)(gnutls_cipher_algorithm_t algorithm);

以下の行を削除。
MAKE_FUNCPTR(gnutls_cipher_get_block_size);
programs/winhlp32/macro.lex.l
* flex のバージョンが 2.6.3 の場合のみ。

## バージョン確認方法
$ flex --version

flex 2.6.3 の場合、バグがあって programs/winhlp32 でコンパイルエラーが出るので、修正します。
2.6.3 以外の場合は必要ありません。

%option noinput nounput never-interactive 8bit
   ↓
%option noinput nounput never-interactive 8bit noyywrap

終端にある以下のテキストを削除。
#ifndef yywrap
int yywrap(void) { return 1; }
#endif
ビルド実行
ここから、ソースコードをコンパイルしていきます。

以下は、64bit 環境でコンパイルする場合の手順です。
64bit 環境の場合は、Wine の 64bit と 32bit 版を両方ビルドする必要があるため、2倍時間がかかります。

(参考) Arch Linux (AUR) - wine-gitPKGBUILD ファイル
ディレクトリ構成
まず、64bit と 32bit 版それぞれでコンパイルの作業ディレクトリを分ける必要があるので、Wine のソースのトップディレクトリ下に build32build64 ディレクトリを作成します。

(例)
~/wine-build
 └ wine-2.22
   ├ build32
   ├ build64
   └ aclocal.m4, configure ...
一部の機能を無効にする場合
Wine の一部の機能を無効にしたい場合は、configure 時に --without-* オプションを追加します。
無効にしたい機能があれば、あらかじめ決めておいてください。

Wine ソースディレクトリのトップで端末を開き、以下のコマンドを実行すると、指定できるオプションのリストが表示されます。

$ ./configure --help

--without-capiISDN のネット接続のサポートを無効にする。
使わないので、無効でいい。
--without-coreaudioCore Audio (Vista 以降で導入されたオーディオ API) を無効にする。
Sims2 の場合は使わないので、無効でいい。
--without-cups印刷のサポートを無効にする。
Wine 1.9.6 以前を使う場合、コンパイルエラーが出る場合があるので、無効にしたほうがいい。
--without-gphotoデジタルカメラ (カメラからの転送など) のサポートを無効にする
--without-gnutlsSSL/TLS の暗号化通信を使わない
--without-gsmGSM 06.10 codec (音声コーデック) を使わない。
Sims2 では使わないので、無効でもいい。
--without-netapiWindows 共有ネットワークを使わない
--without-ossOSS サウンドのサポートを無効にする。
ALSA や PulseAudio が使える環境なら必要ありません。
--without-pcapパケットキャプチャを使わない
--without-saneスキャナを使わない
--without-v4lウェブカメラや TVチューナーを使わない
Wine 2.22 以降
--without-udevplug and play を無効にする
64bit 版のビルド
まず、64bit 版から先にビルドします。
build64 ディレクトリに移動して、以下のコマンドを実行します。

$ cd build64

## gcc を使う場合 (-g を消す)
$ export CFLAGS="-O2"

## clang を使う場合
$ export CC=clang
$ export CXX=clang
$ export CFLAGS="-std=gnu89 -O2"

## 準備とコンパイル
$ ../configure --prefix=/usr/local --libdir=/usr/local/lib --with-x --enable-win64
$ make -j2

* -j2 の数字部分は、CPU のコア数を指定してください。

export *=* について
export 変数=代入値」 は、環境変数の設定を行います。
開いた端末上で指定した場合は、その端末上でのみ、常に有効な変数となります。
ここでは、コンパイルに関係するコマンドやオプションを変更するのに使います。
configure を実行する前に設定してください。

  • CC, CXX は、C/C++ コンパイラのコマンドを指定します。
    gcc がインストールされている場合は、デフォルトで gcc が使われるので、clang を使う場合はコンパイラを明示的に指定する必要があります。
  • CFLAGS は、C コンパイラのデフォルトオプションを指定します。通常は "-g -O2"。
    デフォルトで -g オプションが付加されているため、デバッグ情報が生成されます。
    ファイルサイズがかなり増えて無駄なので、-g を消すことで、デバッグ情報を生成させないようにします。
    clang の場合は、-std=gnu89 で、ISO C89 規格と GNU 拡張機能が使えるようにします。

configure について
configure スクリプトを実行することで、ビルドに必要なファイルなどの確認をしたり、現在のディレクトリにビルド関連のファイルを生成したりして、コンパイル前の準備をします。

この時、必要なライブラリなどがインストールされていない場合、「〜のファイルがないから〜のサポートはしない」 といったメッセージが出る場合があります。
生成が正常に終わっていれば、無視してコンパイルできる場合もありますが、エラー状態で終了した場合は、必要なパッケージをもう一度確認してください。

configure オプション
  • --prefix--libdir は、インストール先の場所です。
    一応 /usr/local にしていますが、別の場所にインストールしたい場合は、変更してください。
    なお、ビルドした Wine はインストールせずに使うことも出来るので、その場合は適用で良いです。
  • --with-x は、X11 環境で使う場合、必要です。
    Wine 2.22 では、まだ Wayland には対応していません。
  • --enable-win64 は、64bit のビルドを行う。
  • 無効にしたい機能がある場合、--without-* のオプションを追加してください。
    途中でコンパイルエラーが出た場合、その機能を無効にすることでエラーを回避することもできます。

とりあえず Sims2 に必要のないものは除いた場合、以下の設定でも Sims2 は問題なく動作しました。
--without-cups --without-oss --without-coreaudio
--without-gphoto -without-sane --without-v4l
--without-capi --without-gsm --without-hal
--without-netapi --without-pcap --without-gnutls
## Wine 2.22 以降のみ
--without-krb5 --without-udev --without-xfixes

make
make コマンドを実行すると、実際にコンパイルが開始されます。

1ファイルずつコンパイルするなら、「$ make」 のみで実行します。

CPU のコアが複数ある場合、複数のソースを同時にコンパイルすることで、時間を短縮することができます。
並列コンパイルを行う場合は、「$ make -j4」 のように、-j<数値> のオプションを付けてください。
CPU コアと同じ数を指定すれば、CPU を最大限使います。

Wine のコンパイルは数十分かかるので、終わるまで気長に待ちましょう。
途中でコンパイルエラーが出るかもしれないので、たまに経過を確認してください。
Celeron 2.8 Hz : 2 コア : clang : Wine 2.22 (いくつか無効にした機能あり) で、30 分くらいかかりました。
32bit 版のビルド
次に、32bit 版をビルドします。
build32 ディレクトリに移動して、コマンドを実行します。

※ 64bit のビルドを行った端末上でそのまま続けてください。別の端末上で実行すると、export で設定した変数がクリアされてしまいます。別の端末上で行う場合は、コンパイラ関連の変数を再設定してください。

$ cd ../build32
$ export PKG_CONFIG_PATH=/usr/lib32/pkgconfig

## --without-* などは 64bit 時と同じものを指定
$ ../configure --prefix=/usr/local --libdir=/usr/local/lib32 --with-x --with-wine64=../build64

$ make -j2

PKG_CONFIG_PATH
export PKG_CONFIG_PATH=/usr/lib32/pkgconfig」 は、pkgconfig コマンド時に使われるファイルのパスを指定します。

pkgconfig コマンドは、各ライブラリを使用する時のコンパイラオプションを取得するのに使います。
このコマンドは、configure のスクリプト内で使われます。

通常は、/usr/lib/pkgconfig に各ライブラリごとの情報ファイルが格納されているのですが、これらは 64bit コンパイル時の情報のため、32bit のコンパイル時は /usr/lib32/pkgconfig 内のファイルを使う必要があります。

そのため、環境変数 PKG_CONFIG_PATH で、パスを明示的に指定します。

configure オプション
  • --libdir で、32bit 版ライブラリファイルのインストール先を指定します。
    64bit の場合は /usr/local/lib でしたが、32bit の場合は /usr/local/lib32 です。
  • --with-wine64 で、64bit 版のビルドディレクトリを指定します。
    build32 ディレクトリを基点とした場合、../build64 となります。
  • 64bit のビルド時に --without-* を指定した場合は、同じものをここでも指定してください。
作業ディレクトリに対してインストール
ビルドが終わったら、一旦作業用のディレクトリにファイルをインストール (生成) させて、実行に必要なファイルだけを取得します。

まずは、ファイルのインストール先のディレクトリを作成します。
ここでは、pkg ディレクトリを作成することにします。

(例)
~/wine-build
 ├ wine-2.22
 │ ├ build32
 │ ├ build64
 │ └ ...
 └ pkg
インストール処理
build32,build64 の各ディレクトリ上で、Makefile を使ってファイルのインストール処理を行います。

## パスは自分の環境用に置き換えてください ([!] 絶対パス)
$ pkgdir=~/wine-build/pkg

$ cd build32
$ make prefix=$pkgdir libdir=$pkgdir/lib32 dlldir=$pkgdir/lib32/wine install

$ cd ../build64
$ make prefix=$pkgdir libdir=$pkgdir/lib dlldir=$pkgdir/lib/wine install

pkgdir 変数
pkgdir=<path>」 で、pkgdir 変数に、ファイルのインストール先のパスをセットします。

これは、make コマンド時に、インストール先のパスを何回も書くのが面倒なため、変数を使って簡略化できるようにするためです。
変数設定後、$pkgdir と記述すれば、pkgdir 変数の内容が参照されて、その文字列に置き換わります。

絶対パス
ここで一つ注意しなければならない点があります。
インストール先のパスは、必ず絶対パスで指定してください。

pkgdir=../pkg などのように、相対パスで指定すると、正しい場所にファイルをインストールできません。

make コマンド
「$ make install」 のコマンドで、インストール処理を行うことができます。

prefix で、インストール先のルートディレクトリ、
libdir で、Linux 用ライブラリファイルのインストール先ディレクトリ、
dlldir で、Windows 用ライブラリファイルのインストール先ディレクトリを指定できます。
ライブラリファイルは、32bit と 64bit で、それぞれインストール先を分けます。

これで、pkg ディレクトリに、実行に必要なファイルが作成されます。
ファイルの整理
pkg ディレクトリ内のファイルを整理します。

pkg/include
Wine 環境上で Windows プログラムをコンパイルするのに必要な開発用ファイルです。
Sims2 を使うだけなら必要ないので、include ディレクトリごと削除して構いません。

pkg/share/man
この中にあるのは、man コマンドで Wine の実行ファイルのヘルプを見れるようにするためのファイルですが、使わないのであれば、このディレクトリは削除して構いません。

pkg/share
このディレクトリは必要です。
デバッグ情報の削除
export CFLAGS=...」 を設定しなかった場合、コンパイル時に -g オプションが指定されて、実行ファイルやライブラリファイル内にデバッグ情報が含まれてしまい、ファイルサイズが大きくなっています。

デバッグ情報なしの状態でも Wine の全ファイルは 400MB くらいあり、ただでさえ容量が大きいので、デバッグ情報が含まれると、かなり無駄にサイズを消費します。
なので、strip コマンドを使って、デバッグ情報を削除しましょう。

コンパイル時に -g を取り除いていれば、この工程はスキップできます。

strip コマンド
実行ファイルは、-s or --strip-all
*.a ファイルは、-g or --strip-debug
*.so ファイルは、--strip-unneeded オプションを付けてください。

$ cd pkg/bin
$ strip --strip-all *

[!] bin 内にはスクリプトファイルもありますが、実行ファイル以外は処理されないので、
    全てのファイルを対象にします。

$ cd ../lib
$ strip --strip-unneeded libwine.so.1.0

$ cd wine
$ strip --strip-debug *.a
$ strip --strip-unneeded *.so

$ cd ../../lib32
$ strip --strip-unneeded libwine.so.1.0

$ cd wine
$ strip --strip-debug *.a
$ strip --strip-unneeded *.so
次へ
以上で Wine のビルドは終了です。
しかし、実際に Sims2 をプレイするためにはいくつかの準備が必要なので、次でその説明を行います。

>> next