続・玩式草子 ―戯れせんとや生まれけん―

第36回Days of WINE and Struggles again[5]

WINEでは毎年1月にメジャーバージョンを更新することになっており、現在、12月上旬に公開されたWine-6.23を開発版の最終バージョンとして、来年公開予定のWine-7.0への最終調整段階に入っています。

Plamo用の正式なパッケージは7.0が公開されてから作成する予定なものの、今回はその予行演習としてWINEをソースコードからビルドする作業を紹介しましょう。

ソースコードのダウンロードとビルドスクリプトの用意

WINEのビルドには32ビット用のコンパイラやライブラリが必要で、ゼロから用意するのはなかなか大変なものの、先に紹介したパッケージ群をインストールしてWINEが動作する環境を作っておけば、後は他のソフトウェアと同じ手順でビルドすることができます。今回は本稿執筆時点での最新版であるwine-7.0-rc2をビルドしてみることにします。

まずは、WineHQのサイトから、wine-7.0-rc2のソースコードをダウンロード、展開しておきます。

$ wget https://dl.winehq.org/wine/source/7.0/wine-7.0-rc2.tar.xz
 --2021-12-22 17:04:31--  https://dl.winehq.org/wine/source/7.0/wine-7.0-rc2.tar.xz
 dl.winehq.org をDNSに問いあわせています... 151.101.90.217
 ...
 2021-12-22 17:04:33 (11.2 MB/s) - `wine-7.0-rc2.tar.xz' へ保存完了 [27108028/27108028]
$ tar xvf wine-7.0-rc2.tar.xz
 wine-7.0-rc2/tools/wrc/CHANGES
 wine-7.0-rc2/tools/wrc/Makefile.in
 ...
 wine-7.0-rc2/tools/wrc/wrctypes.h

WINEのソースコードにはconfigureスクリプトが付属しているので、configureとmake installで手動インストールすることも可能なものの、パッケージ化しておけばインストールやアンインストールが簡単になるので、既存のビルドスクリプトを流用してパッケージ化することにします。Plamo Linuxでは、各パッケージのビルドスクリプトは/usr/share/doc/以下に収められています。

$ cp /usr/share/doc/wine-6.20/PlamoBuild.wine-6.20.gz .
$ gunzip PlamoBuild.wine-6.20.gz
$ cp PlamoBuild.wine-{6.20,7.0-rc2}

今回はconfigureスクリプトに渡すオプション等は6.20の設定のまま使い、ヘッダ部分のバージョン番号回りのみを7.0-rc2用に修正しました。

$ cat -n PlamoBuild.wine-7.0-rc2 
   1  #!/bin/sh
   2  ##############################################################
   3  pkgbase="wine"
   4  vers="7.0_rc2"
   5  url="https://dl.winehq.org/wine/source/6.x/wine-7.0-rc2.tar.xz"
   6  verify=""
   7  digest=""
   8  arch=`uname -m`
   9  build=B1
  10  src="wine-7.0-rc2"
  11  OPT_CONFIG="--with-x --enable-win64"

エラー発生!!

config処理では、6.20の時と同様OpenCLやOSS sound system、libcapi20がサポートされない旨が指摘されたものの、特に問題なく終了しました。

$ ./PlamoBuild.wine-7.0-rc2 config | cat -n
   1  checking build system type... x86_64-pc-linux-gnu
   2  checking host system type... x86_64-pc-linux-gnu
   ...
  419  configure: OpenCL 64-bit development files not found, OpenCL won't be supported.
  420  configure: OSS sound system found but too old (OSSv4 needed), OSS won't be supported.
  421  configure: libcapi20 64-bit development files not found, ISDN won't be supported.
  422  
  423  configure: Finished.  Do 'make' to compile Wine.

ところが、ビルドしてみると途中でエラー終了してしまいます。

$ ./PlamoBuild.wine-7.0-rc2 build | cat -n
   1  x86_64-w64-mingw32-gcc -c -o dlls/acledit/main.cross.o /home/kojima/Wine/wine-7.0-rc2/dlls/acledit/main.c -Idlls/acledit \
   2    -I/home/kojima/Wine/wine-7.0-rc2/dlls/acledit -Iinclude -I/home/kojima/Wine/wine-7.0-rc2/include \
   3    -I/home/kojima/Wine/wine-7.0-rc2/include/msvcrt -D__WINESRC__ -D_UCRT -D__WINE_PE_BUILD -Wall \
   4    -fno-strict-aliasing -Wdeclaration-after-statement -Wempty-body -Wignored-qualifiers -Winit-self \
    ....
 23068  /home/kojima/Wine/wine-7.0-rc2/dlls/d3d12/d3d12_main.c:341:24: エラー: ‘VKD3D_API_VERSION_1_2’ undeclared (first use in this function); did you mean ‘VK_API_VERSION_1_2’?
 23069    341 |         .api_version = VKD3D_API_VERSION_1_2,
 23070        |                        ^~~~~~~~~~~~~~~~~~~~~
 23071        |                        VK_API_VERSION_1_2
 23072  /home/kojima/Wine/wine-7.0-rc2/dlls/d3d12/d3d12_main.c:341:24: 備考: 未宣言の識別子は出現した各関数内で一回のみ報告されます
 23073  make: *** [Makefile:37240: dlls/d3d12/d3d12_main.o] エラー 1
 23074  make: *** 未完了のジョブを待っています....
 23075  build error. ./PlamoBuild.wine-7.0-rc2 script stop

あれれ、と思って調べたところ、Wine-7.0系ではDirect3D12の機能をVULKAN用に変換するvkd3dライブラリ1.2以上が必要になるようです。それでは、とvkd3d-1.2をビルドしようとすると、今度はSPIR-Vのヘッダが古すぎると怒られました。

$ ./PlamoBuild.vkd3d-1.2 config
checking for gcc... gcc
checking whether the C compiler works... yes
...
checking whether SpvCapabilityDemoteToHelperInvocationEXT is declared... no
configure: error: SPIR-V headers are too old.
configure error. ./PlamoBuild.vkd3d-1.2 script stop

関連パッケージを更新して再挑戦

インストール済みのSPIRV_Headersは1.4.1なのに対し、SPIR-Vのサイトを確認すると、1.5.4というバージョンが公開されています。

SPIRV-HeadersはSPIR-Vが使う変数や関数の定義集(ヘッダーファイル)で、コンパイル等の処理は不要なため、既存のビルドスクリプトのバージョン番号回りを修正する程度でエラーなくパッケージ化できました。

SPIRV_Headersを1.5.4に更新するとvkd3d-1.2もきちんとビルドできるようになり、vkd3d-1.2に更新すると、無事Wine-7.0-rc2のビルドも完了しました。

$ ./PlamoBuild.wine-7.0-rc2 build | cat -n 
   1  x86_64-w64-mingw32-gcc -c -o dlls/acledit/main.cross.o \
       /home/kojima/Wine/wine-7.0-rc2/dlls/acledit/main.c -Idlls/acledit \
   2    -I/home/kojima/Wine/wine-7.0-rc2/dlls/acledit -Iinclude -I/home/kojima/Wine/wine-7.0-rc2/include \
   3    -I/home/kojima/Wine/wine-7.0-rc2/include/msvcrt -D__WINESRC__ -D_UCRT -D__WINE_PE_BUILD -Wall \
   ...
   
50389    dlls/winecrt0/libwinecrt0.cross.a dlls/msvcrt/libmsvcrt.cross.a dlls/kernel32/libkernel32.cross.a \
50390    dlls/ntdll/libntdll.cross.a
50391  Wine build complete.

これで64ビット版のWine-7.0-rc2はビルドできたものの、WINEでは32ビットのバイナリも必要なので、次にvkd3d-1.2の32ビット版をビルド、インストールした上で、32ビット版のWINEのビルドに進みます。

$ ./PlamoBuild.lib32_vkd3d-1.2
...
$ sudo updatepkg -f lib32_vkd3d-1.2-i686-M1.tzst
...
$ ./PlamoBuild.wine_32-7.0
...
pruning symlink in /home/kojima/Wine/work/usr/share/man/mann
basename:wine_32
version:7.0_rc2
arch:i686
build:M1
ext:tzst
usr/lib32/wine/i386-unix/libwine.so.1 -> libwine.so.1.0

( cd usr/lib32/wine/i386-unix ; rm -rf libwine.so.1 )
( cd usr/lib32/wine/i386-unix ; ln -sf libwine.so.1.0 libwine.so.1 )
./usr/lib32/wine/i386-unix/libwine.so.1
../wine_32-7.0_rc2-i686-M1.tzst.tar : 20.90%   (590428160 => 123392743 bytes, /*stdout*\)

多少試行錯誤があったものの、何とかwine-7.0-rc2の64ビット版と32ビット版のパッケージが作成できました。

新しいパッケージの動作確認

6.20と7.0-rc2のサイズを比べると、64ビット版で10MB、32ビット版で7MBほど大きくなっていました。

$ ls -lh wine{,_32}-{6.20,7.0}*tzst
-rw-r--r-- 1 root root 115M 10月 23日  13:23 wine-6.20-x86_64-B1.tzst
-rw-r--r-- 1 root root 125M 12月 22日  13:13 wine-7.0_rc2-x86_64-B1.tzst
-rw-r--r-- 1 root root 107M 10月 23日  13:11 wine_32-6.20-i686-M1.tzst
-rw-r--r-- 1 root root 114M 12月 22日  13:17 wine_32-7.0_rc2-i686-M1.tzst

updatepkgコマンドで新しいパッケージに更新し、winecfgの動作を確認します。

$ sudo updatepkg wine-7.0_rc2-x86_64-B1.tzst wine_32-7.0_rc2-i686-M1.tzst 
[sudo] kojima のパスワード:
removing wine-6.20
...
--> Deleting empty directory usr/lib32/wine
wine_32-7.0_rc2-i686-M1 のインストール中
PACKAGE DESCRIPTION:
wine_32-7.0_rc2-i686-M1 のインストールスクリプトを実行中

$ winecfg

バージョンアップすると既存のWine環境(~/Wine/Wine01/等)にインストールされた設定ファイル類を更新するようで、最初の起動時にはすこし待たされるものの、winecfgも無事起動し、バージョン番号(7.0-rc2)も確認できました。

図1 winecfgでバージョンの確認
図1 winecfgでバージョンの確認

インストール済のアプリもたいていは問題なく動いているものの、⁠3D麻雀悠遊」の得点計算画面の文字表示を見ると、フォントがかすれてしまっている感じです。どうやらフォントのレンダリングがうまく行っていないようです。

図2 Wine-7.0-rc2(上)とWine-6.0(下)の得点計算画面
図2 Wine-7.0-rc2の得点計算画面 図2 Wine-6.0の得点計算画面

バグレポートを出せればいいのだけれど、wine-6.20から7.0-rc2の間では4つくらいバージョンがあるので、どの時点で忍びこんだバグなのかをチェックするのは大変そうです。まぁ、まだRCの状態なので、今回は様子を見ることにしておきます。

以上、とりあえずWine-7.0-rc2が動くことは確認できたので、後は今回引っかかったSPIR-Vのように、更新が必要なパッケージをチェックしつつ、年明けに控えるWine-7.0の正式リリースを待つことにしましょう。


WINEは64ビットと32ビットを自在に使い分ける複雑なソフトウェアで、最初はなかなか手を付けにくいものの、一度動作する環境を構築できれば、後は通常のソフトウェア同様、パーツごとに更新も可能になります。

今回は触れられなかったものの、WINEでは開発版に反映される前のパッチを集めたWine-stagingというパッチ集も公開しており、これらのパッチを適用しないと動作しないアプリも散在するようです。

本稿を参考に、WINEの新バージョンへの挑戦や、これら新機能の追加など、読者の方々で試された結果を報告いただければ幸いです。

おすすめ記事

記事・ニュース一覧