M1 MacでのCrossOver Wine 20.0.2のソースコードのビルドと実行


CrossOver版Wine

WindowsアプリケーションをLinuxやmacOS上で動作させることができるWine というソフトがあります。また、Wineの主要な開発者が関わっているCodeWeavers社が商用版のWineに相当するCrossOverを開発しています。

32bitアプリケーション非対応になったmacOS Catalina以降でも32bit Windowsアプリケーションを実行できるWineは2020年12月28日時点ではCrossOverのみです。llvm/clangベースの特別なコンパイラを使って64bit環境で32bitバイナリを実行する仕組みであるwine32on64を実現しています。

WineはGPLなので、WineをベースとするCrossOverもこちらでソースコードを公開しています。M1 Mac Big SurのRosetta2環境でCrossOver 20.0.2をビルド・実行してみたので開発者の方に向けて手順を解説します。

ビルド環境構築

基本的に~/Download/以下で作業しています。

$ cd ~/Downloads

(20201229追記) 最初にCommand line tools for Xcodeをインストールしてください。
こちらが参考になります。

Rosetta2でx86_64用のhomebrewをインストールしてください。
例えばこちらが参考になります。

homebrewでcmake、bison、flex、mingw-w64、pkgconfig、freetypeをインストールしbisonやflexにパスを通します。

$ brew install cmake bison flex mingw-w64 pkgconfig freetype
$ export PATH="/usr/local/opt/flex/bin:/usr/local/opt/bison/bin:$PATH"
$ export LDFLAGS="-L/usr/local/opt/flex/lib -L/usr/local/opt/bison/lib"
$ export CPPFLAGS="-I/usr/local/opt/flex/include"

CrossOverのソースのダウンロード

CrossOver 20.0.0のみにwine32on64に必要なllvm/clangが入っているようなので、20.0.020.0.2の両方をダウンロードし展開してください。

$ tar xvf crossover-sources-20.0.0.tar
$ mv sources/ sources-20.0.0
$ tar xvf crossover-sources-20.0.2.tar
$ mv sources/ sources-20.0.2

必要な修正

まず、wine/include/distversion.hが抜けています。

/* ---------------------------------------------------------------
*   distversion.c
*
* Copyright 2013, CodeWeavers, Inc.
*
* Information from DISTVERSION which needs to find
* its way into the wine tree.
* --------------------------------------------------------------- */

#define WINDEBUG_WHAT_HAPPENED_MESSAGE "This can be caused by a problem in the program or a deficiency in Wine. You may want to check <a href=\"http://www.codeweavers.com/compatibility/\">http://www.codeweavers.com/compatibility/</a> for tips about running this application."

#define WINDEBUG_USER_SUGGESTION_MESSAGE "If this problem is not present under Windows and has not been reported yet, you can save the detailed information to a file using the \"Save As\" button, then <a href=\"http://www.codeweavers.com/support/tickets/enter/\">file a bug report</a> and attach that file to the report."

現時点でbrewでインストールされるgccは10ですが、CrossOver 20.0.2はgcc10未対応なので次のパッチも必要です。
- https://www.winehq.org/pipermail/wine-cvs/2020-June/145081.html)
- https://source.winehq.org/git/wine.git/commitdiff/cc7f698b8245a48669d248569e7589ff824f2c70)
- https://source.winehq.org/git/wine.git/commitdiff/ea032bb7f8daddfe308f86f52c54db5f657b658a
- https://source.winehq.org/git/wine.git/commitdiff/1d785798605c01dcfc8a2f9f6ecc24bc21351029
- https://source.winehq.org/git/wine.git/commitdiff/4a91eb362666b3af549c48b95e093051756628e0
- https://source.winehq.org/git/wine.git/commitdiff/da21c305164c3e585e29e20242afc5a31f91989f
- https://source.winehq.org/git/wine.git/commitdiff/bc51c5d589de709e1d393b58b0cc5985c78061ac
- https://source.winehq.org/git/wine.git/commitdiff/44e69405adcdc98d6b0777e6c0acb2697d776ef8

また、dlls/winecoreaudio.drv/authorization.mのCoreAudio_request_capture_authorizationでコンパイラのclang-8が落ちるのを回避する修正や,
dlls/winemac.drv/cocoa_event.mの107行目の
NSParameterAssertでコンパイル時にエラーが出ることへの修正や、—without-vulkanなのにdlls/winvulkan/でエラーが出るのを修正する必要があります。

authorization.mはHAVE_AVFOUNDATION_AVFOUNDATION_Hを未定義とした雑な修正で、NSParameterAssertはコメントアウトする雑な修正ですが、以上の内容を統合したbuild20201227.patchを用意したのでこれをダウンロードして当ててください。

$ cd sources-20.0.2
$ patch -p1 < ../build20201227.patch

llvmとclangのビルド

wine32on64用のllvm/clangをビルドしてパスを通します。ビルドにかなり時間がかかります。

llvm

$ cd ../sources-20.0.0

$ cd clang/llvm
$ mkdir build
$ cd build
$ cmake ../
$ make
$ cd bin
$ export PATH="$(pwd):$PATH"
$ cd ../../../..

clang

$ cd clang/clang
$ mkdir build
$ cd build
$ cmake ../
$ make
$ cd bin
$ export PATH="$(pwd):$PATH"
$ cd ../../../..

CrossOver Wineのビルド

Windows 32bitアプリと64bitアプリの実行環境を共存できるようにするためには、最初にwine64をビルドした後、wine64のビルド環境を参照するオプション(--with-wine64)を指定してwine32on64をビルドする必要があります。

/usr/local/crossover-20.0.2にインストールするようにしていますが、別なディレクトリでも問題ないはずです。

こちらもビルドにかなり時間がかかります。

wine64

$ cd ../sources-20.0.2

$ cd wine
$ export PATH="$(pwd):$PATH"
$ export MACOSX_DEPLOYMENT_TARGET=10.14

$ mkdir build64
$ cd build64

$ CC="clang" CXX="clang++" MACOSX_DEPLOYMENT_TARGET=10.14 ../configure --enable-win64 --disable-winedbg --without-x --without-vulkan --disable-mscms --prefix=/usr/local/crossover-20.0.2

$ make

$ sudo mkdir /usr/local/crossover-20.0.2
$ sudo chown "$USER":admin /usr/local/crossover-20.0.2
$ make install

$ cd ..

wine32on64

$ cd ..

$ mkdir build32
$ cd build32

$ CC="clang" CXX="clang++" MACOSX_DEPLOYMENT_TARGET=10.14 ../configure --enable-win32on64 --with-wine64=../build64 --disable-winedbg --without-x --without-vulkan --disable-mscms --prefix=/usr/local/crossover-20.0.2

$ make

$ make install

wineの実行とwinetricks等の実行環境構築

最初にwine64を実行しないと~/.wine/を32bit64bit両対応にならないはずなので、wine64を先に実行してください。その後はWindows 32bitバイナリならばwine32on64を使い、Windows 64bitバイナリならばwine64を使ってください。

7zipのx86版とx64版が正常に動作することは確認しています。

winecfg

$ export PATH=/usr/local/crossover-20.0.2/bin:$PATH
$ wine64 winecfg

winetricks

winetricksをダウンロードしてください。

$ ./winetricks

日本語フォントを入れるならば

$ ./winetricks fonts fakejapanese

Mono

monoが必要な場合はこちらよりダウンロードして

$ wine32on64 msiexec /i wine-mono-5.1.1-x86.msi

(.netアプリはwine32on64でないと起動しないようです)

問題点

windowsアプリ終了後wineが落ちたようなエラーが出ます。

参考ページ

次のページを参考にビルドしました。
- https://gist.github.com/Alex4386/4cce275760367e9f5e90e2553d655309
- https://gist.github.com/sarimarton/471e9ff8046cc746f6ecb8340f942647
- https://wiki.winehq.org/Building_Wine

おまけ

homebrew経由でもインストール可能なビルド済みCrossOver 19.0.2がこちらにあるようです。
https://github.com/Gcenx/homebrew-wine