WebKit 포팅에 관해

Dev 2009.03.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 ingee

댓글을 달아 주세요

  1. PSS 2009.04.06 18:18 신고  댓글주소  수정/삭제  댓글쓰기

    안녕하세요?
    웹킷 포팅 관련해서 많은 정보 감사드립니다.
    그런데, 말씀하신 툴킷이라는 것의 정체가 뭔지 잘 모르겠네요.
    CoreGraphics, Cairo 등등 이런 것들이 어떤 것인지 잘 이해가 되지 않네요.
    그게 무엇이던 디바이스와 연결시켜주는 작업이 필요할 것 같은데, 그런 작업은 해당 툴킷을 포팅하면서 하게 되는건가요?

    • ingee 2009.04.09 13:42 신고  댓글주소  수정/삭제

      Cairo를 예로 들어 설명하자면, Cairo는 light-weight한 그래픽 라이브러리입니다. 화면에 그림을 그리는 다양한 API들을 제공합니다. Cairo를 디바이스에 맞게 포팅하면, Cairo를 사용하는 WebKit port를 실행시킬 수 있습니다. 설명이 될런지요?

  2. PSS 2009.04.06 18:37 신고  댓글주소  수정/삭제  댓글쓰기

    예를 들어 screenRect 라는 함수를 보면 win, wx, gtk, qt 등으로 구분되어 작성이 되어 있습니다.
    이런 부분들이 OS 에 따라 작성된 부분으로 보이는데, 이것들과 말씀하신 CoreGraphics, Cairo 와의 관계가 어떻게 되는 것인지요?
    답변 미리 감사드립니다.

    • ingee 2009.04.09 13:42 신고  댓글주소  수정/삭제

      GTK 프레임워크는 화면에 그림을 그리기 위해 Cairo를 사용합니다. MS Windows도 Cairo를 포팅해서 화면에 그림을 그리도록 할 수 있습니다. 그럴 경우 그림을 그리는 대부분의 작업은 Cairo에서 해결되지만, 그래도 최종적인 포팅 타겟(GTK나 win32)에 의존적인 코드가 존재합니다. 그런 부분이 WebCore/platform 폴더 아래에 있는 소스 디렉토리들에 모여 있습니다.

      예로 드신 screenRect() 함수도 최종적인 포팅 타겟에 의존적인 함수입니다. GTK Cairo를 쓸 경우 PlatformScreenGtk.cpp 파일의 screenRect() 함수를, win32 Cairo를 쓸 경우 PlatformScreenWin.cpp 파일에 있는 screenRect()를 사용하도록 프로젝트를 설정해야 합니다.

      설명이 도움되면 좋겠습니다.

  3. Euijung 2009.04.14 18:27 신고  댓글주소  수정/삭제  댓글쓰기

    혹시 mips보드에도 포팅해보셨나요?^^;

    제가 au1250보드에 웹킷과 midori를 포팅해보고싶은데. 무지해서 그런지 자료찾기도 힘들고,
    사실 감도 잘 안옵니다 도움받고 싶어요^^

    • ingee 2009.04.15 13:04 신고  댓글주소  수정/삭제

      제게는 MIPS 보드 자체가 생소합니다. ^^
      타겟이 다르더라도 웹킷에 대한 이런저런 정보는 공유할 수 있을 것 같습니다. 자주 들러주시고, 의견 주세요.

  4. azz 2009.06.15 10:43 신고  댓글주소  수정/삭제  댓글쓰기

    webkit 관련자료 검색하다가 오게됐습니다
    먼저 webkit관련 좋은정보를 올려주신것에 감사합니다 ^^;;

    이 글을 읽다가 한가지 궁금한게 있어서 그러는데
    저러한 툴킷을 사용하는것이 webkit엔진 구동에 있어서 반드시 필요한것인지가 알고 싶네요

    예를들어,
    윈32상에서는 그래픽API를 윈도우에서 제공하고 있는데 이를 가지고서만 그래픽은 안되고
    윈32상에서도 CG나 Cairo를 포팅해야만 하는지가 궁금합니다

    구글링해봐도 webkit사용에 툴킷은 기본적으로 다 붙여 사용한거 같아서.. 참 궁금하네요
    아시면 답변해주시면 감사하겠습니다

    • ingee 2009.06.15 15:54 신고  댓글주소  수정/삭제

      그래픽의 경우 MS Windows GDI위에 막바로 포팅하는 것이 가능합니다. 그런 일을 해낸 업체도 있구요. 문제는 그러기 위해서는 "GDI위에 막바로 포팅하는 일"을 직접 해야 합니다. 다시말해 그런 포팅 소스를 직접 작성해야 합니다. 그래픽 처리를 위해 카이로나 코어그래픽스를 많이 쓰는 이유는 그런 (안정적인) 포팅 소스가 이미 존재하고 있으며 공개되어 있기 때문입니다.

      장황하게 썼지만 요약하자면, 님이 하신 이야기는 분명히 가능한 일이며, 일의 양과 목적을 보고 판단할 문제입니다.

  5. laconicblue 2012.03.07 21:50 신고  댓글주소  수정/삭제  댓글쓰기

    buildroot 를 사용해서 directfb + libgtk2 위에서 webkit 을 구동해서 browser 를 사용하려는 시도를 하다가
    막히는게 많아서 찾다보니, 여기까지 왔습니다.

    뭔가 이미 있는 것을 찾아서 편하게 해보려는데 맨 아래 글이 저를 부끄럽게 하는군요..=-=
    "하지만 언제나 그렇듯, 간단함에도 불구하고 일이 되려면 개발자의 눈물겨운 노력이 있어야 한다"

    감사합니다.

  6. 좡이 2012.09.05 11:32 신고  댓글주소  수정/삭제  댓글쓰기

    중간에 정리해주신 "툴킷" 이라는것을 라이브러리라고 이해해도 되겠지요??
    좋은 요약 좋은 정보 감사합니다. ^^

    자주 올게요!!

StarUML

Dev 2009.01.13 18:56

StarUML은 UML을 그리는 도구다.
한 10년 전에는 상용으로 판매됐던 도구인데, 현재는 무료 오픈 소스 프로젝트로 전환됐다. 비싸기로 유명한 Rational Rose를 비롯해서 여러개의 UML 도구를 써봤는데, StarUML이 최고였다. UML이 필요하다면 고민하지 말고 가져다 쓸 것을 권한다. 중요하진 않지만, 자랑스럽게도 우리나라에서 만든 툴이다. 그래서 '한국어'로 된 매뉴얼이 존재한다 (이건 중요하다).

http://staruml.sourceforge.net/ko/index.php

Posted by ingee
TAG StarUML, UML

댓글을 달아 주세요

  1. js 2009.03.04 21:35 신고  댓글주소  수정/삭제  댓글쓰기

    안녕하세요~!
    저는 webkit을 배우는 사람입니다~!
    webkit에 대한 정보가 많이 없었는데~ 좋은 정보가 많은 것같아서 완전 감사합니다~!!
    webkit 고수님이신 관리자님께 여쭙고 싶은것들이 있는데방명록이 안남겨지더라구요~ㅠㅠ
    하루에 한번이상은 블로그 꼭 방문하겠습니다~!!
    앞으로 많은 가르침 부탁드립니다~! ^^

    • ingee 2009.03.05 09:55 신고  댓글주소  수정/삭제

      반갑습니다. 요즘 웹킷으로 진행하는 업무가 바빠서 글을 자주 올리지는 못합니다. 그래도 자주 들러주세요. ^^;;

  2. js 2009.03.06 15:41 신고  댓글주소  수정/삭제  댓글쓰기

    혹시 WebKit Test Suite 하는거 알고 계신가요~??

    어떻게 해야될지를 몰라서~ㅠㅠ

    알고계시면 방법좀 알려주시면 안될까요~??

    • ingee 2009.03.09 22:17 신고  댓글주소  수정/삭제

      잘 모르는 내용입니다. 웹킷 관련 작업을 진행하면서 말할 수 있는 내용이 쌓이면 꼭 포스트를 쓰도록 하겠습니다. 행운을 빕니다.

  3. js 2009.03.10 15:29 신고  댓글주소  수정/삭제  댓글쓰기

    네~^^ 물어보기만해서 죄송한데~ 요즘 WebKit WinLauncher 소스를 분석하고 있는데~

    너무 어렵습니다~ㅠㅠ 혹시 분석하신 자료나 관련 자료가 있으시면 부탁드려도 될까요~?! ㅠㅠ

    아~ 그리고 혹시 제가 도움이 될만한 부분이 있을지는 모르지만.. WebKit이나 브라우져에 관련된 자료들

    중에 제가 있는게 있을수도 있으닌깐~ 말씀해주세요~^^

    • ingee 2009.03.11 09:18 신고  댓글주소  수정/삭제

      WinLauncher는 WebKit을 다루는 방법을 가이드하기 위한 매우 단순한 샘플 파일입니다. WinMain의 WebKit 초기화 과정과 loadUrl() 함수를 이해하면 모든 것을 이해한 것입니다. 블로그에 WinLauncher에 대한 언급한 기사를 올렸던 기억이 있습니다 (isolated COM과 interval 설정에 관련된 내용이었습니다).
      그리고 좋은 자료 있으면 공유 부탁 드립니다.^^

  4. js 2009.03.11 13:43 신고  댓글주소  수정/삭제  댓글쓰기

    WinLauncher 빌드하고 런할때 icuuc40.dll 을 못찾겠다고 하는데~ 이거 무슨 사파리에서 폴더 복사해서

    붙이는거랑 관련이있나요~?? 그 사파리 폴더를 복사해서 WebKit 무슨 폴더에 복사를 해야되나요~??

    런이 안되요~ㅠㅠ

    • ingee 2009.03.12 09:15 신고  댓글주소  수정/삭제

      사파리 브라우저가 설치된 디렉토리에서 (예를 들어 C:\Program Files\Safari 에서) WebKit.dll을 제외한 모든 파일들을 WinLauncher.exe가 생성된 디렉토리로 (예를 들어 E:\Work\WebKit\buildOut\bin 으로) 복사해야 합니다. 그리고 사파리 디렉토리에서 SafariTheme.resources 폴더와 WebKit.resources 폴더도 통째로 복사해야 합니다. 행운을 빕니다. ^^

  5. js 2009.03.13 19:44 신고  댓글주소  수정/삭제  댓글쓰기

    네~ 감사합니다~!! 꾸벅~! 윈러쳐는 그렇게 하닌깐~ 됩니다~!! ^^

    이제 윈런쳐보고 웹코어 소스 코드 분석하고 있는데~ 혹시 이전에 분석하신 자료같은거

    요청해도 되나요~?? ㅡㅡ;; ㅠㅠ

    • ingee 2009.03.14 08:46 신고  댓글주소  수정/삭제

      변변치 않지만, 틈이 나고 자료가 쌓이는 대로 블로그에 글을 올리겠습니다. 님도 좋은 자료 있으면 트랙백 걸어주세요. ^^

  6. 써니 2009.05.29 16:25 신고  댓글주소  수정/삭제  댓글쓰기

    StarUML을 제작하던 회사가 야심차게(?) 개발하다,
    워낙 안 팔려서 10분의 1로 가격을 할인해도 안팔려서 회사 문닫고, 오픈 소스로 기부한 케이스죠.

    회사가 건재할 때, 그 회사에 후배가 근무했기 때문에 기억하고 있습니다.
    StarUML, 늘 잘 쓰고 있습니다.

    • ingee 2009.06.02 13:30 신고  댓글주소  수정/삭제

      시장에서 성공했으면 참 좋았을텐데, 아쉽네요... 그래도 귀한 툴을 폐기하지 않고 오픈소스로 기부한 것이 멋져보입니다. 플라스틱 소프트웨어 분들 복받으실 거에요.

    • gl 2011.03.31 19:50 신고  댓글주소  수정/삭제

      그런 안타까운 사연이...

    • ingee 2011.03.31 22:57 신고  댓글주소  수정/삭제

      외국 동료들에게도 StarUML 자랑스럽게 소개합니다. 뛰어난 툴이기에 그들에게도 먹힙니다. 괜히 제가 어깨에 힘주게 됩니다.

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 ingee

댓글을 달아 주세요

  1. tommy 2009.04.15 17:23 신고  댓글주소  수정/삭제  댓글쓰기

    에고 웹킷을 빌드하고 나니 이젠 윈런처를 빌드해야하는 상황이네요
    dll들 복사하고 테마 폴더 복사하고 실행했더니 COM관련 메소드 CoCreateInstance 에서 죽어버리네요 ^^;
    이제 외국 사이트를 뒤져볼 차례인가 봅니다 ㅎㅎ

  2. tommy 2009.04.21 15:25 신고  댓글주소  수정/삭제  댓글쓰기

    접니다 ㅎㅎ
    외국 사이트들을 돌아다녀 봐도 그렇게 큰 수확은 없더군요
    그러다가 어느 블로그를 들어가 봣는데 애플의 라이브러리를 사용하지 않고
    직접 라이브러리들을 하나하나 빌드해서 WinLauncher를 빌드하고 있었습니다
    동작도 잘 되더군요 해서 한 번 제가 빌드한 실행파일을 넣어봤더니
    이상없이 동작하더군요 확인해봤더니 WebKit 라이브러리 빌드 자체가 잘못된 듯 합니다 ㅠㅠ
    제가 빌드한 WebKit.dll 로 바꿔 실행해봤더니 동일한 에러가 나네요
    빌드가 이상없이 성공해서 좋아라 하고 잇었더니 더 큰 문제가 생겨습니다 ㅎㅎ ㅠ_ㅠ;

    • ingee 2009.04.21 16:50 신고  댓글주소  수정/삭제

      WebKit.dll 이 실행되려면 필요한 DLL들이 있습니다. win32용 디폴트 웹킷 프로젝트는 CFNetwork.DLL, CoreFoundation.DLL, CoreGraphics.DLL 등을 필요로 합니다.

      빌드하신 WinLauncher.exe가 있는 폴더에 빌드하신 WebKit.DLL과 더불어 위의 DLL 들이 존재하는지 확인해보시는게 좋겠습니다. 정상적인 실행을 위해서는 사파리 브라우저 폴더 (예를 들어 "C:\Program Files\Safari" 폴더)에서 webkit.dll을 제외한 모든 DLL 들을 카피하셔야 합니다.

      그리고 블로그 기사에 있는 것처럼, 사파리 브라우저 폴더에서 resource 폴더도 몇개 복사해야 합니다. SafariTheme.resources 폴더와 WebKit.resources 폴더였던 것으로 기억합니다.

      행운을 빕니다.

    • tommy 2009.04.21 16:55 신고  댓글주소  수정/삭제

      네 CoreFoundation을 비롯한 여러개의 라이브러리들은 별 문제가 없구요
      ingee님이 링크하신 사이트말고 다른 곳에서 정보를 얻었습니다.

      그 분이 구현하신 것을 보니 WebKit.resources와 SafariTheme.resources 도 필요가 없구요
      단지 실행파일과 라이브러리들만 있으면 되더군요 윈도우 기본 테마로 실행이 됩니다.

      제 문제는 빌드는 성공했지만 WebKit.dll이 제대로 빌드 되지 않았다는게 문제네요 ㅎㅎㅎ

    • ingee 2009.04.21 19:23 신고  댓글주소  수정/삭제

      개발을 하다보면 참 다양한 경우를 겪게 됩니다. 무언가 문제를 겪고 계신 것 같은데, 별 도움을 못드리는 것 같아 안타깝네요.
      우리에겐 "구글신"이 있으니까, 약간의 행운만 따라준다면 해결하실 수 있으리라 믿습니다. 문제해결에 도움이 되는 기사가 있다면 다른 사람들을 위해 정보를 남겨주세요. 행운이 함께 하기를 빕니다.

  3. tommy 2009.04.24 12:02 신고  댓글주소  수정/삭제  댓글쓰기

    이건 다른 얘기지만 웹킷 소스는 어떻게 관리하시는지..

    전 윈도우에서 거북이svn으로 체크아웃하면 파일이름 때문인지 중간에 에러가 생기고
    cygwin에서 체크아웃하면 마찬가지로 중간에 에러가 생기네요 .pluggable 어쩌고 파일 인데..
    리눅스 서버에서 체크아웃해야 정상적으로 체크아웃이 됩니다
    그마저도 리눅스 서버에서도 update-webkit이 오류가 날 때도 많습니다

    결국 [리눅스 체크아웃 -> 삼바를 사용, 윈도우로 복사 -> cygwin으로 빌드] 같은 깝깝한 방식을 사용하고 있네요
    ingee님이나 다른 분들은 어떻게 사용하고 계시는지 궁금합니다.
    저와 같은 방식으로 소스를 받고, 관리하시는지..

    • ingee 2009.04.24 12:42 신고  댓글주소  수정/삭제

      안녕하세요. 저는 win XP에서 tortoiseSVN 을 쓰고 있습니다. xp와 거북이의 상세 버전은 다음과 같습니다.
      - win XP Pro Ver 2002, SP2
      - TortoiseSVN 1.5.5, Build 14361 - 32 Bit

      거북이를 통해 별문제 없이 WebKit을 내려받고 있습니다. 가장 최근에 WebKit 소스를 내려받은 때는 올해(2009년) 1월중이었습니다. 좋은 하루 되세요.

    • tommy 2009.04.24 13:56 신고  댓글주소  수정/삭제

      전 1.5.6인데도 문제가 있네요 것참.. 어쨋든 답변 감사합니다 ^^

    • tommy 2009.04.24 18:34 신고  댓글주소  수정/삭제

      VMWare에 설치된 XP에서 체크아웃을 해보니 정상적으로 되네요 제 시스템이 문제인가 봅니다
      즐거운 휴일 보내시길~

    • ingee 2009.04.24 19:25 신고  댓글주소  수정/삭제

      반가운 소식입니다. 편한 주말되세요.