2012年9月9日日曜日

Ubuntu 上に、Windows 64bit 用のクロスコンパイル環境を構築

はじめに

Ubuntu 上に、Windows 64bit 用のクロスコンパイル環境を構築したくなった。
Windows 7 に VMware をインストールし、その上で Ubuntu を動作させることとする。

動作環境

Windows 7 Professional 64bit SP1
VMware Playre 5 (VMware-player-5.0.0-812388.exe)
Ubuntu 12.04 LTS Alternative amd64 (ubuntu-12.04.1-alternate-amd64.iso)

環境構築

VMware は、インストール済みとする。

仮想マシンの作成

VMware を起動し、「新規仮想マシンの作成」を行う。
以下、設定した値を列挙する。
インストール元:「後で OS をインストール」を選択。
※ 「インストーラ ディスク イメージ ファイル」を選択すると、「簡易インストール」モードになってしまい、デスクトップ環境がインストールされない。通常インストールするには、「後で OS をインストール」を選択する必要がある。

ゲストOS:「Linux」
バージョン:「Ubuntu 64ビット」
仮想マシン名:「Ubuntu64」
場所:任意
ディスク最大サイズ(GB):「50」
「仮想ディスクを単一ファイルとして格納」

「ハードウェアをカスタマイズ」ボタンを押下。
メモリ:「2048」MB
プロセッサ:「4」
新規 CD/DVD(IDE):接続「ISO イメージ ファイルを使用する」、「ubuntu-12.04.1-alternate-amd64.iso」を指定する。

Ubuntu のインストール

仮想マシンを起動すると、Ubuntu のインストールが始まる。
適宜、値を設定する。
インストール中、ウィンドウ下部に、VMware Tools のインストールを促すメッセージが出るが、インストール完了まで放置しておく。

ディスクのパーティショニングについは、「ガイド - ディスク全体を使い、LVM をセットアップする」を選択した。この項目は、Alternate 版のみで表示される項目(なはず)。

ポコペンッ と Ubuntu が起動したら、インストール中に設定した、ユーザーでログインする。

アップデート

端末を起動
※ 10.04 を使っていたので、12.04 では UI 周りがガラッと変わっていて、よ~わからん状態・・・。最初は、端末の起動をするだけで、悶絶してしまったw。
左上の「Dash ホーム」をクリックして、「端末」と入力して検索するか、「Dash ホーム」アイコンを右クリックして、「アプリケーション」を選択、「インストール済み」の中から、探し出す。
む~・・・慣れの問題か・・・。

sudo aptitude update
sudo aptitude full-upgrade

VMware Tools のインストール

ウィンドウ下に、ずっと出ていた「ツールのインストール」ボタンを押下。
ドライブがマウントされ、「VMwareTools-9.2.0-799703.tar.gz」ファイルが表示される。
ファイルを右クリックして、「展開...」を選択。
展開先を適宜選択して、「展開」ボタンを押下。

「端末」のコマンドラインで、展開先の「vmware-tools-distrib」ディレクトリに移動。
sudo ./vmware-install.pl

すべてデフォルト値のまま Enter

再起動する。
sudo reboot now

MinGW-w64 をインストール

端末を起動

sudo aptitude install mingw-w64 g++-mingw-w64 binutils-mingw-w64

以下の新規パッケージがインストールされます:
  binutils-mingw-w64 binutils-mingw-w64-i686{a} binutils-mingw-w64-x86-64{a} g++-4.6{a} g++-mingw-w64 g++-mingw-w64-i686{a} 
  g++-mingw-w64-x86-64{a} gcc-mingw-w64{a} gcc-mingw-w64-base{a} gcc-mingw-w64-i686{a} gcc-mingw-w64-x86-64{a} libstdc++6-4.6-dev{a} 
  mingw-w64 mingw-w64-dev{a} 
0 個のパッケージを更新、 14 個を新たにインストール、 0 個を削除予定、0 個が更新されていない。
80.5 M バイトのアーカイブを取得する必要があります。 展開後に 341 M バイトのディスク領域が新たに消費されます。
先に進みますか? [Y/n/?] 

インストールが完了すると、「/usr/bin」に「x86_64-w64-mingw32-c++」などのコマンドが増えている。
「/usr/x86_64-w64-mingw32」にクロスコンパイル用のヘッダや、ライブラリが格納されている。

インストールしたバージョン

binutils-mingw-w64          2.22-2ubuntu1+1
binutils-mingw-w64-i686     2.22-2ubuntu1+1
binutils-mingw-w64-x86-64   2.22-2ubuntu1+1
g++-mingw-w64               4.6.3-1ubuntu5+5ubuntu1
g++-mingw-w64-i686          4.6.3-1ubuntu5+5ubuntu1
g++-mingw-w64-x86-64        4.6.3-1ubuntu5+5ubuntu1
gcc-mingw-w64               4.6.3-1ubuntu5+5ubuntu1
gcc-mingw-w64-base          4.6.3-1ubuntu5+5ubuntu1
gcc-mingw-w64-i686          4.6.3-1ubuntu5+5ubuntu1
gcc-mingw-w64-x86-64        4.6.3-1ubuntu5+5ubuntu1
mingw-w64                   2.0.1-1
mingw-w64-dev               2.0.1-1


その他ツールのインストール

nasm および yasm

両方ともアセンブラ。ビルド時に必要になることがある。両方入れておけば、問題ない。

sudo aptitude install nasm yasm

構成管理ツール

git および subversion をインストール。

sudo aptitude install git subversion

checkinstall

make install などで、インストールすると、パッケージ管理の対象外となってしまうが、checkinstall を使用することで、rpm や dep などのパッケージを作成でき、パッケージ管理可能となる。

sudo aptitude install checkinstall

autoreconf

autogen.sh の中で使ってたりする。

sudo aptitude install dh-autoreconf

ccache

コンパイル結果をキャッシュして、2回目以降の実行時間を短縮するためのツール。1回しかコンパイルしないのならば、必要ない。

sudo aptitude install ccache

ccache g++ hoge.cpp のように実行する方法や、 PATH の先頭に /usr/lib/ccache/ ディレクトリを追加して、 g++ などのリンクファイル(リンク先は、ccache)を実行する方法などがある。
/usr/lib/ccache/ ディレクトリの実行リンクファイルは、ccache のインストール時に、自動的に更新されるようだ。

実際には以下のようにする。
PATH=/usr/lib/ccache:${PATH} make

実行結果のキャッシュ先は、デフォルトで「${HOME}/.ccache」ディレクトリになっている。
変更する場合は、「CCACHE_DIR」環境変数に設定する。

最大キャッシュサイズのデフォルト値は、1GBになっている。必要に応じて、最大値を以下のように設定できる。10 GByte に増やした。設定は、キャッシュディレクトリごとに、行う必要がある。

CCACHE_DIR=${HOME}/.ccache-mingw64 \
ccache -M 10G

設定した値は、以下のように確認できる。

CCACHE_DIR=${HOME}/.ccache-mingw64 \
ccache -s

cache directory                     /home/user1/.ccache-mingw64
cache hit (direct)                    34
cache hit (preprocessed)               0
cache miss                            42
called for link                       18
preprocessor error                     1
no input file                          1
files in cache                        99
cache size                           564 Kbytes
max cache size                      10.0 Gbytes

「CCACHE_DIR」は、デフォルト値のディレクトリを利用する場合、いちいち指定する必要はない。または、export しておいてもよい。

ビルド

実際にビルドを行ってみる。

zlib

zlib のページからソース(zlib-1.2.7.tar.bz2)をダウンロードしてくる。
適当なディレクトリでソースを展開。

tar jxvf zlib-1.2.7.tar.bz2
cd zlib-1.2.7

CC=x86_64-w64-mingw32-gcc \
AR=x86_64-w64-mingw32-ar \
RANLIB=x86_64-w64-mingw32-ranlib \
LDSHAREDLIBC="" \
./configure --prefix=/usr/x86_64-w64-mingw32

PATH=/usr/lib/ccache:${PATH} \
CCACHE_DIR=${HOME}/.ccache-mingw64 \
make

sudo checkinstall --pkgname=zlib-mingw-w64-x86-64 \
--pkgversion="1:1.2.7.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

完了

アンインストールする場合は、「dpkg -r zlib-mingw-w64-x86-64」とする。