CEF(Chromium Embedded Framework) 빌드

풀네임으로는 Chromium Embedded Framework

우연찮게도 DJMAX에서 MSVC 재배포 패키지 설치가 필요하다는 오류가 뜬다는 질문을 보고 몇버전 런타임이 필요할까 하여 리소스를 살펴보다 이건 왜이렇게 용량이 큰거지? 라는 의문으로 구글링하다 알게된 것. 그런데 또 우연스럽게도 며칠 지나지도않아서 이거 관련되어 요청이 하나 들어온게 발생하여 빌드해보았다.

쉬운방법은 cef-project 코드를 받아서 readme 파일대로 cmake만 실행하면된다. 하지만 이건 자동빌드에 의해 먼저 빌드된 엔진을 다운로드하여 부수적인 dll파일만 빌드하는것으로 보였다. 기왕이면 동일한 런타임, 컴파일러로 빌드된 라이브러리를 발드하고싶어 좀 더 보니 cef가 있다. 이쪽은 빌드과정이 흩어져있어서 아래와같이 정리.

명령 프롬프트에서 명령어를 실행하는것이 기본이고 MSVC Tools Commandline에서 진행할필요 없었다. 만약 update_depot_tools.bat 파일을 실행 후 프롬프트를 닫았다면 이 파일을 다시 실행한 후 이어서 작업을 해야할것이다. (안그럼 python.bat 파일을 못찾는다거나 ninja나 git등등 명령을 찾을 수 없다는 오류를 볼 수 있다.)
정정:
작업중인 프롬프트 창을 닫았다면 set PATH=D:\cef\depot_tools;%PATH% 명령을 실행하여 PATH 환경변수에 depot_tools를 추가 후 이어서 진행하면 된다. (당시 무슨 이유로 취소선 처리한 방법대로 실행하면 된다고 생각한건지 모르겠다.)

– 빌드환경
확실하게 빌드된 환경을 확인하려면 이곳에서 확인하면 된다. 또는 같은 문서의 다른 세션인 이곳에서 확인해도된다. 되도록 한번에 성공하려면 Visual Studio 버전과 Windows SDK 버전을 맞춰야 속편하다.
결과적으로는 Visual Studio 2019에서 문제없이 되었다(현재 기준으로 chromium의 문서를 보면 VS2017 이상 필요, 권장이 VS2019이다). 하지만 cef-project에서 Windows SDK 버전이 달라 실패하여 이미 버전을 맞추었기에 10.0.19041 버전으로 빌드하였다.
참고로 64비트 바이너리의 빌드가 끝난 후 용량은 아래와같다.

– 작업폴더 구성 (참조)
윈도는 경로길이가 256글자가 최대여서 chromium을 빌드할 때 폴더 이름이 일정길이를 넘어가고 shadow build를 시도하면 빌드가 안된다. 이걸 해제(링크참조)하거나 그냥 작업폴더의 경로가 짧아야한다. 그래서 폴더를 아래와같이 구성.
D:\cef\automate
D:\cef\chromium_git
D:\cef\depot_tools

– depot_tools 다운로드 (참조)
depot_tools.zip 파일을 다운받은 후 D:\cef\depot_tools에 복사하여 압축을 푼다. 그 후 프롬프트에서 D:\cef\depot_tools 폴더로 이동하여 update_depot_tools.bat 파일을 실행

– depot_tools 환경변수 설정 (참조)
프롬프트에서 set PATH=D:\cef\depot_tools;%PATH% 명령을 실행하여 depot_tools의 위치를 PATH 환경변수에 추가.

– automate 다운로드 (참조)
automate-git.py 파일을 다운받은 후 D:\cef\automate 폴더에 복사한다. 그 후 아래 내용을 D:\cef\chromium_git 폴더에 update.bat로 저장한다. 밑줄친 부분은 경로가 위와 다르다면 꼭 자신의 경로에 맞게 변경해야한다. 그리고 볼드체로 되어있는 부분은 자신의 Visual Studio 버전에 따라서 수정하면 될것이다. (위에 빌드환경 단락의 괄호로 써넣은것과같이 VS2019가 권장사항이다.)

set GN_DEFINES=is_component_build=true
@rem Use vs2017 or vs2019 as appropriate.
set GN_ARGUMENTS=--ide=vs2019 --sln=cef --filters=//cef/*
python ..\automate\automate-git.py --download-dir=d:\cef\chromium_git --depot-tools-dir=d:\cef\depot_tools --no-distrib --no-build

– chromium 다운로드 (참조)
바로 위에서 만든 update.bat 파일을 프롬포트에서 D:\cef\chromium_git 폴더로 이동하여 실행한다. chromium은 워낙 덩치가 커서 다운로드에 2~30분 이상 걸릴 수 있다.

– cef 스크립트 생성 (참조)
아래 내용을 D:\cef\chromium_git\chromium\src\cef 폴더에 create.bat로 저장한다. 마찬가지로 볼드체로 되어있는 부분은 자신의 Visual Studio 버전에 따라서 수정한다. (환경변수 GN_DEFINES의 간략한 추가 코멘트는 글 마지막 기타에서 확인, 링크 마지막 샘플 빌드의 실패는 그냥 넘어가도 될것으로 보인다.)

set GN_DEFINES=is_component_build=false is_official_build=true
@rem Use vs2017 or vs2019 as appropriate.
set GN_ARGUMENTS=--ide=vs2019 --sln=cef --filters=//cef/*
call cef_create_projects.bat

– cef 프로젝트 생성 (참조)
프롬프트에서 D:\cef\chromium_git\chromium\src\cef 폴더로 이동하여 위에서 생성한 create.bat 파일을 실행한다.

– chromium 빌드 (참조)
다운로드가 끝났으면 프롬프트에서 D:\cef\chromium_git\chromium\src 폴더로 이동한다. 각 타겟별 빌드는 아래와같이 명령을 실행하면된다.
x86, Debug: ninja -C out\Debug_GN_x86 cef
x86, Release: ninja -C out\Release_GN_x86 cef
x64, Debug: ninja -C out\Debug_GN_x64 cef
x64, Release: ninja -C out\Release_GN_x64 cef
직접 필요한 파일을 찾아서 복사할것이 아니라면 Debug, Release를 세트로 빌드하는게 좋다. 이유는 아래 스크립트 때문에…

– 배포파일 생성 (참조)
프롬프트에서 D:\cef\chromium_git\chromium\src\cef\tools 폴더로 이동한다. 그 후 make_distrib.bat --ninja-build 명령을 실행하면 되며, 64비트로 빌드했다면 make_distrib.bat --ninja-build --x64-build 명령으로 실행해야한다.

위 과정이 전부 끝났으면 D:\cef\chromium_git\chromium\src\cef\binary_distrib 폴더에 아래와같이 배포파일이 생성된다.

위 스크린샷 기준으로 cef_binary_86.0.0-master.2267+ge94a261+chromium-86.0.4240.0_windows64 폴더로 이동하면 여러 폴더가 보인다. 폴더명을 보면 라이브러리를 사용할 프로젝트에서 어떻게 설정하면 될지 감이 잡힐것같고… Resource폴더와 Debug 또는 Release 폴더의 파일들을 cef를 사용한 프로그램과 함께 넣어서 실행하거나 배포하면 될것이다. (물론 필요에따라서 MSVC 재배포 패키지와함께.)

– 기타
create.bat의 GN_DEFINES값 (참고)
is_component_build가 활성화된 상태로 빌드하면 배포파일 생성에서 부수적인 DLL의 복사를 지원하지 않는것으로 보인다.
is_official_build가 비활성화되면 component build를 비활성하고 빌드 시 libcef.dll을 링크할 때 out of memory가 발생한다. 더군다나 높은 확률로 로그아웃되고 먹통될 수 있다. 이건 물리 메모리 48기가 + 가상 메모리 30기가 할당된 상태에서 확인된 사항. 어떠한 코드가 제외되는지는 알 수 없었다.
use_jumbo_build를 참고 링크에서 확인할 수 있지만 현재 최신 branch에서는 사용 불가 옵션으로 보인다.

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다

*
*

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.