はじめに
Ubuntu 上に、Windows 64bit 用のクロスコンパイル環境を構築したくなった。Windows 7 に VMware をインストールし、その上で Ubuntu を動作させることとする。
動作環境
Windows 7 Professional 64bit SP1VMware 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」とする。