2020-08-17

Vala と Meson とクロスコンパイル

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

今回は、Linux 上で Meson を使ってビルドするプログラムを、Windows 上でも使えるように Linux 上でクロスコンパイルをして、Wine で動作確認をした例を紹介します。

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

Fedora Workstation 32 x86_64

インストールの詳細は割愛しますが、Meson, Vala が使えることに加えて、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: 60, done.
remote: Counting objects: 100% (60/60), done.
remote: Compressing objects: 100% (47/47), done.
remote: Total 60 (delta 23), reused 47 (delta 10), pack-reused 0
Receiving objects: 100% (60/60), 80.79 KiB | 424.00 KiB/s, done.
Resolving deltas: 100% (23/23), done.
[bitwalk@fedora-pc Projects]$ cd vala-calculator
[bitwalk@fedora-pc vala-calculator]$ ls
README.md  data  meson.build  mingw64.ini  vala-calculator.vala
[bitwalk@fedora-pc vala-calculator]$ 

Meson でクロスビルド

クロスコンパイルの設定ファイル

MinGW64 のクロスコンパイル用に、下記のような設定ファイル mingw64.ini を使います [1]。この設定ファイルが、クロスコンパイルの要になります。

mingw64.ini

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

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

[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
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.8)
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.8)
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: /usr/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
Build targets in project: 2

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

コンパイラなどのビルドツールが変わっただけで、Linux ネイティブなアプリをビルドするときと流れは同じです。

Wine で動作確認

環境変数 PATH の設定

ビルドしたバイナリの動作確認をする前に、MinGW64 のランタイムライブラリ (DLL) へのパスを通しておく必要があります。

まず winepath コマンドで、MinGW64 の bin ディレクトリ (/usr/x86_64-w64-mingw32/sys-root/mingw/bin) が Wine 上のパスでどのように表現されるのかを確認します。

[bitwalk@fedora-pc vala-calculator]$ winepath -w /usr/x86_64-w64-mingw32/sys-root/mingw/bin
002c:fixme:winediag:__wine_start_process Wine Staging 5.14 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.
Z:\usr\x86_64-w64-mingw32\sys-root\mingw\bin
[bitwalk@fedora-pc vala-calculator]$ 

Wine のレジストリエディタ (regedit) を起動して、HKEY_CURRENT_USER\Environment に環境変数 PATH を設定し、調べたパスを入力します。

Wine に環境変数 PATH を設定

日本語環境の特有な事情だと思いますが、バックスラッシュ \ は、Wine では表示上 ¥ になります。

※ 環境によっては、もしかするとバックスラッシュとして表示した文字の方が円記号に表示されてしまっているかもしれません。

ビルドしたバイナリの動作確認

インストールした先に作業ディレクトリを移して、ビルドした calculator.exe を実行してみます。

[bitwalk@fedora-pc vala-calculator]$ cd $HOME/test
[bitwalk@fedora-pc test]$ ls
usr
[bitwalk@fedora-pc test]$ cd usr
[bitwalk@fedora-pc usr]$ ls
local
[bitwalk@fedora-pc usr]$ cd local/bin
[bitwalk@fedora-pc bin]$ ls
calculator.exe  libcalculator.dll
[bitwalk@fedora-pc bin]$ ./calculator.exe
002c:fixme:winediag:__wine_start_process Wine Staging 5.14 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.
00b8:fixme:dwmapi:DwmIsCompositionEnabled 000000000031F1CC

コンソール上にはなにやらメッセージが出ますが電卓の GUI が表示されました。

calculator.exe を Wine で実行した例

Windows 用に配布する際はどうするか?

ただ動作させるだけであれば、MinGW64 のランタイム DLL をごっそりコピーしてパスを通せば、とりあえず出来そうです。しかし、オープンソースの配布条件に、理解できる可能な限り、沿った方法にしたいこと、また、アプリが必要な DLL だけをピックアップしたいことの二点に対応したいので、調査、準備をしてから、あらためて後日、ブログ記事にします。

ちなみに、クロスコンパイラ関係のパッケージを、例えば binutilsCross をキーワードにして確認すると、多くのアーキテクチャのものが表示されて、その数の多さに驚きます。

[bitwalk@fedora-pc ~]$ sudo dnf search binutils Cross
メタデータの期限切れの最終確認: 0:30:07 時間前の 2020年08月16日 21時07分21秒 に実施しました。
=============================================== Name & Summary 一致: Cross, binutils ===============================================
cross-binutils-common.noarch : Cross-build binary utility documentation and translation files
arm-none-eabi-binutils-cs.x86_64 : GNU Binutils for cross-compilation for arm-none-eabi target
avr-binutils.x86_64 : Cross Compiling GNU binutils targeted at avr
mingw32-binutils.x86_64 : Cross-compiled version of binutils for the Win32 environment
mingw64-binutils.x86_64 : Cross-compiled version of binutils for the Win64 environment
binutils-aarch64-linux-gnu.x86_64 : Cross-build binary utilities for aarch64-linux-gnu
binutils-alpha-linux-gnu.x86_64 : Cross-build binary utilities for alpha-linux-gnu
binutils-arc-linux-gnu.x86_64 : Cross-build binary utilities for arc-linux-gnu
binutils-arm-linux-gnu.x86_64 : Cross-build binary utilities for arm-linux-gnu
binutils-avr32-linux-gnu.x86_64 : Cross-build binary utilities for avr32-linux-gnu
...
(以下省略)
...

参考サイト

  1. Cross-compiling the GLib package: GLib Reference Manual
  2. Cross and Native File reference

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

0 件のコメント: