INTRODUCTION
삼성의 오픈소스 배포 사이트를 통해 bada SDK 소스 코드가 공개되어 있다. 현재 블로그 작성 시점에서 공개된 최신 버전은 2.0.0 으로 바다 에뮬레이터 빌드에도 동일한 버전의 SDK Source code 를 사용하였다.
OPEN SOURCE RELEASE CENTER
에뮬레이터 빌드를 해보게 된 경위는, BalloonRide 라는 바다 개발자 사이트에 소개된 cocos2dx 기반의 게임 프로젝트를 테스트 해보다가 에뮬레이터에서는 시작화면에서 'START' 로 메인 화면 전환시점에 Exception 도 없이 앱이 뻗어버리는 현상이 발생하여, 혹시 에뮬레이터 메모리 부족으로 인한 문제인가 싶어 메모리 증가를 위해서였다. (에뮬레이터 메모리 관련 옵션 추가 개발은 예정에 없는건가?) 결과는 에뮬레이터 메모리를 2배 정도 증가시켜 빌드하여 테스트 해보았는데, 역시나 동일한 문제가 발생하여 BalloonRide 게임 프로젝트의 에뮬레이터 실행은 현재 거의 포기 상태이다. (BalloonRide 빌드 시, cocos2dx 최신버전 이용 시에는 관련 라이브러리 수정이 필요.)
BalloonRide with Emulator
PREPARATION
소스코드인 bada_SDK_2.0.0.zip 은 다음 9개 파일로 압축되어 있는데, 에뮬레이터 관련파일은 qemu.zip 파일로 qemu 오픈소스 프로젝트 기반으로 작성되어 있다.
bada_SDK_2.0.0.zip
7z465.tar.bz2
bada-g++-4.5.3-src.tar.bz2
badaIDE.zip
gdb-7.1.zip
JsCore.zip
LICENSE.txt
PerformanceAnalyzer.zip
profiler.zip
qemu.zip
qemu.zip 압축 해제 후, INTALL 파일의 내용을 살펴보면 qemu 빌드를 위한 툴 및 방법이 나열되어 있다. 문제는 INSTALL 파일 내용대로 빌드를 수행했을 때, 에러 없이 제대로 빌드되는 모듈이 거의 없다는 것이다.
빌드를 위해 필요한 툴체인 및 라이브러리 소스는 다음과 같으며, 몇몇 라이브러리는 해당 사이트에서 다운로드 해야 하고, 배포 시 포함되어 있는 소스도 configure 설정이나 기타 빌드 에러 문제로 인해, 추가적인 다른 버전의 다운로드가 필요하다.
Toolchain | MinGW and MSYS | 다운로드 필요 |
Yasm | 다운로드 필요 | |
Library | SDL-1.2.14* | SDL-1.2.15 다운로드 필요 |
alexGL_wrapper* | ||
x264-6fce39a* | ||
ffmpeg-e33f58a* | ffmpeg 0.6.5 다운로드 필요 | |
jpeg-8c | 다운로드 필요 | |
libpng-1.4.4 | 다운로드 필요 | |
zlib-1.2.5 | 다운로드 필요 |
(ex. bada_SDK_2.0.0/qemu/distrib/jpeg-8c)
MinGW and MSYS
mingw-get-inst-20110530.exe 또는 이후 버전의 인스톨러를 설치하면 되는데, 해당 빌드에는 현 시점의 최신 버전인 mingw-get-inst-20111118.exe 버전을 설치하였다. 설치 시, C, C++ Compiler, MSYS Basic System, MinGW Developer Toolkit 항목을 체크하여 포함되게 설치해 주어야 하며, 설치 디렉토리 변경없이 디폴트로 설치 권장. 서버로부터 모듈들을 다운로드 하여 설치하기 때문에 약 5분가량의 시간이 소요된다.
Select Components | Installing |
Yasm
x264, ffmpeg 빌드를 위한 툴로, yasm 사이트에서 yasm 1.2.0 win32 .exe (for general use on 32-bit windows) 링크를 다운로드 하고, 단일 실행파일인 yasm-1.2.0-win32.exe 를 yasm.exe 로 파일네임 수정후, (MSYS_DIR)/1.0/bin 디렉토리에 복사한다. (디폴트로 설치하였다면, 해당경로는 C:\MinGW\msys\1.0\bin)
SDL-1.2.15
포함되어 있는 SDL-1.2.14 소스의 경우, make 시 'unknown data types 'size_t' errors' 가 다수 발생한다. configure 설정이 해당 플랫폼에 맞게 설정이 안되어 발생하는 에러 인듯 하다. SDL-1.2.15 소스 코드를 다운로드하여 사용.
* 소스 디렉토리 : qemu/distrib/SDL-1.2.15
ffmpeg 0.6.5
포함되어 있는 ffmpeg-e33f58a 소스의 경우, make 시 'libavcodec/../subdir.mak:96: *** missing separator' 에러 발생. ffmpeg 0.6.5 소스 코드를 다운로드하여 사용.
* 소스 디렉토리 : qemu/distrib/ffmpeg-0.6.5
jpeg-8c
jpeg-8c 다운로드하거나, 최신 릴리즈인 jpeg-8d 를 다운로드하여 사용해도 무방.
* 소스 디렉토리 : qemu/distrib/jpeg-8c
libpng-1.4.4
libpng-1.4.4 다운로드.
* 소스 디렉토리 : qemu/distrib/libpng-1.4.4
zlib-1.2.5
컴파일된 dll 패키지인 zlib125-dll.zip 파일을 다운로드 하여, lib/zdll.lib 파일네임을 lib/libz.a 로 수정.
* 소스 디렉토리 : qemu/distrib/zlib-1.2.5
BUILD
MSYS Shell 구동 후, 해당 라이브러리 소스 디렉토리로 이동 하여 빌드 커맨드 수행.
SDL-1.2.15
./configure
make
make install
alexGL_wrapper
make 시, lib/libgles_cm_mingw32.lib: No such file or directory make:*** [libgles_cm_mingw32.lib] Error 가 발생하기 때문에, 우선 lib 디렉토리를 생성하여 준다. (qemu/distrib/alexGL_wrapper/lib)
make
x264-6fce39a
./configure --enable-win32thread --disable-gpac --enable-shared
make
make install
ffmpeg-0.6.5
./configure --arch=x86 --enable-w32threads --disable-static --enable-shared --enable-gpl --enable-version3 --disable-ffprobe --disable-ffserver --disable-avdevice --disable-postproc --disable-avfilter --disable-ffmpeg --disable-ffplay --disable-network --enable-runtime-cpudetect --enable-memalign-hack --enable-encoder=h263 --enable-encoder=h264 --enable-encoder=mpeg4 --enable-decoder=h263 --enable-decoder=h264 --enable-decoder=mpeg4 --enable-decoder=vc1 --enable-decoder=wmv3 --enable-decoder=msmpeg4v3 --disable-muxers --disable-demuxers --disable-protocols --disable-indevs --disable-outdevs --disable-devices --enable-libx264 --disable-armv5te --disable-armv6 --disable-armv6t2 --disable-armvfp --disable-neon --extra-libs=-lx264.dll --disable-debug --extra-cflags=-I/include --extra-ldflags=-L/lib
make
make install
jpeg-8c
make 시, jcapimin.c:127:1: error: conflicting types for 'jpeg_suppress_tables' 에러가 발생한다. ./autoheader 수행하여 해당 conflict 를 없애 줘야 한다.
./configure
./autoheader
make
make install
libpng-1.4.4
distrib/libpng-1.4.4/scripts 디렉토리에서 makefile.mingw 파일을 distirb/libpng-1.4.4 디렉토리로 복사하여 붙여넣고, makefile 로 파일네임을 수정한다.
make install 시, 스크립트가 무한루프를 돌기 때문에, make 만 수행하여 빌드 생성된 헤더/라이브러리는 소스 디렉토리에 남게 되므로, 마지막 qemu 빌드 시에는 해당 참조 경로를 변경 해 주어야 한다.
make 시, zlib.h: No such file or directory 에러가 발생하는데 makefile 의 Line: 57, 58 항목의 zlib 참조 경로를 해당 환경에 맞게 다음과 같이 지정해 주고, make 수행.
ZLIBLIB= $(SRCDIR)/../zlib-1.2.5/lib
ZLIBINC= $(SRCDIR)/../zlib-1.2.5/include
make
zlib-1.2.5
zlib 의 경우, dll 패키지를 사용하였기 때문에 빌드 필요 없음.
QEMU (bada Emulator)
configure 옵션은 라이브러리 경로 지정을 위해 다음과 같이 구성되어 있다.
--jpeg-path=/path ((SOURCE_ROOT)/distrib/jpeg-8c, by default)
--zlib-path=/path ((SOURCE_ROOT)/distrib/zlib-1.2.5, by default)
--png-path=/path ((SOURCE_ROOT)/distrib/libpng-1.4.4, by default)
--alexGL-path=/path ((SOURCE_ROOT)/distrib/alexGL_wrapper, by default)
--sdl-path=/path ((SOURCE_ROOT)/distrib/SDL-1.2.14, by default)
--x264-path=/path ((SOURCE_ROOT)/distrib/x264, by default)
--ffmpeg-path=/path ((SOURCE_ROOT)/distrib/ffmpeg-e33f58a, by default)
추가로 다운로드 한 다른 버전의 라이브러리도 있고, INSTALL 파일의 설명과는 다르게 디폴트 설정되어 있는 경로도 있기 때문에, 옵션을 이용하여 해당 라이브러리 참고 경로를 설정해 줘야 한다. 또한, 지정한 참고 경로의 상대 경로 지정이 잘못되어 있는 부분도 있어 configure 파일 내용도 수정해야 하며, Type Conflict 에러가 발생하기 때문에, 소스 코드의 수정도 불가피 하다.
참고로, 정상적으로 make install 된 위 라이브러리들의 헤더/라이브러리/dll 파일들은 (MSYS_DIR)/1.0/local 디렉토리 아래에 include, lib, bin 디렉토리에 설치 된다.
configure 파일 수정
Line: 833
png_cflags="-I$png_path/include $zlib_cflags" 를
png_cflags="-I$png_path $zlib_cflags" 로 수정
Line: 835
png_lopts="-L$png_path/lib -L$zlib_path/lib" 를
png_lopts="-L$png_path -L$zlib_path/lib" 로 수정
Line: 916
sdl_cflags="-I$sdl_path/include -D_GNU_SOURCE=1 -Dmain=SDL_main" 를
sdl_cflags="-I$sdl_path/include/SDL -D_GNU_SOURCE=1 -Dmain=SDL_main" 로 수정
소스 코드 수정
ERROR 내용
c:\mingw\bin\../lib/gcc/mingw32/4.6.1/../../../../include/rpcndr.h:52:23: error: conflicting types for 'boolean'
C:/MinGW/msys/1.0/local/include/jmorecfg.h:236:13: note: previous declaration of 'boolean' was here
make: *** [android/sdl_addition.o] Error 1
SOLUTION
1. (MSYS_DIR)/1.0/local/include/jmorecfg.h 파일의 첫부분에 다음 코드 추가.
#if defined(__MINGW32__) && defined(_RPCNDR_H) && !defined(HAVE_BOOLEAN)
#define HAVE_BOOLEAN
#endif
2. qemu/android/sdl_addition.c 파일 Line: 18 의 "jpeglib.h" 와 <commdlg.h> 헤더 인클루젼 순서를 변경.
//#include "jpeglib.h"
#include <commdlg.h>
#include "jpeglib.h"
./configure --jpeg-path=/local --sdl-path=/local --x264-path=/local --ffmpeg-path=/local
make
make install
다음과 같이 정상적으로 빌드가 이뤄지면, C:/Bada_SDK/Tools/Emulator/Bin 디렉토리에서 badaEmualtor.exe 파일을 확인할 수 있다.
CONCLUSION
INSTALL 파일의 설명대로 빌드가 가능했다면 얼마 걸리지 않을 작업이었겠지만, 빌드 성공하기까지 꽤 시간을 투자하였던 것 같다. 아마도 git 나 svn 같은걸로 소스 코드가 내부적으로 관리가 될 터인데, 해당 버전의 Branch 만 뽑아 내어 공개해도 컴파일이 안되거나 경로가 맞지 않는 문제는 없을 건데 따로 공개용 소스를 작업한건지 어떤지 참 궁금하다. MinGW 를 이용하여 빌드를 하였을까 하는 의문까지 들 정도이다. 공개된 bada SDK 소스에 대해 별다른 말들이 없는 걸 보니, 노련하거나, 관대하거나, 관심없거나 인듯.
댓글