当前位置:   article > 正文

Linux 编译CEF源码详细记录_linux编译cef

linux编译cef

Linux CEF(Chromium Embedded Framework)源码下载编译

背景

由于CEF默认的二进制分发包不支持音视频播放,需要自行编译源码,将ffmpeg开关打开才能支持。这里介绍的是Linux平台下的CEF源码下载编译过程。

Windows平台参考:
Windows 编译CEF源码详细记录

前置条件

下载的过程非常艰辛,因为硬性要求比较高。

  • 16GB RAM (推荐 32GB+ )
  • 120GB SSD硬盘空闲空间起步(避免机械硬盘)
  • 100Mbps带宽(包括代理带宽)以及100G以上的代理流量

这里额外说明一下,下载过程总是失败,大概率原因是因为网络的问题,尤其是网络带宽和代理带宽。这里为什么要单独提代理带宽呢,因为公司有提供代理服务,但是只有10Mbps,所以会导致下载超时,服务端关闭连接。

注意,由于一些因素,下载代码的环境是基于WSL,编译的时候是在UOS V20 1050系统上,但总体差异不大,相关路径会有区别,仍有参考价值。

接下来开始下载CEF的代码

下载

创建目录结构

首先,先创建目录结构,最终的目录结构如下:

~/CEF/
  automate/
    automate-git.py   <-- CEF build script
  chromium_git/
    cef/              <-- CEF source checkout
    chromium/
      src/            <-- Chromium source checkout
    update.[bat|sh]   <-- Bootstrap script for automate-git.py
  depot_tools/        <-- Chromium build tools
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

可以使用以下命令,创建目录

mkdir CEF && cd CEF && mkdir automate && mkdir chromium_git
  • 1

终端设置代理

这一步非常重要,因为需要让终端走代理,才能正常下载代码

设置终端代理

export http_proxy=127.0.0.1:7890
export https_proxy=127.0.0.1:7890
  • 1
  • 2

通常情况下,这样就可以了,但由于公司的代理问题,设置了代理之后,bitbucket.org域名无法访问,所以我这里将bitbucket.org域名排除在外,这一步因人而异,但基本是不需要这一步的。

export no_proxy=localhost,bitbucket.org
  • 1

验证代理是否设置成功

leoya@leoya-PC:~$ curl -I https://chromium.googlesource.com
HTTP/1.1 200 Connection established

HTTP/2 200 
content-security-policy: script-src 'nonce-WfQMl6EHcID6PtyTna5LNQ' 'unsafe-inline' 'strict-dynamic' https: http: 'unsafe-eval';object-src 'none';base-uri 'self';report-uri https://csp.withgoogle.com/csp/gerritcodereview/1
content-type: text/html; charset=utf-8
strict-transport-security: max-age=31536000; includeSubDomains; preload
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-xss-protection: 0
date: Fri, 30 Jun 2023 02:04:17 GMT
alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

这里通过curl去获取响应信息,能获取到状态码200或者304,即说明访问正常。可以额外对bitbucket.org也测试一下,如果访问失败,那说明需要将它排除在代理规则内,通过上述方法或者代理软件(如clash)设置代理规则为直连即可。

设置git代理

git config --global http.proxy 127.0.0.1:7890
git config --global https.proxy 127.0.0.1:7890
  • 1
  • 2

下载脚本

在CEF根目录下,下载depot_tools,并配置环境变量

git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
export PATH=/home/leoya/CEF/depot_tools:$PATH
  • 1
  • 2

下载automate-git.py脚本,这里需要在CEF/automate目录下

cd automate/
wget https://bitbucket.org/chromiumembedded/cef/raw/master/tools/automate/automate-git.py
  • 1
  • 2

创建 ~/CEF/chromium_git/update.sh脚本

#!/bin/bash
python3 ../automate/automate-git.py --download-dir=/home/leoya/CEF/chromium_git --depot-tools-dir=/home/leoya/CEF/depot_tools --no-distrib --no-build
  • 1
  • 2

执行脚本

设置权限并执行

chmod 755 update.sh
./update.sh
  • 1
  • 2

接下来就是无尽的等待。

在这里插入图片描述

这里要特别注意depot_tools的更新进度,每次执行脚本的时候,它都会先更新depot_tools,如果更新状态过慢,可能网络有问题。

下载cef仓库的时候一般是没什么问题的。

这里最关键的是下载chromium源码的环节,因为脚本执行中断往往就是在这个环节。因为网络稳定性、下载速率等问题,导致出错。

在这里插入图片描述

当你看到Still working on字样的时候,恭喜你,你已经迈过了最艰难的环节,接下来就是下载终端,重试的成本也比较低,因为不用重新下载chromium源码。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

接下来见证下载成功的时刻!!!

在这里插入图片描述

报错信息总结

以下原因解释不一定正确,仅供参考
1.

[1:38:14] error: RPC failed; curl 56 GnuTLS recv error (-9):Error decoding the received TLS packet.[1:30:14] fatal:the remote end hung up unexpectedly
[1:30:14] fatail:"early EOF
[1:30:14] fatat: index-pack failed1:30:16]
  • 1
  • 2
  • 3

在这里插入图片描述
这里大概率是网络不稳定导致下载中断

error: RPC failed; curl 18 transfer closed with outstanding read data remaining
fatal: 远端意外挂断了
fatal: 过早的文件结束符(EOF)
fatal: index-pack 失败
  • 1
  • 2
  • 3
  • 4

这个就是因为下载速率太慢,导致长时间占用连接,服务端就主动关闭了连接。

编译 CEF

接下来即可修改ffmpeg文件以添加音视频的支持了

设置ffmpeg

chromium_git/chromium/src/third_party/ffmpeg/chromium/config/Chromium/linux/x64/config_components.h文件的宏#define CONFIG_SIPR_PARSER 1由0设置为1,即启用。

生成工程

终端输入

export GN_DEFINES="use_sysroot=true symbol_level=1 is_cfi=false use_thin_lto=false use_vaapi=false ffmpeg_branding=Chrome proprietary_codecs=true is_official_build=true use_gnome_keyring=false chrome_pgo_phase=0"
  • 1
  • ffmpeg_branding和proprietary_codecs 表示开启多媒体编解码支持,但默认仅支持一小部分,想要支持更多可修改上面 ffmpeg 配置文件。
  • is_official_build 决定了是否是编译正式版本,指定该参数为 true 基本上都是为了产品发布使用,同时也会在创建解决方案的时候生成带有 sandbox 的解决方案,而不指定这个参数是没有的。
  • use_jumbo_build 官方资料默认指定,表示是否启用试验性的 jumbo 编译,编译过程会加快很多(至少快 1 小时),但是占用 CPU 和内存(尤其是内存)会剧增。
  • is_component_build 官方资料默认指定,但我们没有开启,这个参数表示是否启用组件化编译,设置为 true 以后,base、ffmpeg 等等都会被编译为动态库,使用时也是动态链接,编译出来的 cef_sandbox 只有几兆大小,并且你需要复制很多 dll 文件到项目目录下才能运行。

这里需要注意几个参数use_vaapi如果未设置为false,即使安装了vaapi,也会出现头文件的一些错误信息。

chrome_pgo_phase=0 禁用pgo文件。

use_gnome_keyring设置为false

进入code/chromium_git/chromium/src/cef路径,执行脚本,生成工程文件

./cef_create_projects.sh
  • 1

问题处理

在生成工程的过程中,我这里遇到了很多错误,大多是缺失库。

printing:printing_unittests
ERROR at dynamically parsed input that //printing/BUILD.gn:464:16 loaded :1:1: Invalid token in literal value
-------------------------------------
^
See //BUILD.gn:287:15: which caused the file to be included.                                                  
    deps += [ "//printing:printing_unittests" ]
              ^------------------------------
Traceback (most recent call last):                                                                            
  File "tools/gclient_hook.py", line 149, in <module>
    RunAction(src_dir, cmd)
  File "/media/Leou/53e0f2ac-c225-409c-ad9d-0cf8392c641f/code/chromium_git/chromium/src/cef/tools/gclient_util.py", line 36, in RunAction
    command, cwd=dir, always_show_header=True, print_stdout=True)
  File "/media/Leou/53e0f2ac-c225-409c-ad9d-0cf8392c641f/code/depot_tools/gclient_utils.py", line 716, in CheckCallAndFilter
    rv, args, kwargs.get('cwd', None), command_output.getvalue(), None)
subprocess2.CalledProcessError: Command 'gn gen out/Debug_GN_x64' returned non-zero exit status 1 in /media/Leou/53e0f2ac-c225-409c-ad9d-0cf8392c641f/code/chromium_git/chromium/src
ERROR at dynamically parsed input that //printing/BUILD.gn:464:16 loaded :1:1: Invalid token in literal value
-------------------------------------
^
See //BUILD.gn:287:15: which caused the file to be included.                                                  
    deps += [ "//printing:printing_unittests" ]
              ^------------------------------
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

缺失库,安装libcups2-dev库即可

sudo apt install libcups2-dev
  • 1
Package glib-2.0 was not found in the pkg-config search path
ERROR at //build/config/linux/pkg_config.gni:104:17: Script returned non-zero exit code.
    pkgresult = exec_script(pkg_config_script, args, "value")
                ^----------
Current dir: /media/Leou/53e0f2ac-c225-409c-ad9d-0cf8392c641f/code/chromium_git/chromium/src/out/Debug_GN_x64/
Command: python3 /media/Leou/53e0f2ac-c225-409c-ad9d-0cf8392c641f/code/chromium_git/chromium/src/build/config/linux/pkg-config.py glib-2.0
Returned 1.
stderr:

Package glib-2.0 was not found in the pkg-config search path.
Perhaps you should add the directory containing `glib-2.0.pc'
to the PKG_CONFIG_PATH environment variable
No package 'glib-2.0' found
Could not run pkg-config.

See //cef/BUILD.gn:2090:5: whence it was called.
    pkg_config("glib") {
    ^-------------------
See //BUILD.gn:283:15: which caused the file to be included.                                                  
    deps += [ "//cef" ]
              ^------
Traceback (most recent call last):                                                                            
  File "tools/gclient_hook.py", line 149, in <module>
    RunAction(src_dir, cmd)
  File "/media/Leou/53e0f2ac-c225-409c-ad9d-0cf8392c641f/code/chromium_git/chromium/src/cef/tools/gclient_util.py", line 36, in RunAction
    command, cwd=dir, always_show_header=True, print_stdout=True)
  File "/media/Leou/53e0f2ac-c225-409c-ad9d-0cf8392c641f/code/depot_tools/gclient_utils.py", line 716, in CheckCallAndFilter
    rv, args, kwargs.get('cwd', None), command_output.getvalue(), None)
subprocess2.CalledProcessError: Command 'gn gen out/Debug_GN_x64' returned non-zero exit status 1 in /media/Leou/53e0f2ac-c225-409c-ad9d-0cf8392c641f/code/chromium_git/chromium/src
ERROR at //build/config/linux/pkg_config.gni:104:17: Script returned non-zero exit code.
    pkgresult = exec_script(pkg_config_script, args, "value")
                ^----------
Current dir: /media/Leou/53e0f2ac-c225-409c-ad9d-0cf8392c641f/code/chromium_git/chromium/src/out/Debug_GN_x64/
Command: python3 /media/Leou/53e0f2ac-c225-409c-ad9d-0cf8392c641f/code/chromium_git/chromium/src/build/config/linux/pkg-config.py glib-2.0
Returned 1.
stderr:

Package glib-2.0 was not found in the pkg-config search path.
Perhaps you should add the directory containing `glib-2.0.pc'
to the PKG_CONFIG_PATH environment variable
No package 'glib-2.0' found
Could not run pkg-config.

See //cef/BUILD.gn:2090:5: whence it was called.
    pkg_config("glib") {
    ^-------------------
See //BUILD.gn:283:15: which caused the file to be included.                                                  
    deps += [ "//cef" ]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

安装

sudo apt install libglib2.0-dev
  • 1
Package gnome-keyring-1 was not found in the pkg-config search path.
ERROR at //build/config/linux/pkg_config.gni:104:17: Script returned non-zero exit code.
    pkgresult = exec_script(pkg_config_script, args, "value")
                ^----------
Current dir: /media/Leou/53e0f2ac-c225-409c-ad9d-0cf8392c641f/code/chromium_git/chromium/src/out/Debug_GN_x64/
Command: python3 /media/Leou/53e0f2ac-c225-409c-ad9d-0cf8392c641f/code/chromium_git/chromium/src/build/config/linux/pkg-config.py gnome-keyring-1
Returned 1.
stderr:

Package gnome-keyring-1 was not found in the pkg-config search path.
Perhaps you should add the directory containing `gnome-keyring-1.pc'
to the PKG_CONFIG_PATH environment variable
No package 'gnome-keyring-1' found
Could not run pkg-config.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

这里就是前面提到的需要将use_gnome_keyring设置为false禁用掉。

终端输入,将其禁用

export GN_DEFINES="use_sysroot=true symbol_level=1 is_cfi=false use_thin_lto=false use_vaapi=false ffmpeg_branding=Chrome proprietary_codecs=true is_official_build=true use_gnome_keyring=false chrome_pgo_phase=0"
  • 1
Package dbus-1 was not found in the pkg-config search path
ERROR at //build/config/linux/pkg_config.gni:104:17: Script returned non-zero exit code.
    pkgresult = exec_script(pkg_config_script, args, "value")
                ^----------
Current dir: /media/Leou/53e0f2ac-c225-409c-ad9d-0cf8392c641f/code/chromium_git/chromium/src/out/Debug_GN_x64/
Command: python3 /media/Leou/53e0f2ac-c225-409c-ad9d-0cf8392c641f/code/chromium_git/chromium/src/build/config/linux/pkg-config.py dbus-1
Returned 1.
stderr:

Package dbus-1 was not found in the pkg-config search path.
Perhaps you should add the directory containing `dbus-1.pc'
to the PKG_CONFIG_PATH environment variable
No package 'dbus-1' found
Could not run pkg-config.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

安装

sudo apt install libdbus-1-dev
  • 1
Package nss was not found in the pkg-config search path
ERROR at //build/config/linux/pkg_config.gni:104:17: Script returned non-zero exit code.
    pkgresult = exec_script(pkg_config_script, args, "value")
                ^----------
Current dir: /media/Leou/53e0f2ac-c225-409c-ad9d-0cf8392c641f/code/chromium_git/chromium/src/out/Debug_GN_x64/
Command: python3 /media/Leou/53e0f2ac-c225-409c-ad9d-0cf8392c641f/code/chromium_git/chromium/src/build/config/linux/pkg-config.py nss -v -lssl3
Returned 1.
stderr:

Package nss was not found in the pkg-config search path.
Perhaps you should add the directory containing `nss.pc'
to the PKG_CONFIG_PATH environment variable
No package 'nss' found
Could not run pkg-config.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

安装

sudo apt install libnss3-dev
  • 1
Package libva was not found in the pkg-config search path
ERROR at //build/config/linux/pkg_config.gni:104:17: Script returned non-zero exit code.
    pkgresult = exec_script(pkg_config_script, args, "value")
                ^----------
Current dir: /media/Leou/53e0f2ac-c225-409c-ad9d-0cf8392c641f/code/chromium_git/chromium/src/out/Debug_GN_x64/
Command: python3 /media/Leou/53e0f2ac-c225-409c-ad9d-0cf8392c641f/code/chromium_git/chromium/src/build/config/linux/pkg-config.py libva
Returned 1.
stderr:

Package libva was not found in the pkg-config search path.
Perhaps you should add the directory containing `libva.pc'
to the PKG_CONFIG_PATH environment variable
No package 'libva' found
Could not run pkg-config.

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

安装

sudo apt install libva-dev
  • 1
Package gbm was not found in the pkg-config search path
ERROR at //build/config/linux/pkg_config.gni:104:17: Script returned non-zero exit code.
    pkgresult = exec_script(pkg_config_script, args, "value")
                ^----------
Current dir: /media/Leou/53e0f2ac-c225-409c-ad9d-0cf8392c641f/code/chromium_git/chromium/src/out/Debug_GN_x64/
Command: python3 /media/Leou/53e0f2ac-c225-409c-ad9d-0cf8392c641f/code/chromium_git/chromium/src/build/config/linux/pkg-config.py gbm
Returned 1.
stderr:

Package gbm was not found in the pkg-config search path.
Perhaps you should add the directory containing `gbm.pc'
to the PKG_CONFIG_PATH environment variable
No package 'gbm' found
Could not run pkg-config.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
sudo apt install libgbm-dev
  • 1
run “gclient runhooks” to download it. You can also simply disable the PGO optimizations by setting |chrome_pgo_phase = 0| in your GN arguments

即pgo文件问题

ERROR at //build/config/compiler/pgo/BUILD.gn:81:23: Script returned non-zero exit code.
      pgo_data_path = exec_script("//tools/update_pgo_profiles.py",
                      ^----------
Current dir: /media/Leou/53e0f2ac-c225-409c-ad9d-0cf8392c641f/code/chromium_git/chromium/src/out/Release_GN_x64/
Command: python3 /media/Leou/53e0f2ac-c225-409c-ad9d-0cf8392c641f/code/chromium_git/chromium/src/tools/update_pgo_profiles.py --target linux get_profile_path
Returned 1.
stderr:

Traceback (most recent call last):
  File "/media/Leou/53e0f2ac-c225-409c-ad9d-0cf8392c641f/code/chromium_git/chromium/src/tools/update_pgo_profiles.py", line 154, in <module>
    sys.exit(main())
  File "/media/Leou/53e0f2ac-c225-409c-ad9d-0cf8392c641f/code/chromium_git/chromium/src/tools/update_pgo_profiles.py", line 150, in main
    return args.func(args)
  File "/media/Leou/53e0f2ac-c225-409c-ad9d-0cf8392c641f/code/chromium_git/chromium/src/tools/update_pgo_profiles.py", line 122, in _get_profile_path
    profile_path)
RuntimeError: requested profile "/media/Leou/53e0f2ac-c225-409c-ad9d-0cf8392c641f/code/chromium_git/chromium/src/chrome/build/pgo_profiles/chrome-linux-5672-1683023364-b47f9a07c616c94cac9f564aa6b00a8aaaec191a.profdata" doesn't exist, please make sure "checkout_pgo_profiles" is set to True in the "custom_vars" section of your .gclient file, e.g.: 
solutions = [ 
  { 
    "name": "src", 
    # ...  
    "custom_vars": { 
      "checkout_pgo_profiles": True, 
    }, 
  }, 
], 
and then run "gclient runhooks" to download it. You can also simply disable the PGO optimizations by setting |chrome_pgo_phase = 0| in your GN arguments.

See //build/config/BUILDCONFIG.gn:352:3: which caused the file to be included.
  "//build/config/compiler/pgo:default_pgo_flags",
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

尝试了下载pgo文件,但失败,于是将其chrome_pgo_phase禁用

export GN_DEFINES="use_sysroot=false symbol_level=1 is_cfi=false use_thin_lto=false use_vaapi=false ffmpeg_branding=Chrome proprietary_codecs=true is_official_build=true use_gnome_keyring=false chrome_pgo_phase=0"
  • 1

若还是提示此错误,则可修改chromium_git/chromium/src/build/config/compiler/pgo/pgo.gni文件,最后的位置处加上chrome_pgo_phase = 0

  chrome_pgo_phase = 0
  if (!dcheck_always_on && is_official_build &&
      # TODO(crbug.com/1052397): Remove chromeos_is_browser_only once
      # target_os switch for lacros-chrome is completed.
      # TODO(crbug.com/1336055): Update this now-outdated condition with regard
      # to chromecast and determine whether chromeos_is_browser_only is
      # obsolete.
      (is_high_end_android || is_win || is_mac || is_fuchsia ||
       (is_linux && !is_castos && !chromeos_is_browser_only))) {
    chrome_pgo_phase = 2
  }
# 手动添加
  chrome_pgo_phase = 0
  # When using chrome_pgo_phase = 2, read profile data from this path.
  pgo_data_path = ""
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

当问题都解决后,就可以开始编译源码了。

开始编译

code/chromium_git/chromium/src路径下

# debug lib
ninja -C out/Debug_GN_x64 cefclient cefsimple ceftests chrome_sandbox
# release lib
ninja -C out/Release_GN_x64 cefclient cefsimple ceftests chrome_sandbox
  • 1
  • 2
  • 3
  • 4

这里直接执行的第二条命令

在编译过程中,也会出现错误,不过好在是增量编译,报错不会影响已经编译好的产物。

问题处理
gperf错误
sudo apt install gperf
  • 1
No module named ‘importlib_metadata’
Traceback (most recent call last):
  File "../../third_party/blink/renderer/bindings/scripts/generate_bindings.py", line 12, in <module>
    import bind_gen
  File "/media/Leou/53e0f2ac-c225-409c-ad9d-0cf8392c641f/code/chromium_git/chromium/src/third_party/blink/renderer/bindings/scripts/bind_gen/__init__.py", line 36, in <module>
    from .callback_function import generate_callback_functions
  File "/media/Leou/53e0f2ac-c225-409c-ad9d-0cf8392c641f/code/chromium_git/chromium/src/third_party/blink/renderer/bindings/scripts/bind_gen/callback_function.py", line 8, in <module>
    from .blink_v8_bridge import blink_class_name
  File "/media/Leou/53e0f2ac-c225-409c-ad9d-0cf8392c641f/code/chromium_git/chromium/src/third_party/blink/renderer/bindings/scripts/bind_gen/blink_v8_bridge.py", line 8, in <module>
    from .code_node import FormatNode
  File "/media/Leou/53e0f2ac-c225-409c-ad9d-0cf8392c641f/code/chromium_git/chromium/src/third_party/blink/renderer/bindings/scripts/bind_gen/code_node.py", line 13, in <module>
    from .mako_renderer import MakoRenderer
  File "/media/Leou/53e0f2ac-c225-409c-ad9d-0cf8392c641f/code/chromium_git/chromium/src/third_party/blink/renderer/bindings/scripts/bind_gen/mako_renderer.py", line 7, in <module>
    import mako.runtime
  File "/media/Leou/53e0f2ac-c225-409c-ad9d-0cf8392c641f/code/chromium_git/chromium/src/third_party/mako/mako/mako/runtime.py", line 14, in <module>
    from mako import compat
  File "/media/Leou/53e0f2ac-c225-409c-ad9d-0cf8392c641f/code/chromium_git/chromium/src/third_party/mako/mako/mako/compat.py", line 68, in <module>
    import importlib_metadata  # noqa
ModuleNotFoundError: No module named 'importlib_metadata'
[559/47120] CXX obj/v8/cppgc_base/heap-consistency.o
ninja: build stopped: subcommand failed.

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

这个错误提示是最明显的了,安装python的importlib_metadata库即可

pip3 install importlib_metadata
  • 1

如果pip命令未找到,那么先安装pip再执行上面的命令

sudo apt install python3-pip
  • 1
fatal error: ‘pulse/pulseaudio.h’ file not found
gen/media/audio/pulse/pulse_stubs.cc:17:10: fatal error: 'pulse/pulseaudio.h' file not found
#include <pulse/pulseaudio.h>
         ^~~~~~~~~~~~~~~~~~~~
1 error generated.                                                                                            
[6644/46562] CXX obj/extensions/common/api/generated_api_types/networking_private.o
ninja: build stopped: subcommand failed.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
sudo apt install libpulse-dev 
  • 1
fatal error: ‘curl/curl.h’ file not found
../../third_party/crashpad/crashpad/util/net/http_transport_libcurl.cc:17:10: fatal error: 'curl/curl.h' file not found
#include <curl/curl.h>
         ^~~~~~~~~~~~~
1 error generated.                                                                                            
[845/39891] CXX obj/third_party/crashpad/crashpad/util/util/metrics.o
ninja: build stopped: subcommand failed.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
sudo apt install libcurl4-openssl-dev
  • 1
fatal error: ‘pci/pci.h’ file not found
../../third_party/angle/src/gpu_info_util/SystemInfo_libpci.cpp:12:10: fatal error: 'pci/pci.h' file not found
#include <pci/pci.h>
         ^~~~~~~~~~~
1 error generated.                                                                                            
[3735/39047] CXX obj/third_party/vulkan-deps/vulkan-validation-layers/src/VkLayer_khronos_validation/chassis.o
ninja: build stopped: subcommand failed.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
sudo apt install libpci-dev
  • 1
fatal error: ‘alsa/asoundlib.h’ file not found
../../media/midi/midi_manager_alsa.h:8:10: fatal error: 'alsa/asoundlib.h' file not found
#include <alsa/asoundlib.h>
         ^~~~~~~~~~~~~~~~~~
1 error generated.                                                                                            
[4066/35313] CXX obj/media/mojo/mojom/speech_recognition/speech_recognition.mojom.o
ninja: build stopped: subcommand failed.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
sudo apt install libasound2-dev
  • 1
fatal error: ‘gssapi.h’ file not found
../../net/http/http_auth_gssapi_posix.h:26:10: fatal error: 'gssapi.h' file not found
#include <gssapi.h>
         ^~~~~~~~~~
1 error generated.                                                                                            
[483/31248] CXX obj/net/net/http_cache_transaction.o
ninja: build stopped: subcommand failed.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
 sudo apt install libkrb5-dev
  • 1

当编译完成时,终端显示内容:

Leou@Leou-PC:/media/Leou/53e0f2ac-c225-409c-ad9d-0cf8392c641f/code/chromium_git/chromium/src$ ninja -C out/Debug_GN_x64 cefclient cefsimple ceftests chrome_sandbox
ninja: Entering directory `out/Debug_GN_x64'
[57156/57156] LINK ./ceftests
  • 1
  • 2
  • 3

生成CEF二进制分发包

记得选上--x64-build,否则默认为x86,会提示找不到头文件。生成的路径为/code/chromium_git/chromium/src/cef/binary_districhromium/src/cef/binary_distrib,会默认打包为zip压缩包

code/chromium_git/chromium/src/cef/tools$
# 打包Release
./make_distrib.sh --ninja-build --minimal --x64-build
  • 1
  • 2
  • 3

生成的包名:
cef_binary_113.3.5+g0b33855+chromium-113.0.5672.129_linux64_minimal

# 同时打包Debug和Release
./make_distrib.sh --ninja-build --x64-build
  • 1
  • 2

生成的包名:

cef_binary_113.3.5+g0b33855+chromium-113.0.5672.129_linux64

ERROR: Please install Doxygen
ERROR: No docs generated.
Traceback (most recent call last):
  File "make_distrib.py", line 1251, in <module>
    copy_files_list(build_dir, dst_dir, binaries)
  File "make_distrib.py", line 325, in copy_files_list
    raise Exception('Missing required path: %s' % source_path)
Exception: Missing required path: /media/Leou/53e0f2ac-c225-409c-ad9d-0cf8392c641f/code/chromium_git/chromium/src/out/Release_GN_x64/chrome_sandbox
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
sudo apt install doxygen
  • 1

当然也可以禁用生成doc文档,就不需要安装了。

总结

由于是事后记录,出错的问题未记录解决方案难免有疏漏。我在下载、编译、生成的阶段中,都会出现很多问题,但总体而言,Linux平台的CEF源码编译还算比较顺畅。

https://bitbucket.org/chromiumembedded/cef/wiki/BranchesAndBuilding
https://bitbucket.org/chromiumembedded/cef/wiki/MasterBuildQuickStart.md
https://zhuanlan.zhihu.com/p/133675543
https://keqingrong.cn/blog/2021-12-20-building-chromium-on-windows/
https://www.mycode.net.cn/language/cpp/2784.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/912436
推荐阅读
相关标签
  

闽ICP备14008679号