Windowsにメインの環境を移したものの、WindowsではMinGWでビルドしてLinuxでGCCでビルドして、というのは幾分面倒くさいのでどうにかならないものかと思ってクロスコンパイル環境について軽く探したら、MXEというものがある事を知った。というわけで、MXEの環境を構築してビルドするまでの覚書。
MXEの簡単な説明
- M cross environmentの略
- 実体としてはMakefileのコレクションで、用途に合わせてクロスコンパイル環境を構築できるらしい。
- GTK, SDL, Qtなども対応。
- コンパイラはMinGWを採用しているとのこと。
インストール
公式のチュートリアルは用途に合わせたビルドから説明しているが、Ubuntuであればaptから結構なバリエーションがインストールできるので今回はそちらを使う。
sudo apt-key adv \
--keyserver keyserver.ubuntu.com \
--recv-keys 86B72ED9 && \
sudo add-apt-repository \
"deb [arch=amd64] https://pkg.mxe.cc/repos/apt `lsb_release -sc` main" && \
sudo apt-get update
sudo apt-get install mxe-x86-64-w64-mingw32.{static,shared}-cc
/usr/lib/mxe/usr/binがコンパイラのインストール先になるようだ。
LV2ライブラリのインストール
上記の手順でインストールしたMinGWはヘッダファイルなどが/usr/lib/mxe/usr/の下にインストールされ、そこがヘッダファイルの探索パスになっているようだ。
x86_64-w64-mingw32.static-gcc -x c -v -E /dev/null
上記のコマンドを実行した結果は以下のような感じ。
(略)
#include "..." search starts here:
#include <...> search starts here:
/usr/lib/mxe/usr/lib/gcc/x86_64-w64-mingw32.static/5.5.0/include
/usr/lib/mxe/usr/lib/gcc/x86_64-w64-mingw32.static/5.5.0/include-fixed
/usr/lib/mxe/usr/lib/gcc/x86_64-w64-mingw32.static/5.5.0/../../../../x86_64-w64-mingw32.static/include
End of search list.
# 1 "/dev/null"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/dev/null"
COMPILER_PATH=/usr/lib/mxe/usr/libexec/gcc/x86_64-w64-mingw32.static/5.5.0/:(略)
LIBRARY_PATH=/usr/lib/mxe/usr/lib/gcc/x86_64-w64-mingw32.static/5.5.0/:(略)
COLLECT_GCC_OPTIONS='-v' '-E' '-mtune=generic' '-march=x86-64'
LV2のヘッダを/usr/includeなどにインストールしている場合、MXEのヘッダと定義が衝突してしまって上手くビルドできなかった。
恐らく最も好ましいやり方はLV2を含む形でMXEのビルドを行う事なのだろうが、LV2プラグインを作るならヘッダファイルだけあればよいので、前回書いた通りソースからLV2ライブラリを所定のディレクトリにインストールして、ビルド時にパスを指定することにした。(ここでは/optにインストールしている。)
./waf configure --prefix=/opt
./waf
sudo ./waf install
ビルド
x86_64-w64-mingw32.static-gcc -DLV2_VERSION="1.18.2" -DHAVE_LV2=1 -I/opt/include -std=c99 -o tube-fucker.dll -shared tube-fucker.c
ビルド結果のDLLをWindowsに持って行ってArdourに読み込ませたところ動作したので、ひとまずは成功。