2020-08-22

Vala と Meson とクロスコンパイル (2)

Meson /ˈmɛːsɒn/ は、ビルド自動化のためのソフトウェアです。Meson は直接ソフトウェアをビルドするのではなく、Linux では Ninja のビルドファイルを生成します。

今回は、Linux 上で Meson を使ってビルドするプログラムを、Windows 上でも使えるように Linux 上でクロスコンパイル、必要なランタイムライブラリ (DLL) などを抽出してパッケージにして、Windows 10 上で動作確認をした例を紹介します。

使用した OS 環境は下記の通りです。

Fedora Workstation 32 x86_64
Windows 10 Home (x64) 1909, 18363.1016

インストールの詳細は割愛しますが、プログラムのビルドには Meson, Vala, Wine が使えることに加えて、mingw-w64(以下、MinGW64)のクロスコンパイル環境が使えることを前提としています。

sudo dnf install mingw64-* で MinGW64 の関係パッケージを全部インストールして、約 3GB です。

Vala の電卓プログラム

いつも同じプログラムをサンプルにしていて申し訳ありませんが、今回も github にある下記の Vala の電卓プログラムをサンプルとして使用します。

具体的には次のようにしてクローンし、クローンしたディレクトリ vala-calculator で作業をすることにします。

[bitwalk@fedora-pc Projects]$ git clone https://github.com/bitwalk123/vala-calculator.git
Cloning into 'vala-calculator'...
remote: Enumerating objects: 88, done.
remote: Counting objects: 100% (88/88), done.
remote: Compressing objects: 100% (67/67), done.
remote: Total 88 (delta 39), reused 66 (delta 17), pack-reused 0
Receiving objects: 100% (88/88), 93.16 KiB | 307.00 KiB/s, done.
Resolving deltas: 100% (39/39), done.
[bitwalk@fedora-pc Projects]$ cd vala-calculator
[bitwalk@fedora-pc vala-calculator]$ ls
LICENSE  README.md  calc.ico  calc.rc  data  meson.build  mingw64.ini  vala-calculator.vala
[bitwalk@fedora-pc vala-calculator]$ 

Meson でクロスビルド

クロスビルドとインストール

次のようにビルドして、ユーザーアカウント内の $HOME/Builds へインストールします。

[bitwalk@fedora-pc vala-calculator]$ meson --cross-file mingw64.ini builddir
The Meson build system
Version: 0.55.0
Source dir: /home/bitwalk/Projects/vala-calculator
Build dir: /home/bitwalk/Projects/vala-calculator/builddir
Build type: cross build
Project name: Vala Calculator
Project version: 0.1.1
C compiler for the build machine: ccache cc (gcc 10.2.1 "cc (GCC) 10.2.1 20200723 (Red Hat 10.2.1-1)")
C linker for the build machine: cc ld.bfd 2.34-4
Vala compiler for the build machine: valac (valac 0.48.9)
002c:fixme:winediag:__wine_start_process Wine Staging 5.15 is a testing version containing experimental patches.
002c:fixme:winediag:__wine_start_process Please mention your exact version when filing bug reports on winehq.org.
C compiler for the host machine: x86_64-w64-mingw32-gcc (gcc 9.2.1 "x86_64-w64-mingw32-gcc (GCC) 9.2.1 20190827 (Fedora MinGW 9.2.1-6.fc32)")
C linker for the host machine: x86_64-w64-mingw32-gcc ld.bfd 2.32
Vala compiler for the host machine: valac (valac 0.48.9)
Build machine cpu family: x86_64
Build machine cpu: x86_64
Host machine cpu family: x86_64
Host machine cpu: x86_64
Target machine cpu family: x86_64
Target machine cpu: x86_64
Found pkg-config: /bin/x86_64-w64-mingw32-pkg-config (0.28)
Run-time dependency glib-2.0 found: YES 2.63.5
Run-time dependency gobject-2.0 found: YES 2.63.5
Run-time dependency gtk+-3.0 found: YES 3.24.13
Library m found: YES
Windows resource compiler: GNU windres version 2.32-%{release}
Build targets in project: 3

Found ninja-1.10.0 at /bin/ninja
[bitwalk@fedora-pc vala-calculator]$ DESTDIR=$HOME/Builds/vala-calculator ninja -C builddir install
ninja: Entering directory `builddir'
[7/8] Installing files.
Installing libcalculator.dll to /home/bitwalk/Builds/vala-calculator/usr/local/bin
Installing libcalculator.dll.a to /home/bitwalk/Builds/vala-calculator/usr/local/lib
Installing calculator.h to /home/bitwalk/Builds/vala-calculator/usr/local/include
Installing calculator-1.0.vapi to /home/bitwalk/Builds/vala-calculator/usr/local/share/vala/vapi
Installing calculator.exe to /home/bitwalk/Builds/vala-calculator/usr/local/bin
[bitwalk@fedora-pc vala-calculator]$ 

ランタイムライブラリなどのファイル抽出

関連する DLL ファイル、RPM ファイルなどの確認方法

objdump を使えば、ビルドしたプログラム calculator.exe に関連している DLL ファイル(ランタイム)を調べることができます。DLL ファイルのフルパスが判れば、どの RPM パッケージに含まれているかを調べることができます。RPM パッケージ名が判れば、パッケージに含まれるファイルのリストを取得できます。このようにして、Windows 上で動作させるにはどのファイルをコピーすれば良いかを探索することができます。

[bitwalk@fedora-pc bin]$ objdump -p calculator.exe | grep DLL
 vma:            Hint    Time      Forward  DLL       First
 DLL Name: KERNEL32.dll
 DLL Name: msvcrt.dll
 DLL Name: libglib-2.0-0.dll
 DLL Name: libgobject-2.0-0.dll
 DLL Name: libgtk-3-0.dll
[bitwalk@fedora-pc bin]$ ls /usr/x86_64-w64-mingw32/sys-root/mingw/bin/libglib-2.0-0.dll
/usr/x86_64-w64-mingw32/sys-root/mingw/bin/libglib-2.0-0.dll
[bitwalk@fedora-pc bin]$ rpm -qf /usr/x86_64-w64-mingw32/sys-root/mingw/bin/libglib-2.0-0.dll
mingw64-glib2-2.63.5-2.fc32.noarch
[bitwalk@fedora-pc bin]$ rpm -ql mingw64-glib2-2.63.5-2.fc32.noarch
/usr/share/licenses/mingw64-glib2
/usr/share/licenses/mingw64-glib2/COPYING
/usr/x86_64-w64-mingw32/sys-root/mingw/bin/gdbus.exe
/usr/x86_64-w64-mingw32/sys-root/mingw/bin/gio-querymodules.exe
/usr/x86_64-w64-mingw32/sys-root/mingw/bin/gio.exe
...
(以下省略)
...

DLL Explorer の使用

実際には、DLL ファイルが更に他の DLL を参照していることが多いので、再帰的に調べる必要があります。これを手作業でおこなうと、途方もない時間がかかりそうですので、Python / GObject で簡単な GUI プログラムを作って処理を自動化しました。

作ったばかりのプログラムで、例外処理などに全然対応できていませんが、ひととおりの動作はしますので、これを使って Windows 上で動作させるパッケージの作成を紹介します。

次のようにクローンして起動します。Python では GObject が使えることを前提としています。

[bitwalk@fedora-pc Projects]$ git clone https://github.com/bitwalk123/dllexplorer.git
Cloning into 'dllexplorer'...
remote: Enumerating objects: 80, done.
remote: Counting objects: 100% (80/80), done.
remote: Compressing objects: 100% (61/61), done.
remote: Total 80 (delta 34), reused 58 (delta 16), pack-reused 0
Receiving objects: 100% (80/80), 44.04 KiB | 256.00 KiB/s, done.
Resolving deltas: 100% (34/34), done.
[bitwalk@fedora-pc Projects]$ cd dllexplorer
[bitwalk@fedora-pc dllexplorer]$ ls
LICENSE  README.md  dllexplorer.css  dllexplorer.py  img  module
[bitwalk@fedora-pc dllexplorer]$ python dllexplorer.py

dllexplorer.py を起動して、Application root (source) に、さきほどインストールした vala-calculator のディレクトリ (/home/bitwalk/Builds/vala-calculator) を指定、Package root (destination) に、パッケージ作成するディレクトリ (/home/bitwalk/Packages) を指定します。パッケージ作成先のルートは、インストールしたディレクトリと同じ vala-calculator が設定されます。

dllexplorer を起動して、必要な情報を設定

「スタート」ボタンをクリックすると、情報を収集して、/home/bitwalk/Packages/vala-calculator 内にコピーし、ツリー構造を GUI に表示します。

dllexplorer が、関連するファイルを指定先にコピー

Windows 上で動作確認

出来上がった /home/bitwalk/Packages/vala-calculator を圧縮するなりして Windows へコピーします。

Windows 上へコピーした圧縮ファイル vala-calculator.zip

簡単なプログラムなのに、ランタイムなどを含めると、圧縮した vala-calculator.zip で 35MB、解凍すると 100MB 程度にもなります。もうすこしコンパクトにまとめられないかは、今後の検討課題とします。

解凍後の vala-calculator/bin フォルダは下記のようになっています。

vala-calculator/bin フォルダ内

calculator.exe をダブルクリックして実行できることを確認します。

calculator.exe の実行例

まとめ

Meson はまだまだ勉強中

Meson の情報は、英文ですが、それなりに充実しており、まじめに読んで、先人が公開している meson.build の内容を github などを参考にさせていただいて、なんとか Windows のリソースファイルを windres でコンパイルしてバイナリに組み込むことができました。情報を整理して別の機会にまとめる予定です。

次はインストーラの作成

クロスコンパイル関連で目標としていることは、あとは Linux 上で wine を使ってインストーラまで作ることです。パッケージを作成するのに使用した DLL Explorer にインストーラ作成用のファイルを生成する機能を実装する予定です。

参考サイト

  1. bitWalk's: Vala と Meson とクロスコンパイル [2020-08-17]
  2. Cross compilation

ブログランキング・にほんブログ村へ
にほんブログ村

0 件のコメント: