제공 :
한빛 네트워크
저자 : Jonathan A. Zdziarski
역자 : 이호민
원문 :
The iPhone SDK: APIs Apple Didn"t Want You to Know About
오픈 소스 툴 체인 빌드
아마 여러분은 DRM을 내장하여 링크한 애플리케이션을 빌드 하는 것에 반대 의견을 가지고 있거나, 아마도 단지 오픈 소스 소프트웨어를 사용하는 것을 좋아할 것이다. 오픈 소스 툴 체인은 2007년 8월 이래로 존재하였으며 그 동안 무시할 수 없을 만큼 자라나고 있다. 또한 리눅스, 윈도, 오래된 버전의 맥 OS X에서 돌아가게 되었으며, 개발 부서 전체를 레오파드 기반의 맥으로 변환하고 싶지 않을 때 개발자들이 선택할 수 있는 훨씬 저렴한 방법이다.
다수의 오픈 소스 툴 체인 바이너리 배포판이 존재한다. 우리는 아이폰 개발 플랫폼으로 사용하기 위해 단순히 레오파드가 설치된 상태에서 따라가 보겠다.
필요한 것들
인터넷 상에 툴 체인의 비공식 바이너리 배포판이 돌아다니고 있지만 여기서는 소스로부터 직접 빌드할 것이다. 소스로부터 빌드 하기 위해서 아래에 나열된 것들이 필요하다.
지원되는 데스크톱 플랫폼
첫째로 여러분은 지원되는 데스크톱 플랫폼이 필요하다. 현재 툴 체인에서 지원되는 플랫폼들은 다음과 같다.
- Mac OS X 10.4 Intel or PPC
- Mac OS X 10.5 Intel
- Ubuntu Feisty Fawn, Intel
- Ubuntu Gusty Gibbon, Intel
- Fedora Core, Intel
- Gentoo Linux 2007.0, x86_64
- Debian 2.6.18
- CentOS 4
- Windows / Cygwin
Conceited Software의 니콜라스 팬리가 레오파드에서 툴 체인 설치가 실행되도록 노력했으며, 우리의 예제에서 이 방법에 나만의 아이폰 OS 지원을 위한 메모들을 덧붙여 사용할 것이다. 다른 플렛폼들도 기본적으로 같은 절차를 따르면 된다. 툴 체인의 공식 설명서는 다음 위치에 있다.
http://code.google.com/p/iphone-dev/wiki/Building.
고속의 인터넷 환경
이 툴 체인은 그 소스만으로 크기가 수백 메가에 달한다. 고속의 인터넷을 통해 다운로드 하지 않는다면 몇 일 동안 다운로드 해야 될 것이다. 만약 여러분의 인터넷이 그렇게 빠르지 않다면, 아마도 도서관이나 커피숍에서 설치하는 것이 좋을 것이다.
[역자 주: 우리나라에선 도서관, 커피숍보다 –충분히 빠른- 집에서 하는데 좋을 것 같습니다]
오픈 소스 툴
다음으로 필요한 것은, 여러분의 데스크톱에 다음의 오픈 소스 툴들이 설치되어야 한다.
- bison (v1.28 or later)
- flex (v2.5.4 or later)
- gcc (the GNU compiler that handles C, C++, and Objective-C )
- svn (the Subversion source control utity)
이들 중 빠진 게 있다면 계속 따라 가기 전에 빠진 것을 다운로드하고 설치해야 한다. 맥에서는 이것들이 Xcode tools에 포함되어 있으므로 최신 버전의 Xcode로 업그레이드 하면 된다. 대부분의 다른 OS들은 이것들을 배포 판 안에서 선택적으로 설치할 수 있도록 제공한다.
Xcode tools 는 애플 웹 사이트
http://developer.apple.com/tools/xcode/ 에서 다운로드 할 수 있다.
애플 SDK
마지막으로 아이폰 OS 라이브러리와 프레임워크를 사용하기 위해 애플 SDK를 복사해야 한다. 여러분의 애플리케이션이 빌드될 때 이것들과 링크될 것이다.
이미 애플 SDK가 설치되어 있다면 그 프레임워크 라이브러리들을 툴 체인이 볼 수 있는 곳으로 심볼릭 링크만 하면 된다.
sudo mkdir -p /usr/local/share
sudo ln -s/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS2.0.sdk
/usr/local/share/iphone-filesystem
만약 여려분이 이 라이브러리들을 데스크톱에 설치할 수 없다면 jailbroken 1.2/2.0 파일 시스템이 돌고 있는 아이폰으로부터 그 라이브러리와 프레임워크들만 직접 다운로드 할 수도 있다.
애플은 아이폰에서 데스트톱으로 라이브러리를 복사하는 것을 허용하지 않는다. 여러분이 거주하는 곳에서 이 방법이 합법적인지 확인할 필요가 있다.
여러분의 아이폰에 SSH를 설치했다고 가정하고, 다음의 명령어를 사용해 파일들을 /usr/local/share/iphone-filesystem 폴더로 복사한다.
# mkdir -p /usr/local/share/iphone-filesystem
# cd /usr/local/share/iphone-filesystem
# mkdir -p ./System/library ./usr
# scp -r root@[IPHONE IP ADDRESS]:/System/library/Frameworks/ .
# mv Frameworks ./System/library
# scp -r root@iphone:/usr/lib .
# mv lib ./usr
툴 체인 컴파일
툴 체인에 필요한 소스코드는 두 저장소에 나뉘어 있다. 하나는 LLVM 컴파일러 프레임워크고 다른 하나는 나머지 툴 체인이다. 여러분이 사용할 빌드 디렉토리를 만들고 cd 명령어로 그 디렉토리로 이동한다. 이제 서브버젼을 사용하여 두 프로젝트들을 각각의 저장소로부터 체크아웃한다.
$ svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm-svn -r 42498
$ svn co http://iphone-dev.googlecode.com/svn/trunk/ iphone-dev
또한 여로 조각의 새 버전의 아이폰 OS를 가져오기 위해 두개의 SVN 저장소를 스위치 아웃 해야 한다. 이렇게 하면, 아이폰 OS가 공식 릴리즈 되면 결과적으로 이를 소스트리의 루트로 머지할 것이다.
$ pushd include
$ svn switch http://iphone-dev.googlecode.com/svn/branches/include-1.2-sdk
$ popd
$ pushd odcctools
$ svn switch http://iphone-dev.googlecode.com/svn/branches/odcctools-9.2-ld
$ popd
인터넷선의 속도에 따라 다운로드는 한 시간 이상이 걸릴 수 있다. 양쪽 저장소가 모두 체크아웃 되면 이제 빌드를 시작할 차례다.
아마 여러분이 내장 쉘 명령어인 pushd와 popd의 사용이 친숙하지 않을지도 모르겠다. 이것들은 cd 명령어와 비슷하지만 추가로 디렉터리를 스택에 푸쉬, 팝 한다. 이로 인해 새 디렉터리에서 뭔가를 한 뒤 이전 디렉터리로 돌아와야 할 때 이전 디렉터리가 어디였는지 기억하지 않고도 돌아올 수 있다.
또한 sudo 명령어가 사용된 것을 볼 수 있는데, 이것은 명령어를 특별한(root)권한으로 실행하는 유닉스 툴 이다. 특정 명령어를 root권한으로 실행하려 한다면 (이 방법은 운영체계의 민감한 데이터에 접근하고 운영체제를 망가트리는 위험한 행동이 될 수 있기 있다) 명령어 앞에 sudo를 붙여 실행하면 된다. 맥 OS X 에서는 그 명령어를 실행하기 전에 root 암호를 물어볼 것이다. 만약 sudo가 없다면 명령어들중 sudo만 제외하고 실행하면 되는데, 먼저 su 실행해 루트 권한을 획득해야 된다.
1단계: LLVM 프레임워크 빌드와 설치
LLVM (Low Level Virtual Machine) 프레임워크는 컴파일러를 빌드하기 위한 표준 환경(infrastructure)를 제공한다. LLVM은 기초적인 컴포넌트들을 모두 다시 작성할 필요 없이 표준화된 컴파일러를 빌드하기 위해 필요한 훅(hook)과 API들을 제공한다. 다음의 명령어들을 사용해 llvm 컴파일러의 릴리즈 빌드를 컴파일 하고 설치한다.
$ pushd llvm-svn
$ ./configure --enable-optimized
$ make ENABLE_OPTIMIZED=1
$ sudo make install
$ LLVMOBJDIR=`pwd`
$ popd
2단계: 크로스-컴파일-툴 빌드와 설치
다음의 명령어들을 따라 크로스-컴파일러를 빌드하고 설치한다. 아래의 내용은 Mac OS X 용으로 여러분이 다른 플렛폼을 사용한다면 공식 문서를 읽어 이를 변경해야 한다.
$ pushd iphone-dev
$ sudo mkdir /usr/local/arm-apple-darwin
$ mkdir -p build/odcctools
$ pushd build/odcctools
$ ../../odcctools/configure --target=arm-apple-darwin --disable-ld64
$ export INCPRIVEXT="-isysroot /Developer/SDKs/MacOSX10.4u.sdk"
$ make
$ sudo make install
$ popd
$ HEAVENLY=/usr/local/share/iphone-filesystem
3단계: 저-수준 API 헤더 설치
아이폰의 아키텍쳐가 데스크톱과 다르기 때문에 아이폰의 저-수준 API들에 접근하기 위해서 특별한 헤더들을 설치해야 한다. 다음의 명령어들을 사용해 이를 설치한다.
$ pushd include
$ ./configure
--with-macosx-sdk=/Developer/SDKs/MacOSX10.4u.sdk
$ sudo bash install-headers.sh
$ popd
4단계: Csu 설치
Csu는 어셈블리의 "시작" 진입 점에 C 훅을 제공하고, 여러분의 프로그램의 main() 함수가 호출되도록 스택을 구성한다. 이는 꼭 필요한 연결(glue) 코드이다.
$ mkdir -p build/csu
$ pushd build/csu
$ ../../csu/configure --host=arm-apple-darwin
$ sudo make install
$ popd
5단계: llvm-gcc의 빌드와 설치
이제 LLVM, 크로스 컴파일 툴, 그리고 Csu가 빌드 되었으므로 컴파일러 자체를 빌드하고 설치한다. 여기서부터 따라가기 시작했거나 터미널 창을 닫은 적이 있다면 환경변수 $LLVMOBJDIR, $HEAVENLY 가 적적한 디렉터리들로 설정되어 있는지 확인해야 한다. 환경 변수 LLVMOBJDIR는 LLVM을 빌드했을 때 컴파일 된LLVM 오브젝트 파일들의 위치로 설정되어 있어야 한다. 이 값들은 llvm-gcc를 빌들할 때 사용된다. 환경 변수 HEAVENLY는 아이폰의 라이브러리를 데스크톱으로 카피한 위치로 설정되어야 한다. 이 위치는 아이폰의 라이브러리를 데스크탑 어디에 복사했는지에 따라 다르다. 이 디렉터리는 애플리케이션을 컴파일할 때 llvm-gcc에서 프레임워크와 라이브러리에 링크할 때 사용된다. "Heavenly"라는 이름은 애플에서 아이폰 소프트웨어의 1.0 코드 베이스에 붙인 코드명이다. 최근 버전(1.2)의 이름은 “Aspen”이지만 툴 체인 에서는 원래의 이름이 계속 사용되고 있다. 두 이름 모두 스키 슬로프의 이름에서 비롯되었다.
$ set
| grep -e LLVMOBJDIR -e HEAVENLY
만약 위의 명령어로부터 아무런 출력을 볼 수 없다면 환경변수를 다시 설정하여야 한다. 빌드 디렉터리로 돌아가 다음 명령어를 실행한다.
$ pushd
llvm-svn && LLVMOBJDIR=`pwd` && popd
$ HEAVENLY=/usr/local/share/iphone-filesystem
이것들이 모두 준비되었다고 확신하면 컴파일러를 빌드하고 설치하기 위해 다음 명령어들을 입력한다.
$ mv llvm-gcc-4.0-iphone/configure llvm-gcc-4.0-iphone/configure.old
$ sed
"s/^FLAGS_FOR_TARGET=$/FLAGS_FOR_TARGET=${FLAGS_FOR_TARGET-}/g"
llvm-gcc-4.0-iphone/configure.old > llvm-gcc-4.0-iphone/configure
$ sudo ln -s /usr/local/arm-apple-darwin/lib/crt1.o
/usr/local/arm-apple-darwin/lib/crt1.10.5.o
$ mkdir -p build/llvm-gcc-4.0-iphone
$ pushd build/llvm-gcc-4.0-iphone
$ export FLAGS_FOR_TARGET="-mmacosx-version-min=10.1"
$ sh ../../llvm-gcc-4.0-iphone/configure
--enable-llvm=`llvm-config --obj-root`
--enable-languages=c,c++,objc,obj-c++
--target=arm-apple-darwin --enable-sjlj-exceptions
--with-heavenly=$HEAVENLY
--with-as=/usr/local/bin/arm-apple-darwin-as
--with-ld=/usr/local/bin/arm-apple-darwin-ld
$ make LLVM_VERSION_INFO=2.0-svn-iphone-dev-0.3-svn
$ sudo make install
$ popd
$ popd
축하한다! 이제 아이폰을 위한 자유 툴 체인이 설치되었다. 이제 여러분은 아이폰 애플리케이션을 컴파일 할 준비가 되었다. 이 컴파일러는 /usr/local/bin/arm-apple-darwin-gcc 실행하여 바로 실행할 수 있다.
아이폰 OS용의 애플리케이션을 빌드할 때 추가로 다음 CFLAGS를:
CFLAGS = -fobjc-abi-version=2
-F/usr/local/share/iphone-filesystem/System/library/PrivateFrameworks
그리고 다음의 LDFLAGS를 사용해야 한다.
-lobjc
Resources
- iPhone Open Application Development -- book by Jonathan Zdziarski
- iPhone Open Application Development Forum -- Join conversations with author Jonathan Zdziarski, and other developers designing third-party software that will run on the iPhone
저자 Jonathan A. Zdziarski는 아이폰 개발 커뮤니티에서 해커 "NerveGas"로 더 알려져 있다. 그는 아이폰을 크래킹하고, 첫 번째 오픈 소스 애플리케이션을 포팅을 이끈 것으로 잘 알려져 있다. 여러 geek 뉴스 사이트들에서 그의 성과에 환호하였고 Jonathan은 주된 아이폰 API들의 장점들을 모두 사용한 최초의 애플리케이션인 NES.app (닌텐도 게임 에뮬레이터)로 가장 유명하다.