WebKit 포팅에 관해

Dev 2009. 3. 31. 12:42
단말 엔지니어에게 포팅이란,
HAL API를 타겟 플랫폼에 맞게 구현해주는 작업이다. WIPI를 비롯한 기타 단말 솔루션들은 HAL API set 이 분명하게 정의되어 있다. 정해진 C함수들을 정해진 규격대로 구현하면 포팅이 끝난다. 근데 WebKit 은 이게 모호하다. 플랫폼에 dependent 한 포팅 레이어가 소스 트리 여러 곳에 산재해 있다. 기존 WIPI 포팅에 익숙한 한국의 단말엔지니어에게는 난감한 구조다. 하지만 여기에도 WebKit 나름의 규칙과 일관성이 있다. 익숙해지면 그럴만 하다고 동의할 수 있는 문제다.

WebKit port 의 특징은 포팅 타겟을 OS 로 한정하지 않는다는 점이다.
WebKit의 포팅 타겟은 Windows 나 Linux 같은 OS가 아니라, CoreGraphics, Cairo 같은 그래픽 툴킷, CFNetwork, CURL 같은 네트웍 툴킷이다. Cairo 가 올라간 OS 면 Windows 든 Linux 든 WebKit Cairo port 가 화면을 출력할 수 있다. 마찬가지로 CURL 이 올라간 OS 면 Windows 든 Linux 든 WebKit CURL port 가 네트웍을 이용할 수 있다.

WebKit 이 요구하는 툴킷들을 나열하면 대략 다음과 같다.
* 그래픽 툴킷 : CoreGraphics 또는 Cairo
* 네트웍 툴킷 : CFNetwork 또는 CUrl
* 이미지 디코더 : giflib, jpeglib, libpng ...
* XML 파서 : libxml, libxslt
* DB 라이브러리 : SQLite

WebKit 포팅 절차를 요약하자면 다음과 같다.
1. 사용할 툴킷 set 을 선택한다.
2. 선택한 툴킷을 타겟 OS 또는 타겟 device 에 포팅한다.
3. WebKit 을 올린다.

간단하다.
하지만 언제나 그렇듯, 간단함에도 불구하고 일이 되려면 개발자의 눈물겨운 노력이 있어야 한다.
Posted by ingeeC
,
XP에서 WebKit을 빌드하고 나서, WebKit의 실행 얼게를 분석하고 있다.
웹킷을 엔진으로 이용하는 어플리케이션을 어찌 작성해야 하는지 분석하려면, XP WebKit 프로젝트에 포함된 WinLauncher를 이용해야 한다. 이를 이용하는데도 약간의 노하우가 필요하다. 이에 관한 내용을 다음과 같이 정리한다.

1. Isolated COM Component
WinLauncher는 WebKit.dll 에 COM 콤포넌트 형태로 포함된 다양한 WebKit 모듈들을 호출해가며 동작한다. 내 개발 머신에는 사파리 브라우저가 깔려있고, 사파리 폴더에 WebKit.dll 이 존재한다. 근데, WinLauncher.exe가 실행될 때 사파리 폴더에 존재하는 WebKit.dll 이 아니라, WinLauncher.exe 와 같은 폴더에 있는 WebKit.dll 을 로드하는게 너무 신기했다. 이건 COM DLL인데 말야. 레지스트리에는 분명 사파리 폴더에 있는 WebKit.dll path가 등록되어 있는데? 어찌된거지?
XP 이상의 윈도에서는 어플리케이션 빌드시 manifest 파일을 통해 로드될 COM DLL의 path를 지정할 수 있다고 한다. 이걸 isolated component 라고(맞나?) 부른다고 한다. 그래... 내가 윈도에 관한 공부를 게을리했다. 반성한다.

2. WinLauncher.exe 실행 팁
(
http://aautar.digital-radiation.com/blog/?p=98)

2.1. request->initWithURL() 타임아웃 설정

이젠 웹킷을 철저히 뜯어볼테다 결심하고 WinLauncher를 실행시켰다. 근데, WinLauncher.exe에서 네트웍이 안된다. http://naver.com 등에 접근할 수 없다. 아... WinLauncher는 샘플 코드라 네트웍 코드가 존재하지 않는가보다 하고 의심했다. 근데, 그게 아니었다. http://aautar.digital-radiation.com/blog/?p=98 글을 찾으니 답이 있었다. WebKit 메소드를 호출할때, 타임 아웃 설정이 필요하다고 한다.
WinLauncher 소스의 loadURL() 함수에서 request->initWithURL()를 호출할 때 인자를 다음처럼 설정해줘야 한다.
request->initWithURL(urlBStr, WebURLRequestUseProtocolCachePolicy, 60);

2.2. SafariTheme.resources 폴더 복사
그리고, WinLauncher.exe를 정상적으로 실행시키기 위해서는 사파리 폴더에서 SafariTheme.resources 폴더를 통째로 복사해와야 한다고 한다. 이거 무지하게 결정적인 정보다. 다른 것들은 어찌어찌 고생하면 해결할 수 있었을 것 같은데, 이건 해결 못했을 것 같다.

이런 정보가 존재하는 인터넷이 너무 고맙다. 이런 정보를 아낌 없이 공개하는 개발자들도 고맙고... 인터넷과 구글이 없었다면 개발을 어찌했을까...

WinLauncher 실행이미지를 첨부한다. 에디트 콘트롤에 URL을 입력하면, 해당 페이지로 이동한다.

Posted by ingeeC
,

Qt WebKit 단말 사용기

Dev 2008. 11. 18. 11:31

Qt-WebKit을 Windows Mobile 6.1 단말기에 올렸다.
"자, 이젠 빠른 성능과 아름다운 페이지를 보여줘." 하는 마음으로 실행시켰는데... 결론을 말하자면 실망이다. 아직 모자란 점이 많다. 이건 WebKit의 문제라기 보다는 Qt-WebKit의 문제다. 포팅이 불충분하다. 적어도 Windows Mobile에서는 그렇다.

1. 우선 네트웍에 관한 처리가 미흡하다.
스스로 단말의 네트웍 연결을 초기화시키지 못한다. 백그라운드로 Windows Mobile의 Internet Explorer를 실행시켜서 네트웍을 잡고 실행시키면 그나마 조금 상태가 나아진다. 하지만 한 화면을 구성하는 모든 document 들을 네트웍을 통해 다운로드하지 못한다. 화면 상태로 미루어 추정하자면, base HTML document만 다운로드해서 보여주는 것 같다.

2. 속도가 미흡하다.
난 빠른 속도를 기대했다. 적어도 Mobile IE보다는 빠른 속도를 기대했다. 그런데 체감 속도가 IE에 비해 대등하거나 느리다. 이건 Qt 레이어의 오버헤드 때문일 것 같다.


오른쪽은 Qt WebKit을 실행시키면 처음 뜨는 디폴트 홈페이지. 내가 만들어서 로컬 파일 시스템에 복사한 index.html 파일이다. 왼쪽은 BBC 뉴스 모바일 페이지. HTML만 처리하고, 이후 이미지 파일들을 읽어 들이지 못했다. Qt WebKit의 네트웍 처리가 불충분한 것 같다.




왼쪽 화면을 보면, "링크를 다른 창에서 열기" 컨텍스트 메뉴를 볼 수 있다. HTML 링크에 대고 롱클릭을 하면 뜨는 메뉴다. 웹킷 윈도를 하나 더 만들 수 있다. 이건 감동... 오른쪽 화면은 한글이 깨져보인다. 한글 폰트 처리에 문제가 있다.

완벽한 솔루션이 없어야, 프로그래머가 밥을 먹고 살 수 있는 것 아니겠는가? 웹킷이 또 기회를 주는구나...
이제 웹킷 자체를 분석해볼 참이다. 관련된 일을 하는 사람들이 있다면, 댓글이나 트랙백 등으로 알려주면 좋겠다. 오손도손 사이 좋게 개발할 사람들을 찾는다.

Posted by ingeeC
,


Windows Mobile 단말기가 하나 있다. 이놈 위에 웹킷을 올려보고 싶었다. 이리저리 찾던 중에, Qt WebKit 브라우저가 눈에 들어왔다. 다시 말하지만, 웹킷은 브라우저 엔진일뿐 브라우저가 아니다. 이놈을 브라우저로 동작하게 만들려면 많은 노력이 필요하다. Qt WebKit 프로젝트가 바로 그런 노력을 하고 있는 프로젝트다. 마침 "한.글.로.된." 좋은 블로그 글을 찾아 편안한 마음으로 시도해볼 수 있었다. 자기가 겪은 경험을 글로 정리해서 공개하는 사람들에게 다시 한번 감사하는 마음을 전한다.
http://www.korone.net/bbs/board.php?bo_table=qt_lecture&wr_id=465

하지만, 세상 모든 일이 그렇듯 뭔가 넘기 힘든 고개들이 있었다. 그런 고개들이 있어야 성공했을 때 성취감을 느낄 수 있는 것 아니겠는가? 나 다음 개발자들은 그런 성취감(?)을 느끼지 못하기를 기도하며 몇가지 경험을 정리한다.

처음에는 Cygwin 콘솔창을 열고 작업 했는데, 뭔가 잘 안됐다. 다음의 웹 페이지를 보고 원인을 알게 됐다. Qt WebKit을 Cygwin서 빌드하는 것은 원래 아직 안되는 것이었다 (2008.11.13. 현재). 그래서 WinXP 32bit의 커맨드 콘솔(cmd.exe)에서 작업했다. 커맨드 콘솔에서 작업하려면, 몇가지 GnuWin32 도구들을 설치해줘야 한다. 아래 "빌드 환경" 파트에 관련 내용을 정리했다.
http://trac.webkit.org/wiki/BuildingQtOnWindows

그리고, 빌드할 때 Qt WebKit 소스가 있는 드라이브의 루트 아래에 tmp 폴더를 만들어줘야 한다. 별거 아닌데, 이것 때문에 조금 고생했다.


빌드 환경
- WinXP 32bit
- Qt-wince를 다운로드 받아 빌드 완료한 상태 (참조 URL)
- Qt-WebKit 소스를 다운로드 받은 상태 (E:\Work\QtWebKit에 소스를 다운로드 함)
- 빌드를 위해 필요한 perl 및 GnuWin32 툴들을 설치한 상태 (참조 URL)


빌드 시퀀스

빌드 시퀀스를 순서대로 적으면 다음과 같다.
E:> cd \Work\QtWebKit\webkit
E:\Work\QtWebKit\webkit> mkdir \tmp
E:\Work\QtWebKit\webkit> mkdir WebKitBuild\Release
E:\Work\QtWebKit\webkit> perl WebKitTools\Scripts\build-webkit
... 성공 !!!  


이상이다.
이렇게 빌드한 바이너리를 Windows Mobile 6.1 단말기에 올리고 테스트해보고 있다. 실행화면과 사용 소감은 다음에 올릴 예정이다.
Posted by ingeeC
,

Windows Mobile에 Qt를 포팅하는 방법에 관한 아주 멋진 글을 찾았다. 블로그 기사가 일러주는 대로만 작업하면 거의 한방에 Qt 포팅이 끝난다. 존경 받아 마땅한 개발자다.

http://punbear.tistory.com/tag/Wince

나는 PDA 프로그래밍에 익숙하지 않다. Windows Mobile을 위한 프로그램을 개발하고 이를 PDA에 심어 실행시키는 절차가 낯설었다. 위에 소개한 블로그 기사 말미에 샘플 어플리케이션 실행에 관해 약간 덧붙이고 싶은 이야기가 있다.

Qt Example 실행하기

1. 샘플 선정
VS 2005로 $(solution_root)\examples\examples.sln 을 로드하면 수십개의 Qt 샘플 프로젝트들이 로드된다. 이중 pixelator 프로젝트가 남들에게 보여주기 괜찮았다. 이 프로젝트를 StartUp Project로 선택한다.

<<그림- StartUp Project 선택하기>>

2. 에뮬에서 실행하기
실행 타겟으로 Windows Mobile 6 Classic Emulator를 선택한다.

<<그림- 에뮬레이터 선택하기>>

3. 실행하기
실행 메뉴를 선택하면, Windows Mobile 에뮬레이터가 실행된다. 한참 기다리면 piexelator 어플이 실행된다.

<<그림- 실행하기>>


<<그림- pixelator 샘플 프로그램>>

4. 단말에서 실행하기
ActiveSync로 단말에 Qt DLL 들과 실행할 샘플 어플리케이션(pixelator.exe)을 같은 폴더에 복사하고, 단말의 프로그램 매니저로 이를 실행시키면 된다. 이때 C:\Program Files\Microsoft Visual Studio 8\VC\ce\Dll\armv4i 폴더에 있는 msvcr80.dll 도 함께 단말에 복사시켜줘야 한다.
복사해야할 파일 목록은 다음과 같다.

$(solution_root)\lib 폴더에 있는 다음 파일들.
이 파일들은 Qt 빌드 결과물들이다.
QtCore4.dll
QtDesigner4.dll
QtDesignerComponents4.dll
QtGui4.dll
QtNetwork4.dll
QtScript4.dll
QtSql4.dll
QtSvg4.dll
QtTest4.dll
QtXml4.dll

VS2005의 run-time library DLL 파일.
C:\Program Files\Microsoft Visual Studio 8\VC\ce\Dll\armv4i 폴더에 있다.
msvcr80.dll

샘플 어플리케이션 파일.
$(solution_root)\examples\itemviews\pixelator\release 폴더에 있다.
pixelator.exe

이상이다. 댓글과 트랙백 많이 환영한다. 한글로 된 개발 문서가 넘쳐나는 세상이 빨리 와야 한다.
Posted by ingeeC
,

WebKit에 대하여

Dev 2008. 11. 4. 19:21
위키가 워낙 잘 정리해 놓아서, 덧붙여 메모할 필요가 느껴지지는 않지만, 웹킷에 대한 사실과 느낌을 간단히 정리한다.

1. 작고 빠른 브라우저 엔진
웹킷은 현존하는 브라우저 엔진 중에서 거의 유일하게 실 단말 레퍼런스를 가지고 있는 놈이다. 애플의 iPhone과 노키아의 S60 단말에 실린 브라우저가 WebKit을 엔진으로 사용하고 있다. 다시말해 웹킷은 현존하는 브라우저 엔진 중에서 가장 작고 빠르다고 평가받고 있는 엔진이다.

2. 업계 표준, 오픈소스 브라우저 엔진
웹킷은 앞서 언급한 애플의 사파리 브라우저, 노키아의 S60 브라우저 뿐 아니라, 구글 크롬 브라우저, 구글 안드로이드 브라우저, 어도비 AIR 브라우저 등에 적용되어 발표됐거나 발표를 앞두고 있다. 웹킷은 애플이 시작해서, 현재도 열성적으로 개발을 추진하고 있는 오픈소스 프로젝트이다. GPL에 비해 덜 엄격한 LGPL/BSD 라이선스 모델을 적용을 하고 있기 때문에 비교적 자유롭게 상용 솔루션을 만들 수 있다.

3. 막강한 기능의 브라우저 엔진
웹킷은 AJAX를 지원한다. HTML 4.01, CSS 2.0, JavaScript 1.5 를 충실히 지원할 뿐 아니라 XMLHttpRequest 객체도 지원한다. 현재 핸드폰에 실려있는 잡다한 브라우저가 만들어내는 네이버 화면과 iPhone에 실린 웹킷이 만들어내는 네이버 화면에는 현격한 품질차이가 존재한다. 웹킷은 기본을 갖춘 브라우저다. 뿐만 아니라 새로 정립되고 있는 최신 표준을 위한 마일스톤도 세워져 있다. HTML 5 같은 신규 표준을 가장 빨리 지원하는 브라우저 엔진은 아마도 웹킷이 될 것이다.

4. 브라우저 엔진일 뿐
웹킷은 브라우저 엔진일 뿐 브라우저가 아니다. 네트웍, 메모리, UI 등의 모듈을 적절히 포팅해주어야 브라우저가 될 수 있다.

애플은 소프트웨어 개발자 수가 얼마 되지 않는다고 한다. 얼마 되지 않는 개발자로 그토록 유려한 제품 라인을 제공할 수 있는 비결은 아마도 오픈소스의 적절한 활용일 것이다. 웹킷의 발전과 응용에 동참하는 '한국어를 사용하는 개발자'의 수가 많아지기를 희망한다. 지금은 사소한 정보라도 얻으려면 꽤 답답하다.
Posted by ingeeC
,

WebKit 빌드 성공담

Dev 2008. 10. 31. 17:09
WebKit (이후 웹킷) 소스를 다운 받아 빌드를 시도하고 있다. 소스를 개발하는 것도 아니고, 다른 사람들이 잘 만들어 놓은 소스를 받아다 빌드만 하는건데... 왜 이리 힘든지... 빌드 하며 겪은 시행 착오를 메모 해둔다.

우선 사전에 확인할 사항이 몇개 있다.

1. unix 파일 포맷
빌드 과정에 cygwin 상에서 *.sh 파일들이 몇개 실행된다. 근데, 이놈들이 dos 텍스트 모드다. 파일 찾기로 *.sh을 모두 찾아서 dos2unix 해줘야 한다. 그러지 않으면 "\r 파일을 처리할 수 없다... 어쩌구..." 하는 에러가 출력된다.
*.sh 파일만 바꾸면 될 줄 알았는데, 빌드에 관련된 소스 파일들을 모두 변환해줘야 한다. 빌드 할 때, perl 을 이용해서 소스를 자동 생성하는데, 텍스트 파일 모드를 변환하지 않으면 에러가 발생한다.

2. cygwin 툴 설치
WebKit 빌드를 위해 필요한 cygwin의 모든 패키지가 설치되어 있는지 확인해야 한다. 당연히 모두 설치되어 있을 거라고 자신했는데, 실상은 그렇지 않았다. 조금만 겸손하게 확인해도 많은 시간을 절약할 수 있다. 겸손한 마음으로 http://webkit.org/building/tools.html 를 한번 더 확인해보자.

웹킷을 갖고 작업하는 변방의 개발자들 끼리 많은 정보를 공개했으면 좋겠다. 댓글이나 트랙백 아주 많이 환영한다.



(win xp 32bit 환경에서)
WebKit
빌드& 실행 과정 정리

 

 

개발툴 설치, 특히 필요한 cygwin의 모든 패키지가 설치됐는지 확인

참조 URL

l  http://webkit.org/building/tools.html

l  http://trac.webkit.org/wiki/BuildingOnWindows

 

할일

-       VS2005 설치

-       VS2005 patch 설치

-       Cygwin 설치

-       QuickTime SDK 설치

 

 

 

WebKit 소스 확보

참조 URL

l  http://webkit.org/building/checkout.html

l  http://svn.webkit.org/repository/webkit/trunk(subversion 소스 URL)

 

할일

-       subversion client(TortoiseSVN)으로 http://svn.webkit.org/repository/webkit/trunk 소스 가져오기

 

 

 

WebKitSupportLibrary.zip 을 작업 디렉토리 루트에 복사

참조 URL

l  http://webkit.org/building/checkout.html

 

할일

-       http://developer.apple.com/opensource/internet/webkit_sptlib_agree.html 에서 WebKitSupportLibrary.zip 파일을 다운로드 하여 WebKit 프로젝트 홈디렉토리에 복사

 

 

 

소스 업데이트

참조 URL

l  http://webkit.org/building/checkout.html

 

할일

-       WebKitTools/Scripts/update-webkit 스크립트 실행

 

사용자 삽입 이미지

 

 

모든 소스 파일을 unix text file로 변환 (dos2unix)

참조 URL

l  http://trac.webkit.org/wiki/BuildingOnWindows

l  *.sh 파일만 변환하면 될 줄 알았는데, 그게 아님. 모든 소스를 변환해야 함. 빌드과정에서 perl을 통해 소스파일을 생성할 때 문제가 생김.

l  빌드에 참여하는 소스 코드만 변환해야 시간을 절약할 수 있다. 소스 디렉토리에는 테스트 관련 파일들이 무척 많다. 전부 변환하려면 세월이다.

 

할일

-       *.sh 변환

find . -name "*.sh" -exec dos2unix {} \;

-       JavaScriptCore/* 변환

find JavaScriptCore -type f -exec dos2unix {} \;

-       JavaScriptGlue/* 변환

find JavaScriptGlue -type f -exec dos2unix {} \;

-       WebCore/* 변환

find WebCore -type f -exec dos2unix {} \;

-       WebKit/* 변환

find WebKit -type f -exec dos2unix {} \;

-       WebKitLibraries/* 변환

find WebKitLibraries -type f -exec dos2unix {} \;

 

사용자 삽입 이미지

 

 

환경변수 WEBKITOUTPUTDIR, WEBKITLIBRARIESDIR 설정

참조 URL

l  http://trac.webkit.org/wiki/BuildingOnWindows

 

사용자 삽입 이미지

 

 

VS2005로 WebKit sln 파일을 로드하여 컴파일 옵션 수정

일러두기

l  VS2005 프로젝트 파일이 build-webkit 스크립트에도 동일하게 사용된다. 그래서 ~/WebKit/win/WebKit.vcproj/WebKit.sln 의 빌드 옵션을 설정하면, 스크립트(WebKitTools/Scripts/build-webkit)로 빌드 할 때도 여기서 설정한 빌드 옵션이 적용된다.

 

할일

-       VS2005~/WebKit/win/WebKit.vcproj/WebKit.sln 로드

-       아래 프로젝트의 컴파일러 옵션에 /wd4819 추가 ( 이렇게 하지 않으면 빌드 과정에서 문자열 코드 페이지관련 워닝을 낸다. 영어권 개발자들은 경험하지 못할 문제다. 해당 워닝을 무시하지 않으면 이를 에러로 취급한다. )

QTMovieWin, WebCore, WebKit, TestNetscapePlugin

 

사용자 삽입 이미지

 

 

빌드

할일

-       WebKitTools/Scripts/build-webkit --debug 실행

 

사용자 삽입 이미지

 

 

빌드 성공!

 

사용자 삽입 이미지

 

 

웹킷 실행, 디버그

참조 URL

l  http://webkit.org/building/debug.html

 

할일

-       WebKitTools/Scripts/debug-safari 실행 (PC에 Safari 브라우저가 설치되어 있어야 한다.)

-       debug-safari를 실행하면 VS2005 디버깅 환경이 뜬다.

-       소스를 열고, 원하는 지점에 브레이크 포인트를 설정한다.

-       F5를 눌러 디버깅을 시작한다.

 

사용자 삽입 이미지

 

 

debug-safari 스크립트로 웹킷을 실행시키려면, PC에 사파리 브라우저가 설치되어 있어야 한다. 다시 한번 말하지만, 웹킷은 브라우저가 아니라 브라우저 엔진이다.

(
)

 

Posted by ingeeC
,