M1 Macでのオープンソース版CrossOver 21.0.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.0.0のビルド手順は以前の20.0.4の解説
https://qiita.com/asfdrwe/items/eae7a507e4bc6d37a64a
とほぼ同様ですが、細かい違いがあるので改めて説明します。


## 追記(2021/12/28,2021/12/29微妙に修正)
M1 mac miniでmacOS Monterey 12.1 + Xcode 13.2.1だとwine32on64の
dlls/ntdll/unix/signal_x86_32on64.cのビルドでコンパイラが落ちて
うまくビルドできないようです。crossover 21.1.0でも同様です。

## ビルド環境構築
~/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でインストールするものは次のものだけにします。他はアンインストールしておいてください。gnutlsを入れてビルドするとおそらくwine32on64が動作しなくなります。

```
$ 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.0.0のダウンロード
https://www.codeweavers.com/crossover/source
よりcurlでダウンロードしtarで展開しsoucesに移動します。

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

## llvmのビルド
llvmをビルドしてパスを通します。

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

注: make -jにするとmac mini メモリ8GBでは途中でメモリが足らなくなってビルドに失敗します。

## clangのビルド
clangをビルドしてパスを通します。

```
$ cd clang/clang
$ mkdir build
$ cd build
$ cmake ../
$ 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
```

また、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
```

wineに移動します。

```
$ cd wine
```

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

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

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

```
$ mkdir build32
$ cd build32
$ ../configure --prefix=/usr/local/opt/crossover-21.0.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.0.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.3.0-x86.msi http://dl.winehq.org/wine/wine-mono/6.3.0/wine-mono-6.3.0-x86.msi
$ wine64 msiexec /i wine-mono-6.3.0-x86.msi
```

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

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

なお、homebrewでmolten-vkやvulkan-headerをインストールし、

```
$ brew install molten-vk vulkan-headers
```

wine64ビルド時に

```
$ CFLAGS=-I/usr/local/include LDFLAGS=-L/usr/local/lib../configure --prefix=/usr/local/opt/crossover-21.0.0 --enable-win64 --without-x --disable-winedbg --disable-tests
```

のようにvulkanを使えるようにビルドすればVulkanバックエンドが動作します。ただ、自分が試した範囲では、DirectX 9バックエンドが動かなくなり、DirectX11バックエンドは動作しないままです。winetricksでDXVKを入れてもDirectX 9バックエンドもDirectX11バックエンドも動きませんでした。

## GUIとビルド済みバイナリ
GUIは[WineskinServer](https://github.com/Gcenx/WineskinServer)があります。現時点(2021/8/7)ではCrossOver 20.0.2のビルド済みバイナリも同じ作者から配布されています。

2021/12/4 追記:
Gcenx氏のCrossOver 21.0.0のビルド済みバイナリは[こちら](https://github.com/Gcenx/homebrew-wine/releases)です。

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