M1 Macでのオープンソース版CrossOver 21.2.0のビルドと実行

# CrossOver
[CrossOver](https://www.codeweavers.com/crossover)はWindowsバイナリをLinuxやmacOS上で動作させることができる商用ソフトです。GPLの[Wine](https://www.winehq.org/)をベースとしているのでソースコードが公開されています。

CrossOverは、通常のWineと異なり、llvm/clangベースの特別なコンパイラを使って64bit環境で32bitバイナリを実行するwine32on64により32bit Windowsバイナリと64bit Windowsバイナリの両方を動かすことができます。

CrossOver 21.2.0のビルド手順は以前の21.0.0の解説
https://qiita.com/asfdrwe/items/eae7a507e4bc6d37a64a
とほぼ同様です。M1 mac miniのmacOS Monterey 12.3で確認しています。

## ビルド環境構築
~/Download/以下で作業します。

```
$ cd ~/Downloads
```

Command line tools for XcodeとRosetta2上で動作するx86_64用homebrewをインストールして、Rosetta2環境下で作業します。

```
$ xcode-select --install
$ arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
$ arch -x86_64 /bin/zsh
```

余計なものが入っているとwine32on64のビルドに失敗したりうまく動かなくなるようなので、homebrewでインストールするものは次のものだけにします。他はアンインストールしておいてください。CFLAGSやLDFLAGSやPKG_CONFIG_PATH等の環境設定も外してください(`unset CFLAGS CPPFLAGS LDFLAGS PKG_CONFIG_PATH`)。

```
$ brew install cmake pkg-config bison flex mingw-w64 winetricks freetype
```

ビルドに必要な環境変数の設定をします。

```
$ export PATH="/usr/local/opt/flex/bin:/usr/local/opt/bison/bin:$PATH"
$ export CC=clang
$ export CXX=clang++
$ export MACOSX_DEPLOYMENT_TARGET=10.14
```

## CrossOver 21.2.0のダウンロード
https://www.codeweavers.com/crossover/source
よりcurlでダウンロードしtarで展開しsoucesに移動します。

```
$ curl -o crossover-sources-21.2.0.tar.gz https://media.codeweavers.com/pub/crossover/source/crossover-sources-21.2.0.tar.gz
$ tar xvfz crossover-sources-21.2.0.tar.gz
$ cd sources
```

## llvmのビルド
llvmをビルドしてパスを通します。macOS Monterey 12.3では[python2.7が削除](https://developer.apple.com/documentation/macos-release-notes/macos-12_3-release-notes)されたので、llvmのcmake時にpython3を利用する設定が必要です。

```
$ cd clang/llvm
$ mkdir build
$ cd build
$ cmake ../ -Dpython=ON -DPYTHON_EXECUTABLE=$(which python3)
$ make -j 3
$ cd bin
$ export PATH="$(pwd):$PATH"
$ cd ../../../..
```

## clangのビルド
clangをビルドしてパスを通します。同様にcmake時にpython3を利用する設定をします。

```
$ cd clang/clang
$ mkdir build
$ cd build
$ cmake ../ -Dpython=ON -DPYTHON_EXECUTABLE=$(which python3)
$ make -j 3
$ cd bin
$ export PATH="$(pwd):$PATH"
$ cd ../../../..
```

## CrossOverのビルド
ビルドに必要なinclude/distversion.hが抜けているので、[パッチ](https://gist.github.com/asfdrwe/f5466c0a8af448a9464732d93f774521/)を当ててください。

```
$ curl -o distversion.patch https://gist.githubusercontent.com/asfdrwe/f5466c0a8af448a9464732d93f774521/raw/ad8ee996c23b44d1f56aed3b58215973af5c166b/distversion.patch
$ patch -p1 < distversion.patch
```

wineに移動します。

```
$ cd wine
```

### wine64のビルド
環境変数を設定し64bit Windowsバイナリ用のwine64をビルドして
/usr/local/opt/crossover-21.2.0以下にインストールします。

```
$ mkdir build64
$ cd build64
$ ../configure --prefix=/usr/local/opt/crossover-21.2.0 --enable-win64 --without-x --disable-winedbg --disable-tests
$ make -j 3
$ make install
$ cd ../..
```

wine32on64のビルド時にdlls/winecoreaudio.drv/authorization.mでコンパイラのclangが落ちるのを回避する修正とbcrypt/macos.cのC_ASSERTが失敗するのを修正する[パッチ](https://gist.github.com/asfdrwe/d67a8822c678bb7d7d008cb4f4fc86d1/)を当ててください。

```
$ curl -o bcrypt_coreaudio.patch https://gist.githubusercontent.com/asfdrwe/d67a8822c678bb7d7d008cb4f4fc86d1/raw/d3e24d37846cdd17f26ed6f266519312138239fc/bcrypt_coreaudio.patch
$ patch -p1 < bcrypt_coreaudio.patch
```

### wine32on64のビルド
WineのWOW64に対応させて32bit Windowsバイナリと64bit Windows
バイナリ両対応となるようにwine32on64をビルドし、
/usr/local/opt/crossover-21.2.0以下にインストールします。`make install`ではmsvcrt関係のエラーが出るので、`make install-lib`でインストールします。

```
$ cd wine
$ mkdir build32
$ cd build32
$ ../configure --prefix=/usr/local/opt/crossover-21.2.0 --enable-win32on64 --with-wine64=../build64 --without-x --disable-winedbg --disable-tests
$ make -j 3
$ make install-lib
$ cd ../../..`

```

## CrossOverの実行
### 設定
実行に必要な環境変数を設定します。

```
$ export PATH=/usr/local/opt/crossover-21.2.0/bin:$PATH
$ export WINE=wine64
```

先に`wine64`を実行してWineのWOW64環境対応の~/.wine/を作成してください。

```
$ wine64 winecfg
```

winetricksで日本語フォントをインストールします。

```
$ winetricks fonts fakejapanese
```

Monoが入っていないので、必要ならば[Wine-Mono](https://dl.winehq.org/wine/wine-mono/)よりインストールしてください。

```
$ curl -o wine-mono-6.4.0-x86.msi http://dl.winehq.org/wine/wine-mono/6.4.0/wine-mono-6.4.0-x86.msi
$ wine64 msiexec /i wine-mono-6.4.0-x86.msi
```

### 動作確認したもの
#### 7zip
[7zip](https://sevenzip.osdn.jp/)は問題なく動作します。

#### PPSSPP
PSPエミュレータの[PPSSPP](https://www.ppsspp.org/)は32bit版も64bit版もOpenGLバックエンドでのみ動作します。DirectX9バックエンドとDirectX11バックエンドは動作しないようです。PPSSPP自作ソフトストアにあるCave Storyで動作確認しています。

## GUIとビルド済みバイナリ
GUIはGcenx氏による[WineskinServer](https://github.com/Gcenx/WineskinServer)があります。現時点(2022/3/26)では[CrossOver 21.0.0のビルド済みバイナリ](https://github.com/Gcenx/homebrew-wine/releases/tag/21.0.0)が同じ作者から配布されています。

WineskinServerについては
https://pc.watch.impress.co.jp/docs/column/nishikawa/1332743.html
も参考にどうぞ。