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

第17回Days of WINE and Struggles[4]

世の中が新型コロナウイルスのニュース一色になっているうちに、気付くと2月も末、今年の1/6が終る時期になってしまいました。

例年だと、この時期は年度末作業が重なるため休載しがちなものの、今年はWINEのトラブルネタを書きためていたこともあって(苦笑⁠⁠、何とか月例の更新はできそうです。

さて、今回、ようやくWINEのビルドに取りかかります。WINEは更新頻度が高く、すでに5.xのシリーズが公開されているものの、ざっと5.2をビルドしてみた感じでは、ビルドの手順や必要なパッケージは本稿で扱っている4.21と変らないようです。

8月YX日:WINE用32ビット版パッケージの作成開始

CLFSレベルのパッケージだけではWINEの動作に全く足りないことに気づきしばし呆然としたものの、落ちついて考えると、WINEに必要なのは32ビット版のライブラリであって、システムユーティリティや設定ツール、メールやログのサーバ等々、システム運用関連のツールは不要だろうし、Emacs等のエディタやdocbook回りの機能、XfceやMateといったデスクトップ環境なども必要ないはずだ。

そう考えると多少気が楽になり、具体的にWINEがどれだけのライブラリを必要とするかは不明なものの、とりあえずX回りのライブラリから32ビット版を作成していくことにした。

X回りのライブラリは依存関係があるため、BLFSの手順を参照しながら、32ビット版パッケージをビルド、インストールしていく。

当初は64ビット版用のPlamoBuildスクリプトをコピーして、32ビット版に必要な設定を手動で追加していたものの、途中からはPlamoBuildスクリプトメーカー(make_PlamoBuild.py)を32ビット版にも対応できるように改造し、それを使って32ビット版用のビルドスクリプトを新造するようにしたので、32ビット版パッケージの作成速度はずいぶん改善した。

BLFSの手順に従ってビルドを進めてゆくと、OpenGL用の3DグラフィックライブラリであるMesaやXorgのサーバ、各種ドライバ類をビルドすることになっている。しかしながら、WINEが要求するのはライブラリの機能であって、Xorgのサーバやドライバは不要だろう、と考えてスキップすることにした。加えて、32ビット版のXアプリやフォントファイル等も不要なので、とりあえずlibxcbの32ビット版を作ったあたりで一段落とし、WINEのビルドを試してみることにした。

WINEには必要なライブラリが揃っているかをチェックするconfigureスクリプトが用意されている。このスクリプトがどこまで進むかを試してみたところ、⁠FreeTypeの32ビット開発環境が無い」というところでエラー終了した。

$ ~/WINE/wine-4.21 ./configure
checking build system type... x86_64-pc-linux-gnu
checking host system type... x86_64-pc-linux-gnu
checking whether make sets $(MAKE)... yes
...
checking for XkbQueryExtension in -lX11... yes
checking for -lXcursor... libXcursor.so.1
checking for -lXi... libXi.so.6
...
checking ft2build.h presence... yes
checking for ft2build.h... yes
checking for -lfreetype... not found
configure: error: FreeType 32-bit development files not found. Fonts will not be built.
Use the --without-freetype option if you really want this.

やはりフォント回りのライブラリも32ビット版が必要なようだ。もっとも、新しくインストールしたX回りのチェックは通っているので、このまま32ビット版のパッケージを揃えていけば何とかなりそうな希望は見えてきた。

FreeTypeの次は何が必要になるのだろう、とメッセージにあるように--without-freetypeオプションを指定してconfigureを再実行してみると、意外にも最後まで処理が進み、不足している機能やライブラリが多数表示される結果となった。

$ ~/WINE/wine-4.21$ .configure --without-freetype
checking build system type... x86_64-pc-linux-gnu
checking host system type... x86_64-pc-linux-gnu
checking whether make sets $(MAKE)... yes
...
config.status: executing tools/makedep commands
config.status: executing Makefile commands

configure: MinGW compiler not found, cross-compiling PE files won't be supported.
configure: libGLU 32-bit development files not found, GLU won't be supported.
configure: libOSMesa 32-bit development files not found (or too old), OpenGL rendering in bitmaps won't be supported.
configure: OpenCL 32-bit development files not found, OpenCL won't be supported.
configure: pcap 32-bit development files not found, wpcap won't be supported.
configure: libdbus 32-bit development files not found, no dynamic device support.
configure: libgnutls 32-bit development files too old, bcrypt encryption won't be supported.
configure: lib(n)curses 32-bit development files not found, curses won't be supported.
configure: libsane 32-bit development files not found, scanners won't be supported.
configure: libv4l2 32-bit development files not found.
configure: libgphoto2 32-bit development files not found, digital cameras won't be supported.
configure: libgphoto2_port 32-bit development files not found, digital cameras won't be auto-detected.
configure: liblcms2 32-bit development files not found, Color Management won't be supported.
configure: libz 32-bit development files not found, data compression won't be supported.
configure: libpulse 32-bit development files not found or too old, Pulse won't be supported.
configure: gstreamer-1.0 base plugins 32-bit development files not found, GStreamer won't be supported.
configure: OSS sound system found but too old (OSSv4 needed), OSS won't be supported.
configure: libudev 32-bit development files not found, plug and play won't be supported.
configure: libSDL2 32-bit development files not found, SDL2 won't be supported.
configure: libFAudio 32-bit development files not found, XAudio2 won't be supported.
configure: libcapi20 32-bit development files not found, ISDN won't be supported.
configure: libcups 32-bit development files not found, CUPS won't be supported.
configure: fontconfig 32-bit development files not found, fontconfig won't be supported.
configure: libgsm 32-bit development files not found, gsm 06.10 codec won't be supported.
configure: libkrb5 32-bit development files not found (or too old), Kerberos won't be supported.
configure: libgssapi_krb5 32-bit development files not found (or too old), no Kerberos SSP support.
configure: libtiff 32-bit development files not found, TIFF won't be supported.
configure: libmpg123 32-bit development files not found (or too old), mp3 codec won't be supported.
configure: libopenal 32-bit development files not found (or too old), OpenAL won't be supported.
configure: libvulkan and libMoltenVK 32-bit development files not found, Vulkan won't be supported.
configure: vkd3d 32-bit development files not found (or too old), Direct3D 12 won't be supported.
configure: libldap (OpenLDAP) 32-bit development files not found, LDAP won't be supported.
configure: Finished.  Do 'make' to compile Wine.

見つからないとエラー終了するFreeTypeとは異なり、これらのライブラリはWINEにとって必須ではないのだろう。指摘されたライブラリの多くは64ビット版を作ったことがあるものの、MinGWやlibvulkan等、見覚えのないソフトウェアも散在する。もっとも、それらがどういう機能に関わるのかも説明されているので、まずは見覚えがあるソフトウェアの32ビット版から作っていくことにしよう。

8月YY日:いよいよWINEのビルドにかかる

TrueTypeフォントを扱うFreeTypeライブラリを入れるためにはテキストの表示方向を制御するHarfbuzzが必要となり、Harfbuzzには画面描画回りのGlibCairoが必要で、それらにはさらにGtkが必要になり……と、必要な32ビット版ライブラリは芋ヅル式に増えていくものの、ここまで来て止めるわけにも行かないので、⁠どこまで続く泥濘(ぬかるみ)ぞ……」とボヤきながらもパッケージ作りを続ける。

パッケージ作りの合間にWINE HQのドキュメント類を読んでゆくと、Windowsが2D/3Dグラフィックの処理に使っているDirectXの機能を、WINEではOpenGLを使って実現しているそうで、先に不要だろうと考えたmesa回りも32ビット版ライブラリが必要になるようだ。

mesaをビルドするためにはLLVMという大物が必要になり、GCCでインストール先ディレクトリの設定に結構苦労した記憶もあって、⁠LLVMって32ビット版を簡単に作れるだろうか……」と心配したものの、32ビット版に共通の

export CC='gcc -m32'
export CXX='g++ -m32'
libdir='lib32'

という設定に加えて、cmakeに

-DLLVM_LIBDIR_SUFFIX=32

という指定を追加する程度で32ビット版のライブラリが/usr/lib32/にインストールできた。このあたり、あらかじめMultilibどころか、Multiarchにも対応しているLLVMの面目躍如というところだろうか。

どれだけのパッケージを用意すればいいのかは五里霧中なものの、ある程度進んだところでWINEのconfigureスクリプトを動かすと、不備を指摘される項目は着実に減っているので、それを心頼りに作業を進める。

作業が止まったのが64ビット版を作ったことがないVulkanと呼ばれるソフトウェアだ。⁠これは何者?」と調べてみると、最近のGPUに適した3Dグラフィック用のAPIで、OpenGLの後継者のような位置付けらしい。Vulkanの公式サイトを眺めてみると、ここで公開されているのはAPIの仕様に関するドキュメント程度で、実際に必要なソフトウェアはGitHubで公開されているようだ。このあたりは64ビット版も必要だろうから作っておくことにする。

2週間ほどかけて150ほどの32ビット版パッケージを追加したところ、configureの指摘はこの程度にまで減ってきた。

configure: MinGW compiler not found, cross-compiling PE files won't be supported.
configure: OpenCL 32-bit development files not found, OpenCL won't be supported.
configure: pcap 32-bit development files not found, wpcap won't be supported.
configure: libhal 32-bit development files not found, no legacy dynamic device support.
configure: libsane 32-bit development files not found, scanners won't be supported.
configure: libv4l2 32-bit development files not found.
configure: libgphoto2 32-bit development files not found, digital cameras won't be supported.
configure: libgphoto2_port 32-bit development files not found, digital cameras won't be auto-detected.
configure: OSS sound system found but too old (OSSv4 needed), OSS won't be supported.
configure: libcapi20 32-bit development files not found, ISDN won't be supported.
configure: libcups 32-bit development files not found, CUPS won't be supported.
configure: libkrb5 32-bit development files not found (or too old), Kerberos won't be supported.
configure: libgssapi_krb5 32-bit development files not found (or too old), no Kerberos SSP support.
configure: libldap (OpenLDAP) 32-bit development files not found, LDAP won't be supported.

configure: Finished.  Do 'make' to compile Wine.

これらの指摘を眺めると、ISDNは論外だし、プリンタやスキャナ、デジカメもWINE上で使う予定は無いので、多分これぐらいで機能は十分だろうと考え、いよいよWINEのビルドに挑むことにした。

WINEのビルド方法はWINE HQで解説されていて、今回はそのうちのShared Wow64の方法で、32/64ビットのMultilib版を作る。解説によると、Windowsではアプリは未だに32ビット版が主流なため、64ビット版のOS上で32ビット版アプリを動かすための互換レイヤーが用意されており、Shared Wow64はそれと同じように64ビット版のWINE上に32ビット版のWINEを載せるような形を取るらしい。

指示に従って、まずは64ビット版を"--enable-win64"オプションを指定して設定、ビルドし、次に32ビット版で"--with-wine64=../build_64"のように64ビット版のバイナリがあるディレクトリを指定して設定、ビルドする。

$ mkdir build_64 && cd build_64
$ ../wine-4.21/configure --prefix=/usr --enable-win64
....

$ make
....

make[1]: ディレクトリ '/tmp/build_64/server' に入ります
gcc -m64 -o wineserver async.o atom.o change.o class.o clipboard.o completion.o console.o debugger.o device.o \
  directory.o event.o fd.o file.o handle.o hook.o mach.o mailslot.o main.o mapping.o mutex.o \
  named_pipe.o object.o process.o procfs.o ptrace.o queue.o region.o registry.o request.o \
  semaphore.o serial.o signal.o snapshot.o sock.o symlink.o thread.o timer.o token.o trace.o \
  unicode.o user.o window.o winstation.o -Wl,--rpath,\$ORIGIN/../libs/wine \
  ../libs/port/libwine_port.a -lwine -L../libs/wine -Wl,--as-needed
make[1]: ディレクトリ '/tmp/build_64/server' から出ます
Wine build complete.

$ mkdir ../build_32 && cd ../build_32
$ ../wine-4.21/configure --prefix=/usr --with-wine64=../build_64
....

$ make
....

wscript.exe_test.res xcopy.exe_test.res -lole32 ../../dlls/uuid/libuuid.a -lcomctl32 -lversion \
-luser32 -lgdi32 -ladvapi32 -lwsock32 -Wl,-delayload,ole32.dll -Wl,--as-needed
make[1]: ディレクトリ '/tmp/build_32/programs/xcopy' から出ます
make[1]: ディレクトリ '/tmp/build_32/programs/winetest' から出ます
Wine build complete.

configureは先に示したようにいくつかの機能不足を指摘するものの、GCCがエラー終了することはなく、何とか64/32ビット双方で無事にビルドは終了した。

作成したWINEパッケージをインストールして試してみると、WINEの設定ツールであるwinecfgはちゃんと起動できた。

図1 wine-4.21のwinecfg
図1 wine-4.21のwinecfg

「やれやれ、やっと夏休みの宿題が終った」とホッとしたのも束の間、更に深刻なトラブルが待ち構えていたのであった(続⁠⁠。

おすすめ記事

記事・ニュース一覧