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에서는 사용 불가 옵션으로 보인다.

7 Comments

    나그네

    정리가 잘 되어 있어서 보고 했는데, 마지막에 에러가 발생 합니다.

    make_distrib.bat –ninja-build 이 명령어를 하다가 아래로그와 같이 에러가 납니다.
    대충 원인은 lib.exe /out:d:~~~~~
    이것을 실행하다가 에러가 발생한 것으로 보입니다.

    혹시 원인을 알 수 있을까요?

    Traceback (most recent call last):
    File “combine_libs.py”, line 122, in
    sys.exit(Main())
    File “combine_libs.py”, line 117, in Main
    CombineLibraries(output, remove_re, args)
    File “combine_libs.py”, line 62, in CombineLibraries
    Shell(*args)
    File “combine_libs.py”, line 29, in Shell
    raise RuntimeError(‘%s exited with status %d’ % (args[0], retcode))
    RuntimeError: lib.exe exited with status 1107
    Traceback (most recent call last):
    File “D:\cef\chromium_git\chromium\src\cef\tools\\make_distrib.py”, line 904, in
    os.path.join(dst_dir, ‘cef_sandbox.lib’))
    File “D:\cef\chromium_git\chromium\src\cef\tools\\make_distrib.py”, line 396, in combine_libs
    run(cmdline, os.path.join(cef_dir, ‘tools’))
    File “D:\cef\chromium_git\chromium\src\cef\tools\\make_distrib.py”, line 434, in run
    args, cwd=working_dir, env=os.environ, shell=(sys.platform == ‘win32’))
    File “d:\cef\depot_tools\bootstrap-2@3_8_10_chromium_17_bin\python\bin\lib\subprocess.py”, line 190, in check_call
    raise CalledProcessError(retcode, cmd)
    subprocess.CalledProcessError: Command ‘[‘msvs_env.bat’, ‘win32’, ‘d:\\cef\\depot_tools\\bootstrap-2@3_8_10_chromium_17_bin\\python\\bin\\python.exe’, ‘combine_libs.py’, ‘-o’, ‘D:\\cef\\chromium_git\\chromium\\src\\cef\\binary_distrib\\cef_binary_91.0.0-master.2362+gf2f52c1+chromium-91.0.4472.0_windows32\\Debug\\cef_sandbox.lib’, ‘D:\\cef\\chromium_git\\chromium\\src\\out\\Debug_GN_x86\\obj\\base\\base.lib’, ‘D:\\cef\\chromium_git\\chromium\\src\\out\\Debug_GN_x86\\obj\\base\\base_static.lib’, ‘D:\\cef\\chromium_git\\chromium\\src\\out\\Debug_GN_x86\\obj\\base\\third_party\\double_conversion\\double_conversion.lib’, ‘D:\\cef\\chromium_git\\chromium\\src\\out\\Debug_GN_x86\\obj\\base\\third_party\\dynamic_annotations\\dynamic_annotations.lib’, ‘D:\\cef\\chromium_git\\chromium\\src\\out\\Debug_GN_x86\\obj\\base\\win\\pe_image.lib’, ‘D:\\cef\\chromium_git\\chromium\\src\\out\\Debug_GN_x86\\obj\\cef\\cef_sandbox.lib’, ‘D:\\cef\\chromium_git\\chromium\\src\\out\\Debug_GN_x86\\obj\\sandbox\\win\\sandbox.lib’]’ returned non-zero exit status 1

      iruis

      내용 중에 sandbox가 있던데 아무래도 이것때문인거같습니다. 저도 겪었던거같은데… 오래되어 저도 기억이 잘 안나네요. 일단 sandbox는 꼭 필요한 기능이 아닙니다. 아마 cef 라이브러리를 빌드할때는 sandbox가 함께 빌드되지 않았지만 배포본 생성시엔 sandbox가 함께 빌드된것으로 취급하여서 발생하는게 아닌가 생각됩니다.

      https://magpcss.org/ceforum/viewtopic.php?f=6&t=14477
      https://bitbucket.org/chromiumembedded/cef/wiki/SandboxSetup

      이 두 글을 참고해 보면 make_distrib.bat --ninja-build 명령을 실행할 때 --no-sandbox를 함께 주어(make_distrib.bat --ninja-build --no-sandbox) 실행하면 될것같습니다.

        나그네

        빌드 된 바이너리를 받아서 사용하면 동영상이 안나와서…..
        그래서 아래와 같이 create.bat를 만들어서 빌드하면 cefsample.exe를 실행 시키면 잘 나오긴 하는데.. libcef.dll 하나로 만들어 지지 않고 여러개로 나누어져서 빌드가 됩니다.
        dll들이 너무 많아서 배포파일에 넣을 수가 없습니다

        set GN_DEFINES=is_component_build=true proprietary_codecs=true ffmpeg_branding=Chrome
        # Use vs2017 or vs2019 as appropriate.
        set GN_ARGUMENTS=–ide=vs2019 –sln=cef –filters=//cef/*
        call cef_create_projects.bat

        나그네

        문제 현상은 잘 해결 했습니다.

        아래와 같이 옵션을 주어 빌드 했습니다.
        set GN_DEFINES=is_official_build=true use_thin_lto=false proprietary_codecs=true ffmpeg_branding=Chrome

        use_thin_lto=false 이것을 추가해 주면 잘 됩니다.

    나그네

    –no-sandbox 이라는 옵션이 없다고 나오네요 make_distrib.py: error: no such option: –no-sandbox

    marumaru

    chromium 빌드 시
    ‘ninja -C out\Release_GN_x86 cef’
    을 실행하면
    ‘ninja: error: loading ‘build.ninja’: 지정된 파일을 찾을 수 없습니다.’
    가 출력됩니다.
    혹시 원인을 알 수 있을까요?

      iruis

      무려 1년 전 댓글인데 못보았군요. 그래도 답글을 단다면…

      자세한 상황을 모르니 create.bat 파일 실행이 실패하여 ninja build 파일이 생성되지 않았거나 명령을 실행한 경로가 잘못되었을것이라고 밖에 예상되지않습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

*
*

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