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


CrossOver

WindowsバイナリをLinuxやmacOS上で動作させることができる商用ソフトのCrossOverはGPLのWineをベースとしているのでソースコードが公開されています。

現時点(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."

パッチをdistversion.patchというファイル名で保存して当ててください。

$ patch -p1 < ../distversion.patch

dlls/winecoreaudio.drv/authorization.mのCoreAudio_request_capture_authorizationでコンパイラのclang-8が
落ちるのを回避する修正と--without-vulkanなのにdlls/winvulkan/でコンパイルエラーになるのを
修正するパッチを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よりmonoのmsiファイルをダウンロードしてインストールしてください。wine-mono-5.1.1-x86.msiで動くことを確認しています。

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

動作確認したもの

7zip

7zipは32bit版も64bit版も動作しました。

PPSSPP

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

ただ、4kディスプレイのPHILIPS 276E8VJSB/11を使用しているのですが、ディスプレイの解像度の設定によっては表示がおかしくなります。

の設定(標準設定と同じ)だと次のように表示が左下4分の1になります。

表示がおかしいだけでボタンは本来の場所をクリックしないとダメです(終了は右下の黒い場所をクリックする)。

拡大しない設定だと

次のように正常に表示されます。

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

あとPPSSPP終了時にエラーが出ます。

その他

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