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 が設定されます。
「スタート」ボタンをクリックすると、情報を収集して、/home/bitwalk/Packages/vala-calculator 内にコピーし、ツリー構造を GUI に表示します。
Windows 上で動作確認
出来上がった /home/bitwalk/Packages/vala-calculator を圧縮するなりして Windows へコピーします。
簡単なプログラムなのに、ランタイムなどを含めると、圧縮した vala-calculator.zip で 35MB、解凍すると 100MB 程度にもなります。もうすこしコンパクトにまとめられないかは、今後の検討課題とします。
解凍後の vala-calculator/bin フォルダは下記のようになっています。
calculator.exe をダブルクリックして実行できることを確認します。
まとめ
Meson はまだまだ勉強中
Meson の情報は、英文ですが、それなりに充実しており、まじめに読んで、先人が公開している meson.build の内容を github などを参考にさせていただいて、なんとか Windows のリソースファイルを windres でコンパイルしてバイナリに組み込むことができました。情報を整理して別の機会にまとめる予定です。
次はインストーラの作成
クロスコンパイル関連で目標としていることは、あとは Linux 上で wine を使ってインストーラまで作ることです。パッケージを作成するのに使用した DLL Explorer にインストーラ作成用のファイルを生成する機能を実装する予定です。
参考サイト
- bitWalk's: Vala と Meson とクロスコンパイル [2020-08-17]
- Cross compilation
にほんブログ村
0 件のコメント:
コメントを投稿