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

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

現時点(2021/2/9)でmacOS Catalina以降で動作するWineは64bit Windowsバイナリのみ対応ですが、CrossOverはllvm/clangベースの特別なコンパイラを使って64bit環境で32bitバイナリを実行するwine32on64により32bit Windowsバイナリと64bit Windowsバイナリの両方を動かすことができます。

以前CrossOver 20.0.2のビルドについて
https://qiita.com/asfdrwe/items/24cf3759edeb3fe56bc0
で解説しましたが、20.0.4になって多少ビルドしやすくなっているのであらためて解説します。

## 追記
2021/2/14
 
2019/12頃のwine-develにKen Thomases氏によるwine32on64の技術的な解説と指定すべきビルドオプションの説明を見つけました。
https://www.winehq.org/pipermail/wine-devel/2019-December/156602.html
https://www.winehq.org/pipermail/wine-devel/2019-December/157027.html

## ビルド環境構築
~/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でインストールするものは次のものだけにします。また、必要な環境変数の設定をします。

```
$ brew install cmake bison flex mingw-w64 freetype winetricks
```
```
$ brew list
bison		flex		gmp		libpng		p7zip
cabextract	freetype	isl		mingw-w64	unzip
cmake		gettext		libmpc		mpfr		winetricks
```
```
$ export PATH="/usr/local/opt/flex/bin:/usr/local/opt/bison/bin:$PATH"
$ export MACOSX_DEPLOYMENT_TARGET=10.14
```

## CrossOver 20.0.4のダウンロード
https://www.codeweavers.com/crossover/source
から
https://media.codeweavers.com/pub/crossover/source/crossover-sources-20.0.4.tar.gz
をダウンロードして展開します(Safariだと勝手にgzを伸長するようです)。

```
tar cvf crossover-sources-20.0.4.tar
```

## llvmのビルド
llvmをビルドしてパスを通します。かなり時間がかかります。

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

## clangのビルド
clangをビルドしてパスを通します。こちらもかなり時間がかかります。

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

## CrossOver Wineのビルド
wine/include/distversion.hが抜けているので次の内容でファイルを作成するか

```
diff -uNr sources.orig/wine/include/distversion.h sources/wine/include/distversion.h
--- sources.orig/wine/include/distversion.h	1970-01-01 09:00:00.000000000 +0900
+++ sources/wine/include/distversion.h	2021-02-07 17:03:44.000000000 +0900
@@ -0,0 +1,12 @@
+/* ---------------------------------------------------------------
+*   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."
```

[パッチ](https://pastebin.com/raw/0xDYNeXv)をdistversion.patchというファイル名で保存して当ててください。

```
$ patch -p1 < ../distversion.patch
```
dlls/winecoreaudio.drv/authorization.mのCoreAudio_request_capture_authorizationでコンパイラのclang-8が
落ちるのを回避する修正と--without-vulkanなのにdlls/winvulkan/でコンパイルエラーになるのを
修正する[パッチ](https://pastebin.com/raw/u48vdxf2)をbuild.patchというファイル名で保存して当ててください。

```
$ patch -p1 < ../build.patch
```

wineディレクトリに移動します。

```
$ cd wine
```

### wine64のビルド
環境変数を設定し64bit Windowsバイナリ用のwine64をビルドして
/usr/local/opt/crossover-20.0.4以下にインストールします。
通常のWineより時間がかかります。

```
$ export PATH="$(pwd):$PATH"
$ export CC=clang
$ export CXX=clang++
$ mkdir build64
$ cd build64
$ ../configure --prefix=/usr/local/opt/crossover-20.0.4 --enable-win64 --without-x --without-vulkan --disable-mscms
$ make
$ make install
$ cd ..
```

なお、CFLAGS=-I/usr/local/includeやLDFLAGS=-L/usr/local/lib等の環境変数の設定をする必要がありますが、homebrewでmolten-vkやSPIRV等をインストールしてVulkanを使えるようにwine64をビルドすることはできます。ただ、前述のように、余計なものがシステムに入っていると、wine32on64のビルドに失敗したり、ビルドできても正常に動作しなかったりします。

### wine32on64のビルド
WineのWOW64に対応させて32bit Windowsバイナリと64bit Windows
バイナリ両対応となるようにwine32on64をビルドし、
/usr/local/opt/crossover-20.0.4以下にインストールします。wine32on64も通常のWineより時間がかかります。

```
$ mkdir build32
$ cd build32
$ ../configure --prefix=/usr/local/opt/crossover-20.0.4 --enable-win32on64 --with-wine64=../build64 --without-x --without-vulkan --disable-mscms
$ make
$ make install
$ cd ..
```

ちなみに、wine32on64を32bit Windowsバイナリのみ対応にする場合は
--with-wine64=../build64を外して--enable-win32on64のみを指定します。

## CrossOver Wineの実行
### 設定
環境変数を設定します。

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

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

```
$ wine64 winecfg
```

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

```
$ winetricks fonts ipamona fakejapanese_ipamona
```

Monoが入っていないので[WineHQ](https://dl.winehq.org/wine/wine-mono/)よりmonoのmsiファイルをダウンロードしてインストールしてください。wine-mono-5.1.1-x86.msiで動くことを確認しています。

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

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

#### PPSSPP
PSPエミュレータの[PPSSPP](https://www.ppsspp.org/)はOpenGLとDirectX9のバックエンドは動作しました。DirectX11は落ちます。VulkanはCrossOverをVulkan対応でビルドしていないので選択できません。PPSSPP自作ソフトストアにあるCave Storyが起動するのを確認しています。

ただ、4kディスプレイのPHILIPS 276E8VJSB/11を使用しているのですが、ディスプレイの解像度の設定によっては表示がおかしくなります。
![tmp1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/882900/3f6a6913-92d4-89a0-00ec-558237cc57a7.png)
の設定(標準設定と同じ)だと次のように表示が左下4分の1になります。
![tmp2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/882900/273f223f-83e8-6564-3296-2402f395d800.png)
表示がおかしいだけでボタンは本来の場所をクリックしないとダメです(終了は右下の黒い場所をクリックする)。

拡大しない設定だと
![tmp3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/882900/a75446df-25ad-be9c-60c6-8aabb67d11e8.png)
次のように正常に表示されます。
![tmp4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/882900/4311efd4-3f11-cd0e-63e3-010473eb4162.png)

vlcも同じようになります。DirectXやOpenGLを使うものは同様におかしくなるようです。4Kディスプレイを使っている人は注意してください。

あとPPSSPP終了時にエラーが出ます。
![tmp5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/882900/f46060d0-8c47-5f39-97f0-9bee5b1ff678.png)

#### その他
aviutil、MangaMeeya、foobar2000、vlcあたりは起動することを確認しています。