M1 MacでのWine 6.1のビルド

# Wine
WindowsアプリケーションをLinuxやmacOS上で動作させることができる[Wine](https://www.winehq.org/)の開発版6.1をM1 MacのRosetta2環境でビルド&実行してみました。

以前
https://qiita.com/asfdrwe/items/d8e49320c2ab6c980fdc
で解説した6.0-rc5では

```
display: macdrv_init_display_devices No GPUs detected
```
と出て正常に動作しないのでパッチが必要でしたが、6.1で修正されたようなのでそのままビルドしても問題ありません。

https://www.winehq.org/announce/6.1

```
Brendan Shanks (4):
      winemac.drv: Use Metal to get a display's GPU info if possible.
```

## Wineビルド環境構築
### 準備

~/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/bash
```

参考サイト
https://qiita.com/royroy/items/338362362de73a94fc0c
https://qiita.com/shira-shun/items/0f6213f4923cb5544367
https://zenn.dev/ress/articles/069baf1c305523dfca3d

### homebrewから必要なものをインストール
homebrew経由でビルドに必要なbisonやflex他、SSL関係のgnutlsやVulkan→Metalの変換を行うMoltenVKなどライブラリやツールもインストールし環境変数の設定をします(一部不要なのがあるかも)。

```
$ brew install cmake ninja bison flex freetype mingw-w64 gnutls libtiff krb5 FAudio lcms2 gstreamer gst-plugins-base sane-backends libusb libgsm libgphoto2 molten-vk vulkan-headers spirv-cross spirv-tools glslang

$ export PATH="/usr/local/opt/net-snmp/sbin:/usr/local/opt/net-snmp/bin:/usr/local/opt/icu4c/sbin:/usr/local/opt/icu4c/bin:/usr/local/opt/sqlite/bin:/usr/local/opt/krb5/sbin:/usr/local/opt/krb5/bin:/usr/local/opt/openssl@1.1/bin:/usr/local/opt/flex/bin:/usr/local/opt/bison/bin:$PATH"

$ export GUILE_LOAD_PATH="/usr/local/share/guile/site/3.0"
$ export GUILE_LOAD_COMPILED_PATH="/usr/local/lib/guile/3.0/site-ccache"
$ export GUILE_SYSTEM_EXTENSIONS_PATH="/usr/local/lib/guile/3.0/extensions"
$ export GUILE_TLS_CERTIFICATE_DIRECTORY=/usr/local/etc/gnutls/
```

### SPIRV-Headers
vkd3dのビルドに必要なSPIRV-Headersがhomebrewにないようなので手動で入れます。

```
$ git clone https://github.com/KhronosGroup/SPIRV-Headers.git
$ cd SPIRV-Headers
$ mkdir build
$ cd build
$ cmake ..
$ make install
$ cd ../..
```
SPIRV-Headersでインストールされるファイルは/usr/local/include/spirvと/usr/local/lib/cmake/SPIRV-Headersに入るので、SPIRV-Headersをアンインストールするときは手動で消してください。

### vkd3d
Vulkan経由でDirectX12を動かすvkd3dをビルドします。/usr/local/opt/vkd3d-1.2にインストールします。

https://dl.winehq.org/vkd3d/source/
からvkd3d-1.2.tar.xzをダウンロードし展開してビルドしてインストールしvkd3dのpkgconfigのパスを通します。

```
$ tar xvfJ vkd3d-1.2.tar.xz
$ cd vkd3d-1.2
$ ./configure --prefix=/usr/local/opt/vkd3d-1.2 --with-spirv-tools
$ make
$ make install
$ cd ..
$ export PKG_CONFIG_PATH="/usr/local/opt/vkd3d-1.2/lib/pkgconfig/"
```

## Wineのビルド
https://www.winehq.org/
からwine-6.1.tar.xzをダウンロードし展開します。/usr/local/opt/wine-6.1にインストールします。

```
$ tar xvfJ wine-6.1.tar.xz
$ cd wine-6.1
```

configureスクリプトに対して、Linux用と思われるinotify,v4l2,pulse,oss,udev,capiは無効にしています。Xはなくてもビルドできるので無効にしています。QuickTimeはビルドに必要なものがわからないで無効にしています。
オプションを指定してconfigureを実行し、ビルドとインストールを行います。

```
$ ./configure --prefix=/usr/local/opt/wine-6.1 --enable-win64 --without-quicktime --without-x --without-inotify --without-v4l2 --without-pulse --without-oss --without-udev --without-capi
$ make
$ make install
```

## Wineの実行
wine64のパスを通してWineの設定ツールのwinecfgを実行します。

```
$ export PATH="/usr/local/opt/wine-6.1/bin:$PATH"
$ wine64 winecfg
```

### winetricks
homebrewにwinetricksがあるのでインストールし、念のためhomebrewからインストールされるunzipへのパスを通します。

```
$ brew install winetricks
$ export PATH="/usr/local/opt/unzip/bin:$PATH"
```

環境変数のWINEにwine64を指定してwinetricksを実行します。

```
$ export WINE=/usr/local/opt/wine-6.1/bin/wine64
$ winetricks
```

例えば日本語フォントに関しては次のようにipamonaをインストールして設定できます。

```
$ winetricks fonts ipamona fakejapanese_ipamona
```

### 動作確認
[7zip](https://sevenzip.osdn.jp/)のx64版が動作するのを確認しています。インストーラーがx86のようなので、[msi版インストーラ](https://7-zip.org/a/7z1900-x64.msi)をダウンロードして、msiexecコマンドでインストールしてください。

```
$ wine64 msiexec /i 7z1900-x64.msi
```

[notepad++](https://notepad-plus-plus.org/)もインストーラが32bitですが、ポータブル版は動くはずです。

これ以外でも64bitアプリなのにインストーラーが32bitのものが多くインストールできないものが多いです。

PSPエミュレータの[ppsspp](https://www.ppsspp.org/)は起動直後に落ちます。

こちらのビルドにミスがあるのかもしれませんが、現時点(2021/2/6)では素のWineはLinux上でのWineと違って正常に動作するのが少ないです。

## 補足
### quarantine拡張属性
ネットからダウンロードしたexeを実行する際に、『開発元を検証できないため開けません』という警告が出ます。

セキュリティ上あまり好ましくないのですが

```
$ xattr -d com.apple.quarantine xxx.exe
```
とすればquarantine拡張属性を消せるので警告がでなくなります。

参考サイト
https://news.mynavi.jp/article/osxhack-187/
https://infornography.blue/mac/remove-quarantine-attribute/

### Wine 6.1のビルド済みバイナリ
https://github.com/Gcenx/homebrew-wine
からgcenx氏ビルドの6.1(2021/2/6時点)がhomebrew経由でインストールできます。こちらのビルドと微妙にオプションが違っていますが(krb5等)。

gcenx氏のリポジトリを追加(tap)

```
$ brew tap gcenx/wine
```

インストール

```
$ brew install --cask --no-quarantine gcenx-wine-devel
```