LinuxMint上にWindows64bit向けFreePascalクロスコンパイラを動作させる環境を作ったよ
※LinuxMint上にWindows64bit向けFreePascalクロスコンパイラを動作させる環境を作ったよ その2 - 四角革命前夜の方が楽かも!
大変だった……
5〜6時間くらいかかった……
環境:LinuxMint12 64bit
下準備
$ mkdir -p $HOME/Binary $HOME/Repos/src
~/Binary以下にこれから生成するバイナリ類を、~/Repos/src以下にソースなどを置きます。
http://ftp.gnu.org/gnu/binutils/からダウンロードするもの:
- binutils-2.22.tar.gz
http://sourceforge.net/projects/freepascal/files/からダウンロードするもの:
fpcbuildは後述する1つ目の参考ページにはsvnで取ってくるとか書いてあるんだけど、持ってこれなかった。
いずれも~/Repos/srcに入れておいてください。
FreePascalをインストール
あとでWindows向けunitsをコンパイルするのにFreePascalが必要なので先にインストールします。
$ cd ~/Repos/src $ tar xvf fpc-2.6.0.x86_64-linux.tar $ cd fpc-2.6.0.x86_64-linux/ $ sh install.sh
インストール中にいろいろ聞いてくるんだけど、以下のようにした。
Install prefix (/usr or /usr/local) [/home/sasaplus1/fpc-2.6.0] : /home/sasaplus1/Binary/fpc-2.6.0 Install Textmode IDE (Y/n) ? n Install FCL (Y/n) ? y Install packages (Y/n) ? y Install documentation (Y/n) ? y Install demos (Y/n) ? y
ドキュメントもデモも要らなかったかもだけど、まあ一応。
んで、パスを通す。.bashrcに書いておくと楽かも。
$ export PATH=$HOME/Binary/fpc-2.6.0/bin:$PATH
binutilsのコンパイル
続いてWindows向けのbinutilsをコンパイルします。
$ cd ~/Repos/src $ tar xvfz fpcbuild-2.6.0.tar.gz $ cd fpcbuild-2.6.0/install/cross $ cp buildcrossbinutils{,.sh} $ vi buildcrossbinutils.sh
buildcrossbinutils.shを編集します。
--- buildcrossbinutils 2009-04-22 00:47:06.000000000 +0900 +++ buildcrossbinutils.sh 2012-02-18 16:52:13.646661001 +0900 @@ -5,7 +5,7 @@ # Note:cygwin seems to like to have all platforms qualified. # -BASE=~ +BASE=~/Binary/fpc # where to store the built tree of binutils? DESTDIR=${BASE}/cross @@ -17,28 +17,29 @@ WORKDIR=${BASE}/buildme # where is the binutils archive? -BINUTILSPATH=~ +BINUTILSPATH=~/Repos/src # what is it's base name? BINUTILSBASE=binutils # what is the version part of the archive? -BINUTILSVERSION=2.14 +BINUTILSVERSION=2.22 # is binutils archive gz or bz2? -BINUTILS_GZIP=no +BINUTILS_GZIP=yes # what i6868 platform do you want/need to build for? MYINTEL=i686 # target info, OSes per processor with "WIN" as special case -BSD="freebsd netbsd openbsd" -TARGETS_WIN="cygwin mingw32 msdosdjgpp" -TARGETS_I386="${BSD} linux solaris darwin" -TARGETS_X86_64="${BSD} linux" -TARGETS_POWERPC="${BSD} linux darwin" -TARGETS_SPARC="${BSD} linux solaris" +TARGETS_X86_64="mingw32" +#BSD="freebsd netbsd openbsd" +#TARGETS_WIN="cygwin mingw32 msdosdjgpp" +#TARGETS_I386="${BSD} linux solaris darwin" +#TARGETS_X86_64="${BSD} linux" +#TARGETS_POWERPC="${BSD} linux darwin" +#TARGETS_SPARC="${BSD} linux solaris" #TARGETS_M68k=
で、あとはこのスクリプトを実行する。
$ sh buildcrossbinutils.sh
$ less ~/Binary/fpc/logs/log-x86_64-mingw32
lessで入ったあと、Fでtailするといいかも。
コンパイルが終わると、~/Binary/fpc/cross/binにx86_64-mingw32-*なコマンドがインストールされてるはず。
unitsのコンパイル
Windows向けunitsをコンパイルします。たぶん。
1つ目の参考ページではbinutilsと同じディレクトリにあるシェルスクリプトを編集して〜ってあるんだけど、
うまく行かなかったので手動で。といってもシェルスクリプトでやってることとあまり変わらないんだけど。
$ ~/Repos/src $ tar xvfz fpc-2.6.0.source.tar.gz $ cd fpc-2.6.0 $ make clean all LIBDIR=$HOME/Binary/fpc/cross/lib CROSSBINDIR=$HOME/Binary/fpc/cross/bin OS_TARGET=win64 CPU_TARGET=x86_64 BINUTILSPREFIX=x86_64-mingw32- OPT="-Xd -Xt -gl" $ make install INSTALL_PREFIX=$HOME/Binary/fpc LIBDIR=$HOME/Binary/fpc/cross/crosslibs/x86_64-mingw32 CROSSBINDIR=$HOME/Binary/fpc/cross/bin OS_TARGET=win64 CPU_TARGET=x86_64 BINUTILSPREFIX=x86_64-mingw32- OPT="-Xd -Xt -gl"
設定ファイルを作る
~/fpc.cfgを作ります。必要ないかもしれないけど……
#IFDEF win64 -FD~/Binary/fpc/corss/bin -Fu~/Binary/fpc/lib/fpc/$fpcversion/units/x86_64-win64/ -Fu~/Binary/fpc/lib/fpc/$fpcversion/units/x86_64-win64/* -Fu~/Binary/fpc/lib/fpc/$fpcversion/units/x86_64-win64/rtl -XPx86_64-mingw32- #ELSE -Fu~/Binary/fpc-2.6.0/lib/fpc/$fpcversion/units/$fpctarget/ -Fu~/Binary/fpc-2.6.0/lib/fpc/$fpcversion/units/$fpctarget/* -Fu~/Binary/fpc-2.6.0/lib/fpc/$fpcversion/units/$fpctarget/rtl #ENDIF
-dwin64ってするとこれが適用されるみたいだけど……ならなかったのでコンパイルする際は直に指定してたりするw
まあ、Makefile書いたりすることが多いだろうからそれでいいんじゃないかと思う。
コンパイル
実際にコンパイルしてみる。
program aaa; {$MODE DELPHI} {$APPTYPE CONSOLE} begin WriteLn('Hello, World!'); end.
$ fpc fpc aaa.lpr -Twin64 \ -FD$HOME/Binary/fpc/corss/bin \ -Fu$HOME/Binary/fpc/lib/fpc/2.6.0/units/x86_64-win64/ \ -Fu$HOME/Binary/fpc/lib/fpc/2.6.0/units/x86_64-win64/* \ -Fu$HOME/Binary/fpc/lib/fpc/2.6.0/units/x86_64-win64/rtl \ -XPx86_64-mingw32- Free Pascal Compiler version 2.6.0 [2011/12/23] for x86_64 Copyright (c) 1993-2011 by Florian Klaempfl and others Target OS: Win64 for x64 Compiling aaa.lpr Linking aaa.exe 8 lines compiled, 0.1 sec , 30992 bytes code, 1844 bytes data
できた!
ただ、すぐに使えるWindows 64bit環境がなかったから試せてない……
$ objdump -a aaa.exe aaa.exe: file format pei-x86-64 aaa.exe
まあ、たぶん64bit向けにコンパイルできてるんじゃないかな。
参考:
Cross compiling for Win32 under Linux - Lazarus wiki
「あなくつ」のおもちゃばこ - Blog - FreePascalでクロスコンパイル (その後)