삽질하는플머

'파스칼 만세'에 해당되는 글 1건

  1. Xcode 3.2.5, iOS SDK 4.2 에서 파스칼로 코딩하기. 10

Xcode 3.2.5, iOS SDK 4.2 에서 파스칼로 코딩하기.

여가생활/맥과 아이폰
사실 이 글의 분류는 라자루스에 가깝지만... 자잘한 삽질이야기는 차차 하기로 하고 여기서는 그 결과만 공유해 봅니다. 
FPC for iPhone 의 동작원리 등 좀 더 자세한 이야기는 이후 하기로 하지요.  
제 블로그에서 존대말을 쓰려니 뻘쭘하지만... 삽질기가 아니기 때문에... ^^;  

프리파스칼의 위키에서 아이폰 SDK용 인테그레이션 키트에 관한 글을 발견한지 햇수로 2년이 흘렀습니다. 

이 키트는 당시에도 컴파일 한 번 해보려면 많은 삽질을 해야했는데, 그 이후 별다른 버전업이 없었기 때문에 최신 버전인 iOS SDK 4.2 에서 FPC를 쓴다는 것은 예전보다 훨씬 더 큰 삽질을 요구하게 되었습죠. 이때문에 많은 파스칼 사용자들이 부푼 꿈을 안고 도전했다가 절래절래 고개를 저으며 그냥 오브젝티브-C 로 자신의 코드를 다시 만드는 길을 선택하는 듯 합니다.  

하지만... 저는 거의 십년간 윈도에서 델파이와 OpenGL을 사용해 게임을 만들어왔습니다. 오브젝티브-C는 분명히 매력적이고 장점이 많은 언어지만 제가 작성해온 코드들를 오브젝티브-C로 다시 쓰기에는 너무 먼 길을 와버렸지요. 무엇보다 저는 파스칼로 생각하고 만드는 일을 즐거워하기 때문에 아이폰이라고 해서 이 즐거움을 포기하고 싶지는 않았습니다. 

그럼 시작해봅시다. 

먼저 애플에서 배포중인 최신버전의 Xcode를 설치합니다. 이 글을 적는 시점에서 Xcode는 3.2.5, iOS SDK는 4.2 로군요. 
그리고 프리파스칼의 위키에서 설명하는 대로 다음 두 개의 FPC 배포판을 차례로 설치하세요. 

FPC 2.4.0 for Mac OS X : ftp://ftp.freepascal.org/pub/fpc/dist/2.4.0/i386-macosx/fpc-2.4.0.intel-macosx.dmg 
FPC 2.5.1(r14397) for iPhone: ftp://ftp.freepascal.org/pub/fpc/snapshot/v25/arm-macosx/fpc-2.5.1v1.arm-iphone.dmg 
(tistory가 링크 앞에 자동으로 "http://" 를 붙이는군요. 자동링크 삭제합니다. 본문을 긁어 주소창에 넣어주세요. 광일님 죄송~~ ^^)

iPhone용 FPC를 2.4.0이 아닌 2.5.1 버전을 쓰는 이유는 이 버전부터 arm 컴파일시에 VFP라 불리는 수치연산 보조기능을 사용할 수 있기 때문입니다. 저는 게임을 만드는 것이 목적이기 때문에 선택의 여지가 없지요. 또한 "오브젝티브-파스칼" 이라는 해괴한 코드를 쓸 수 있다는 장점도 생깁니다만 여기서는 논외로 하겠습니다. 

FPC 설치가 끝나면 설치 스크립트가 iOS SDK의 경로를 물어옵니다. 문제는 이 FPC for iPhone이 iPhoneOS 3.1 시절의 물건이기 때문에 설치가 제대로 되지 않습니다. 때문에 스크립트를 고쳐 최신버전의 SDK를 인식할 수 있게 해야하지요. 저는 착한 프로그래머이므로 고친 스크립트를 첨부합니다. 

위 압축파일을 내려받아 /Developer/FreePascalCompiler/iPhoneSnapshot-2.5.1-r14397/InstallScript 에 풀어주세요. 이 스크립트를 실행시키면 뭐라 뭐라 좌르륵 떠들며 FPC 환경을 설치해 줄 것입니다. 

# cd  /Developer/FreePascalCompiler/iPhoneSnapshot-2.5.1-r14397/InstallScript
# ./finish_fpc_iphone_install.command


 


이제 Xcode를 실행시켜보면 "User Templates" 항목에 "OpenGL ES App (FPC) 2.5.1" 이라는 템플릿이 보입니다. 




그러나 이 템플릿을 기반으로 프로젝트를 만들면 빌드조차 되지 않습니다. VFP를 사용하는 FPC 컴파일스위치가 기본값으로 되어있어 시뮬레이터용 i386 빌드가 실패하기 때문입죠. 뭐 이후 제가 겪은 삽질은 미처 공개하지 못한 블로그의 행마다 절규하는 욕설로 그 처참함을 짐작할 수 있지만 생략하고... 저는 선량한 프로그래머인지라 지름길로 인도해 드리겠습니다.  

위의 파일을 내려받아 압축을 풀어 /Library/Application Support/Developer/Shared/Xcode/Project Templates 에 옮겨주세요. 다시 Xcode에서 새 프로젝트 메뉴를 클릭하면 다음과 같이 새로운 템플릿이 표시됩니다. 



(아이콘이 기분나쁘시다면 정말 기분탓입니다~~ ^^)

빌드해보시면~~ 시뮬레이터에서 얌전히 꿈틀거리는 사각형을 보실 수 있습니다. 



기존의 템플릿과 비교해 수정된 사항은 다음과 같습니다. 

1. 최신버전의 SDK에서 빌드되도록 하고 Deployment 옵션에서 대상 OS는 3.0으로 함. 
2. FPC 로고 애니메이션 대신 Xcode의 기본 OpenGL ES 템플릿과 동일한 화면으로 수정.  
3. 화면 갱신에 NSTimer 대신 CADisplayLink 를 사용. 
4. fpclogo.pas 를 MainUnit.pas 로 바꾸고, 의미를 혼동할 수 있는 glInit, glDraw 함수는 InitScene, DrawScene 로 변경. 
5. 파스칼 유니트에서 앱 종료시 데이터를 정리할 수 있도록 CloseScene 프로시저를 만들어 둠. 
6. Extended 를 사용하는 math 유니트의 삼각함수 대신 C런타임의 sinf, cosf 를 사용. 
7. 디바이스 릴리즈 모드의 팻바이너리 생성시 armv6, armv7 용으로 각각 다른 VFP옵션을 주도록 함. 
8. 앱 빌드 후 코드사인 전에 strip을 구동, 실행파일의 크기를 20~30% 정도 줄임. 
9. 타이틀바를 없애고 전체화면을 기본으로 함. 


아직 해결해야 할 문제도 있습니다.  

1. 릴리즈 모드의 팻바이너리에서 libfpc.a 를 중복해 만드는 문제. 
2. 아이패드용 템플릿도 필요하다. 
3. 그 외에는... 음... 생각나는 대로 추가할 예정... 



마지막으로, Xcode는 이미 파스칼에 대한 문법 하이라이팅을 지원하지만 이게 초창기 문법에 대한 것이라 실제 코딩하려고 하면 영 깨림직합니다. 




보시는 것 처럼 한줄주석도 제대로 처리되지 않고 Library 도 인식하지 못하지요. 

저란 놈은 지난번 허영일님의 세미나에서 딴지를 걸었듯, 문법 하이라이팅 없으면 어떤 코드도 만들기 싫어하는 게으름뱅이인지라... (오죽하면 윈도에서 오브젝티브-C 공부하려고 Dev-C++ 의 소스를 건드릴까요.) 다음 링크를 참조합시다. 


위 파일을 내려받아 /Developer/Library/PrivateFrameworks/XcodeEdit.framework/Versions/A/Resources/Pascal.xlangspec 와 바꿔치기 합니다. 결과는 다음과 같이 깔끔 그 자체입니다. 




이상으로 Xcode에서 파스칼로 OpenGL 랜더링을 하기 위한 삽질의 액기스만 뽑아보았습니다. 
템플릿에서 만들어준 MainUnit.pas 의 DrawScene() 프로시저에 원하시는 그림 그리기 코드를 넣어보세요. 


많은 일들이 있었지만... 이렇게 적어 놓으니 참 별것 아닌 길을 어렵게 걸어왔네요. 
아직 갈 길이 멀고 더 많은 어려움이 있으리라 짐작되지만... 파스칼에 혼을 빼앗긴 우리는 충분히 견뎌내리라 믿숩니다. 
파스칼 만세!




여기까지 해 보시고 궁금해하실 부분에 대해 몇가지 답변을 미리 달아둡니다. 

1.
build 디렉토리에 만들어지는 덩치 큰 libfpc.a 파일은 링크시 사용되며 실행파일에 통째로 들어가지는 않습니다. 안심하세요. 


2. 
FPC 는 PascalLibrary.pas 파일을 컴파일하고 그 결과를 오브젝트파일이 아닌 어셈블리 파일로 변환합니다. 이후 앱의 소스 컴파일 시점에서 이 어셈블리를 GCC로 컴파일하고 앞에서 만들어둔 libfpc.a 와 링크하지요. 때문에 프로젝트에 임의로 추가한 파스칼 소스는 '반드시' PascalLibrary 에서 참조되도록 해서 어셈블리 파일이 생성되도록 해야합니다. 안그러면 빌드시 다음과 같은 에러를 만나게 됩니다. 

... warning: '-x assembler-with-cpp' after last input file has no effect
... no input files
... failed with exit code 1

파스칼 코드를 추가한 뒤에는 MainUnit.pas 등의 uses 항목에도 꼭!! 추가해주세요.


3. 
다른 프로젝트와 마찬가지로 FPC도 뭔가 조금 이상하다고 생각되면 일단 Build->Clean 메뉴부터 실행시켜보세요. 


4. 
패키지 설치할 때 함께 들어있는 Readme.rtf 는 정말 주옥같은 정보를 담고 있으니 반드시 읽어보세요. 









어제는 제 둘째놈 백일이었습니다. 
이 글이 도움이되신다면 맘속으로 제 자식놈들 무탈하라고 한번씩 기원해주시와요~~ ^^;