CMakeでmoshをクロスコンパイルする

moshはクロスコンパイルに関して結構熱心に対応しているので、autotoolsでもCMakeでも正常にクロスコンパイルできる。ただし、CMake版のmoshはpsyntax-moshが無く、ビッグエンディアンアーキテクチャに対応していない
クロスビルドにちゃんと対応しているのは、テストの効率を向上させるため。Win32ビルドであっても、gccでビルドする以上はFreeBSDなりLinuxなりでビルドしたほうがずっと早くビルドできるので。。もちろん先日のKindle版も、FreeBSD上のARM Linux向けのクロスコンパイラでCMakeを使ってビルドしている。

autotoolsビルド

autotoolsビルドは非常に簡単で、--hostに続けてアーキテクチャを指定するだけ。つまり、

  1. ロスコンパイラをインストールし、host tripleを調べる。host tripleは例えばx86_64-unknown-linux-gnu-gccというgccだったらx86_64-unknown-linux-gnuの部分。
  2. --hostに続けてhost tripleを入れてconfigureする。
./configure --host=arm-unknown-linux-gnueabi

もちろん、onigurumaやgmpを先に同様の手法でインストールする必要がある。

CMakeビルド

ただ、リトルエンディアンなアーキテクチャに対してクロスコンパイルするならCMakeビルドのほうがおすすめ。CMakeビルドの場合、onigurumaをインストールする必要は無い。

  • toolchain fileを準備する

toolchain fileは、単なるCMakeファイルで、たとえばARM Linux向けならこういう内容(linux-arm.cmake)になる。ファイル名はlinux-XXX.cmakeという風にsystem_nameに合わせる。

SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_C_COMPILER /opt/arm-cross/bin/arm-unknown-linux-gnueabi-gcc)
SET(CMAKE_CXX_COMPILER /opt/arm-cross/bin/arm-unknown-linux-gnueabi-g++)

SET(CMAKE_FIND_ROOT_PATH /opt/arm-cross/arm-unknown-linux-gnueabi)

SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
  • configする
mkdir build
cd build
cmake ~/repos/mosh -DCMAKE_TOOLCHAIN_FILE=/PATH/TO/linux-arm.cmake

configしたあとは、普通のCMakeプロジェクトと同様にビルドできる。