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

## CrossOver版Wine
WindowsアプリケーションをLinuxやmacOS上で動作させることができる[Wine](https://www.winehq.org/)　というソフトがあります。また、Wineの主要な開発者が関わっている[CodeWeavers社](https://www.codeweavers.com/)が商用版のWineに相当する[CrossOver](https://www.codeweavers.com/crossover)を開発しています。

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

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

## ビルド環境構築
基本的に~/Download/以下で作業しています。

```
$ cd ~/Downloads
```
(20201229追記) 最初にCommand line tools for Xcodeをインストールしてください。
[こちら](https://qiita.com/royroy/items/338362362de73a94fc0c)が参考になります。

Rosetta2でx86_64用のhomebrewをインストールしてください。
例えば[こちら](https://qiita.com/shira-shun/items/0f6213f4923cb5544367)が参考になります。

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.0](https://media.codeweavers.com/pub/crossover/source/crossover-sources-20.0.0.tar.gz)と[20.0.2](https://media.codeweavers.com/pub/crossover/source/crossover-sources-20.0.2.tar.gz)の両方をダウンロードし展開してください。

```
$ 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](https://pastebin.com/raw/JAusHmdj)を用意したのでこれをダウンロードして当ててください。

```
$ 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](https://sevenzip.osdn.jp/)のx86版とx64版が正常に動作することは確認しています。

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

### winetricks
[winetricks](https://raw.githubusercontent.com/Winetricks/winetricks/master/src/winetricks)をダウンロードしてください。

```
$ ./winetricks
```

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

```
$ ./winetricks fonts fakejapanese
```

### Mono
monoが必要な場合は[こちら](https://dl.winehq.org/wine/wine-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