삽질하는플머

i386-wince 용 크로스 컴파일 환경 만들기

Lazarus/Mobile
앞에서 설치한 Microsoft Windows CE 5.0 Emulator 를 위한 i386-wince 크로스 컴파일 환경을 구축 해 보자. 

먼저 리테일 버전의 컴파일러 소스를 다운받아 압축을 푼다. 

  fpcbuild-2.2.2.zip

압축을 풀어 생성된 fpcsrc 를 d:\programs\fpc 에 옮겨두자.

GNU utils package 가 필요하다. 여기에서 다운받아 D:\Programs\coreutils 에 풀어둔다. Dependencies 도 함께 다운 받아 풀어둔다.

이미 라자루스/FPC가 설치된 상태이므로 커맨드 창을 하나 띄운 뒤 다음과 같이 입력한다.

cd D:\Programs\fpc\compiler
PATH=c:\lazarus\fpc\2.2.2\bin\i386-win32;D:\Programs\coreutils\bin
make cycle CPU_TARGET=i386 OS_TARGET=wince

결과로 얻어진 ppcross386.exe 을 c:\lazarus\fpc\2.2.2\bin\i386-win32 로 옮긴다.

참고. strip ppcross386.exe 해 주면 용량이 조금 줄어든다...


이제 라자루스 fpc로 가서 rtl을 컴파일하자.

PATH=c:\lazarus\fpc\2.2.2\bin\i386-win32
cd C:\lazarus\fpc\2.2.2\source\rtl
make CPU_TARGET=i386 OS_TARGET=wince PP=ppcross386.exe

C:\lazarus\fpc\2.2.2\source\rtl\units\i386-wince 를 C:\lazarus\fpc\2.2.2\units\i386-wince\rtl 로 복사한다.

다음은 패키지 빌드.

cd C:\lazarus\fpc\2.2.2\source\packages
make CPU_TARGET=i386 OS_TARGET=wince PP=ppcross386.exe

완료된 패키지들의 unit 폴더를 하나씩 C:\lazarus\fpc\2.2.2\units\i386-wince\ 밑으로 옮겨준다. 예를 들어 C:\lazarus\fpc\2.2.2\source\packages\chm 패키지는 위의 작업을 끝내면 units 밑에 i386-wince 폴더가 생성되는데 이 폴더를 잘라다가 C:\lazarus\fpc\2.2.2\units\i386-wince\chm 이라는 이름으로 옮겨주어야 한다는 이야기. 이거 되게 귀찮은데... 다음번에도 이 작업을 해야 한다면, 적당한 셸 스크립트나 유틸리티를 만들어야 겠다. 참고로 i386-wince 용으로 빌드되어 옮겨주어야 하는 패키지는 다음과 같다.

chm
fcl-base
fcl-db
fcl-fpcunit
fcl-image
fcl-json
fcl-net
fcl-passrc
fcl-process
fcl-registry
fcl-web
fcl-xml
fftw
fpmkunit
hash
ibase
libgd
mysql
numlib
odbc
oggvorbis
openssl
oracle
pasjpeg
paszlib
postgres
regexpr
sdl
sqlite
symbolic
tcl
unzip
winceunits
zlib

FCL을 디버깅 정보 포함하여 빌드하는 방법에 대한 포럼글이 읽었는데, 글 말미에 /usr/lib/fpc/2.2.0/units/ 에서 각 유니트에 대한 심볼릭 링크를 걸어주었다는 멋진 아이디어가 있었다. 윈도에서는 Junction 이 해법이 될 듯 한데... (강좌는 여기)... 시간 날 때 이 방법도 추가로 정리 해 보자.

일단 끄적 끄적 셸 스크립트를 만들어 두었다. 뭐 잘 동작하는군.
http://oranke.tistory.com/entry/MoveUnits

컴파일 옵션 -FU 를 사용하면 대상 폴더를 지정할 수 있다. 이걸 쓰면 귀찮은 스크립팅도 필요없어질 듯...

-FU<x>     Set unit output path to <x>, overrides -FE

OPT="-FUC:\Test" 이런식으로...

마지막으로 LCL을 빌드한다.

그 전에 해야 할 일이 하나 있는데, 사실 컴파일러는 실행파일을 만드는 여러 종류의 툴들 중 일부분일 뿐이다. 이 외에도 어셈블러, 링커 등 많은 도구들이 필요하며 이들을 일컬어 binutils 라고 부른다. 그런데 현재 대상 CPU가 i386이므로 binutils 는 라자루스 설치시 제공된 i386-win32 용을 그대로 사용할 수 있다. (사실 컴파일러도...^^) 현 시점에서 리소스 컴파일러인 windress.exe 만 Target-OS 용을 요구된다. 따라서 c:\lazarus\fpc\2.2.2\bin\i386-win32 에 있는 windres.exe 를 i386-wince-windres.exe 로 복사하면 아무 문제없이 LCL을 컴파일 할 수 있다.
(나중에 링커(ld.exe) 나 어셈블러(ar.exe)가 요구된다면 동일한 방법으로 복사 후 이름변경하여 사용하면 된다.)

cd C:\lazarus\lcl
make CPU_TARGET=i386 OS_TARGET=wince PP=ppcross386.exe


이제 컴파일러 옵션에서 Target CPU Family 를 i386 으로 설정하고 리빌드 한다. 




프로젝트 밑에 i386-wince 폴더에 생성된 실행파일을 Microsoft Windows CE 5.0 Emulator 로 옮겨 실행시켜보자. 잘 실행된다. 


 

일단은 여기까지. 라자루스가 만들어내는 후덜덜한 실행파일의 크기와 KOL-CE에 대해서는 여기에 주절거려 두었다.