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 にインストーラ作成用のファイルを生成する機能を実装する予定です。
参考サイト
- bitWalk's: Vala と Meson とクロスコンパイル [2020-08-17]
- Cross compilation
にほんブログ村