当前位置 博文首页 > 申青平的博客:CEF 2987 WIN10 编译历程

    申青平的博客:CEF 2987 WIN10 编译历程

    作者:[db:作者] 时间:2021-07-26 14:55

      最近项目对内嵌浏览器有需求,CEF作为开源的Chromium Embedded Framework的浏览器,具有可行性。第一次编译,没经验,选择先编译官方Master版本,严格按照步骤来做,同时验证安装环境和硬件需求。

    环境准备:
    1、Windows 7 or newer, 64-bit OS,本人Win10.
    2、Visual Studio VS2017 15.3.2+ installed in the default location.默认安装
    3、Windows 10.0.15063.468 SDK installed in the default location. You must install this exact SDK version to avoid build issues.安装时选择。
    4、At least 8GB of RAM and 40GB of free disk space.
    5、尽量默认安装,本人水平有限。
    6、安装7-zip和Cmake工具。注意安装到“C:\Program Files”目录。

    3和4有点坑爹,待我慢慢来说。

    编译工作开始:
    1. 创建目录
     c:\code\automate
     c:\code\chromium_git
      
    2. 下载depot_tools.zip文件,并解压到”c:\code\depot_tools”,千万别复制。

    3. cd c:\code\depot_tools
      update_depot_tools.bat
      该脚本会默认安装Python, Git and SVN编工具。
      
    4. 将”c:\code\depot_tools”添加至系统环境变量PATH。

    5. 下载自动化脚本automate-git.py保存至”c:\code\automate\automate-git.py”。

    6. 创建更新脚本”update.bat”复制到”c:\code\chromium_git\update.bat”。
      脚本内容:  

        set CEF_USE_GN=1
        set GN_ARGUMENTS=--ide=vs2017 --sln=cef --filters=//cef/*
        python ..\automate\automate-git.py --download-dir=c:\code\chromium_git --depot-tools-dir=c:\code\depot_tools --no-distrib --no-build
    cd c:\code\chromium_git
    update.bat
    漫长的等待,完成源码下载
    

    7.创建”create.bat” 脚本复制到”c:\code\chromium_git\chromium\src\cef\create.bat” 。
    脚本内容:

     set CEF_USE_GN=1
     set GN_ARGUMENTS=--ide=vs2017 --sln=cef --filters=//cef/*
     call cef_create_projects.bat

     cd c:\code\chromium_git\chromium\src\cef
     create.bat
     创建对应的VS工程项目。
     
    8. 编译开始
     cd c:\code\chromium_git\chromium\src
     根据需要,编译不同的版本
     ninja -C out\Debug_GN_x64 cef
     ninja -C out\Debug_GN_x86 cef
     ninja -C out\Release_GN_x64 cef
     ninja -C out\Release_GN_x86 cef

    9. 编译完成后,在相应的目录生成cefclient 应用
     cd c:\code\chromium_git\chromium\src
     out\Debug_GN_x86\cefclient.exe

    以上官方文档很简单,实际运行问题一大堆。
    1. 首先是网络问题。源码下载量非常大,而且很多代码需要翻墙。最后在AZURE的国外网站,在东南亚区开了一台设备,解决代码下载问题。

    2. 编译过程问题一大堆,大部分是找不到头文件问题。这都是环境配置引起的。
     解决办法:
     1. 重新安装2017,增加ALT,MFC等控件的安装。系统编译用到这两个控件,解决部分问题。
     2. 卸载vs2017安装时默认安装的高于”10.0.15063.468”版本的WIN10 SDK,解决了部分问题。
     3. 卸载vs2017安装时默认安装的”10.0.15063.468”版本的WIN10 SDK,重新在官网下载 “10.0.15063.468” 版本的WIN10 SDK进行安装。
     终于进入漫长的编译状态。

    3.硬盘问题
    官方文档建议保留40G的控件,实际情况超过100G,这还仅是”Debug_GN_x86”的编译,后来检查发现,大量”.git/project/”目录下的”patch….”下的文件超大,最大的高达8G,我的天啦。
    实际”Debug_GN_x86”目录下编译后的文件总空间超过50G。
    建议硬盘资源,至少保证300G以上的空闲控件,才能做到X64和X32位的全编译。这是后话。

    4.内存问题
    官方建议不低于8G内存,实际情况相差悬殊。我第一次使用16G内存的设备,最后都报可用内存不足而编译失败。后调整虚拟内存配置到最大20G才解决。建议使用32G内存设备编译。实际情况32G设备最后加上系统内存任务管理器显示峰值高达95%的内存使用量。

    5.脚本问题
    Master版本相对比较少,仅碰到在”distrib”的时候,使用相对路径而找不到”combine_libs.py”脚本的问题。后在”PATH\chromium_git\chromium\src\cef\tools\”目录下找到”make_distrib.py”脚本,找到对应的
    cmdline = 'msvs_env.bat win%s python combine_libs.py -o "%s"' % (platform_arch, dest_lib)
    改为
    cmdline = 'msvs_env.bat win%s python 绝对路径\combine_libs.py -o "%s"' % (platform_arch, dest_lib)

    第一个Master版本终于完成,环境配置正确。
    到这一步,耗时整整三天。
    主要是设备硬件问题,其次是环境配置问题。

    刚开始为了省钱,AZURE上开的设备型号太差,内存8G,硬盘可用空间100G,更可恨的是CPU才4核。后期在内存和硬盘充足的情况下,花了整整16个小时才编译完成。

    在以上环境配置下,分支3239,即可顺利编译通过。
    这次脚本修改为下载、编译、发布同时完成,同时包含FFMPEG插件,支持MP3音频等音视频播放。
    32位编译脚本脚本内容为:

    set CEF_USE_GN=1
    set GN_DEFINES=is_official_build=true ffmpeg_branding=Chrome proprietary_codecs=true
    set GYP_DEFINES=buildtype=Official
    set GN_ARGUMENTS=--ide=vs2017 --sln=cef --filters=//cef/*
    set CEF_ARCHIVE_FORMAT=tar.bz2
    python path\automate-git.py --download-dir=path\3202\chromium_git --branch=3239 --force-build --minimal-distrib --client-distrib --force-clean

    64位增加”–x64-build”编译选项。

    问题是我们的项目需要的是分支2987。
    按以上方法,行不通。官方文档看了一遍有一遍,最后发现,分支2987竟然是”Legacy Release Branches (Unsupported)”。

    “Legacy CEF builds are available from the Spotify automated builder back to 2704 branch. Building legacy branches is not supported. If you choose to build a legacy branch you will need to solve any build errors on your own. Newer legacy branches (within the last few months) can often be built using the same tooling as current branches. “

    这是什么情况,彻底晕了。

    好在有之前的经历,总的想点办法。按照分支3239的编译方法尝试了好几次,最终失败。现在开始重点怀疑 “depot_tools”工具和自动化脚本”automate-git.py”。终于在官方讨论区找到类似的解决办法。开始动手解决问题。

    1. 在分支2987的源码中的”tools\automate\”下找到对应的”automate-git.py”下载下来并保存。
    2. 在”http://opensource.spotify.com/cefbuilds/index.html#windows32_builds“网页,
      得到官方分支2987编译成功发布的最后版本发布的时间 是04/07/2017。
    3. 根据该时间,在”https://chromium.googlesource.com/chromium/tools/depot_tools/“网站,找到那个时间点发布的”depot_tools”。我选择的是04/05/2017这一天发布的”depot_tools”。
    4. 在”https://bitbucket.org/chromiumembedded/cef/branch/2987“网站,复制分支2987最后发布的COMMIT ID,本人选择的是”f035232c082f837d2b85bd7821a93a54fc742775”,对应的参数为”–checkout=f035232c082f837d2b85bd7821a93a54fc742775”。
    5. 编写脚本
      X86脚本
      set CEF_USE_GN=1
      set GN_DEFINES=is_official_build=true ffmpeg_branding=Chrome proprietary_codecs=true
      set GYP_DEFINES=buildtype=Official
      set GN_ARGUMENTS=--ide=vs2015 --sln=cef --filters=//cef/*
      set CEF_ARCHIVE_FORMAT=tar.bz2
      set DEPOT_TOOLS_UPDATE=0
      python path\automate-git.py --download-dir=path\2987_cef\chromium_git --depot-tools-dir=path\depot_tools --branch=2987 --force-build --minimal-distrib --client-distrib --force-clean --force-clean-deps --checkout=f035232c082f837d2b85bd7821a93a54fc742775

    其中:
    “set DEPOT_TOOLS_UPDATE=0”,不少文档提到。
    “–force-clean-deps”官方文档提到。
    “–checkout=f035232c082f837d2b85bd7821a93a54fc742775”上面有提到,不再多说。

    开始运行脚本。
    漫长等待,出错。
    再次运行脚本,出错。
    再次运行,竟然通过了。
    分析原因,错误主要是在”gclient”同步第三方源代码出现。也许是上天眷恋,也不知道下次再次这样操作时是否有同样的运气。
    在以上代码下载均成功的基础上,X64脚本:

      set CEF_USE_GN=1
      set GN_DEFINES=is_official_build=true ffmpeg_branding=Chrome proprietary_codecs=true
      set GYP_DEFINES=buildtype=Official
      set GN_ARGUMENTS=--ide=vs2015 --sln=cef --filters=//cef/*
      set CEF_ARCHIVE_FORMAT=tar.bz2
      set DEPOT_TOOLS_UPDATE=0
      python automate\automate-git.py --download-dir=c:\qpshen\2987_cef_1\chromium_git --depot-tools-dir=c:\qpshen\depot_tools --branch=2987 --x64-build --force-build --minimal-distrib --client-distrib --no-depot-tools-update --no-update

    建议:
    硬件设备: 32G 内存;300G空闲硬盘;16核及以上CPU
    本人最后调整AZURE设备后,分支2987 X86和X64版本均编译完成,包括DEBUG版本,硬盘资源消耗超过250G。

    到此为止,总共耗时6天。其中2天时间试错(调整环境),一天时间调整设备。3天时间编译(3X24小时)。终于将分支2987编译完成,其中还涉及将发布后的包打包成”nupkg”格式,供Sharp工具调用。
    打包工具使用cef-binary。
    只要x32位和x64位均编译成功,将发布后对应的x32和x64位包(在对应的distribe目录下)拷贝至对应的cef-binary-2987这个版本的目录下,运行以下命令:

      powershell .\build.ps1 vs2015 local
      powershell .\build.ps1 nuk-only none
    cs