GNU HelloをWindows向けにクロスコンパイル

今度は既存のプログラムをWindows向けにクロスコンパイルしてみる。
お試しなので簡潔かつ完結したものとしてGNU Helloでやってみよう。

まずGNU projectのサーバからGNU Helloのソース一式が入ったアーカイブを落とす。
UbuntuにはこのDebian版のパッケージhelloがあるのでソースもapt-getで取ってこれるが、
trustyだとバージョンが2.8-4であり、オリジナル版の2.10より古いようだ。
xenial以降だと2.10のようだが、せっかくなのでGNUオリジナルのアーカイブを利用する。

取ってきたアーカイブhello-2.10.tar.gzを適当なディレクトリに放り込み、それを展開する。

$ cd works/
$ ls
hello-2.10.tar.gz
$ tar xfz hello-2.10.tar.gz
$ ls -CF
hello-2.10/  hello-2.10.tar.gz

展開したディレクトリに移動し、configureとmakeを行う。
クロスコンパイルを行うのであれば、
configureする時に--hostオプションで作成対象のプラットフォームを指定する。
32bit版Windowsならi686-w64-mingw32を指定してやればよい。

$ cd hello-2.10/
$ ls -CF
ABOUT-NLS    GNUmakefile  README          aclocal.m4    contrib/  maint.mk
AUTHORS      INSTALL      README-dev      build-aux/    doc/      man/
COPYING      Makefile.am  README-release  config.in     hello.1   po/
ChangeLog    Makefile.in  THANKS          configure     lib/      src/
ChangeLog.O  NEWS         TODO            configure.ac  m4/       tests/
$ ./configure --host=i686-w64-mingw32
...snip
$ ls -CF
ABOUT-NLS    INSTALL      README-dev      config.h        contrib/  man/
AUTHORS      Makefile     README-release  config.in       doc/      po/
COPYING      Makefile.am  THANKS          config.log      hello.1   src/
ChangeLog    Makefile.in  TODO            config.status*  lib/      stamp-h1
ChangeLog.O  NEWS         aclocal.m4      configure*      m4/       tests/
GNUmakefile  README       build-aux/      configure.ac    maint.mk
$ make
...snip
$ ls -CF
ABOUT-NLS    INSTALL      README-dev      config.h        contrib/    maint.mk
AUTHORS      Makefile     README-release  config.in       doc/        man/
COPYING      Makefile.am  THANKS          config.log      hello.1     po/
ChangeLog    Makefile.in  TODO            config.status*  hello.exe*  src/
ChangeLog.O  NEWS         aclocal.m4      configure*      lib/        stamp-h1
GNUmakefile  README       build-aux/      configure.ac    m4/         tests/

作業途中で問題が起きなければhello.exeが出来上がっている。

出来上がったhello.exeをWindows側へ持っていき実行する。

Z:\> hello
Hello, world!

Z:\> hello --traditional
hello, world

Z:\> hello --greeting="こんにちは世界"
こんにちは世界