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/からダウンロードするもの:

http://sourceforge.net/projects/freepascal/files/からダウンロードするもの:

  • fpc-2.6.0.source.tar.gz
  • fpcbuild-2.6.0.tar.gz
  • fpc-2.6.0.x86_64-linux.tar

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でクロスコンパイル (その後)