0%

Mac编译Chromium

由于最近看的一本书(TPOSA)中的第一章讲的就是Chromium,所以突然就想下载一下源码,然后又想要不就试试编译一下?

首先官方有一个指导文档

可能不会列出所有的可能性,但是还是稍微记录一下我本人的具体步骤以及踩过的坑吧

时间:2020/12/17
Mac: macbook pro late 2013 15’
Mac系统版本: 10.15.7 (19H15)
Chromium版本(hash): a7361976c2c0be7139f4de8eb8844702a198f0cf

参考的博客

  1. clone源码

    1
    2
    3
    4
    # 直接从官方clone,即使开了梯子也可能会很慢?
    git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
    # 从GitHub官方镜像clone
    git clone https://github.com/chromium/chromium.git

    而且虽然GitHub有两种(ssh/https)clone方式,似乎还是https走代理的速度更快?

  2. 安装depot_tools

    1
    2
    3
    4
    # 放到某一个合适的位置
    git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
    # 更改path
    export PATH="$PATH:/path/to/depot_tools"

    来自上述官方文档

    尝试直接运行gn gen out/Default,出错
    Error: client not configured; see 'gclient config'
    需要先运行gclient sync命令
    直接运行出错:
    gn.py: Could not find gn executable at xxx
    需要配置文件.gclient
    在Chromium文件夹创建.gclient文件

  3. 创建.gclient文件以运行gn命令
    在clone下来的Chromium文件夹创建.gclient文件并添加以下内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    solutions = [
    {
    "managed": False,
    "name": "src",
    "url": "https://chromium.googlesource.com/chromium/src.git",
    "custom_deps": {},
    "deps_file": ".DEPS.git",
    "safesync_url": "",
    },
    ]

    使用gclient sync来获取第三方依赖?

    1
    2
    # 在Chromium文件夹
    gclient sync

    上述命令可能会执行很久,需要clone下大约20G的内容。根据这片文章。可以将上述配置中的”url”改为github的链接https://github.com/chromium/chromium.git,可能会更快?

  4. 继续尝试执行gn gen out/Default
    出错
    ERROR at //.gn:6:1: Unable to load "xxxx/chromium/third_party/angle/dotfile_settings.gni".
    手动从angle仓库clone到third_party文件夹
    继续报错

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    ERROR at //build_overrides/build.gni:5:1: Unable to load "/Users/samuel/git-repos/chromium/build/config/gclient_args.gni".
    import("//build/config/gclient_args.gni")
    ^---------------------------------------
    See //build/toolchain/toolchain.gni:9:1: whence it was imported.
    import("//build_overrides/build.gni")
    ^-----------------------------------
    See //build/config/coverage/coverage.gni:5:1: whence it was imported.
    import("//build/toolchain/toolchain.gni")
    ^---------------------------------------
    See //build/config/profiling/profiling.gni:6:1: whence it was imported.
    import("//build/config/coverage/coverage.gni")
    ^--------------------------------------------
    See //build/config/sanitizers/sanitizers.gni:8:1: whence it was imported.
    import("//build/config/profiling/profiling.gni")
    ^----------------------------------------------
    See //build/config/compiler/compiler.gni:9:1: whence it was imported.
    import("//build/config/sanitizers/sanitizers.gni")
    ^------------------------------------------------
    See //BUILD.gn:12:1: whence it was imported.
    import("//build/config/compiler/compiler.gni")
    ^--------------------------------------------

    根据stackoverflow的回答尝试运行以下命令
    gclient sync --force
    发现中途输出Skipping Mac toolchain installation for mac。感觉是不是还是需要安装以下xcode?发现官方文档明确将developer SDK作为必需准备之一,说明确实需要安装xcode。(本来以为可以不装xcode)
    装完之后还是有上述的Skipping Mac toolchain installation for mac的问题,主要看了这篇博客中提到的手动添加mac_sdk_path的方法,但是并没有什么用。后来看这一篇博文的时候才发现是不是自己执行gn gen out/Default的位置有问题,应该在src目录下执行而不是在根目录下执行。
    换到了src目录出现了新的问题xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer directory '/Library/Developer/CommandLineTools' is a command line tools instance
    stackoverflow中找到了答案,大概是因为我之前安装的CommandLineTools导致xcode-select没有指向新安装的xcode,通过
    sudo xcode-select -s /Applications/Xcode.app/Contents/Developer命令
    使得gn gen out/Default得以正常执行

  1. 使用autoninja来进行编译
    报了很多奇怪的错误,似乎有什么python包缺失以及timeout的问题。接着在尝试通过brew install ccache来安装ccache的时候发现我的xcode似乎并没有选择接受license,同时第一次启动xcode又装了一些component,使用以下命令接受license

    1
    sudo xcodebuild -license accept

    还是不行,尝试具体解决出现的问题。

    • httplib2缺失
      由于使用的是conda通过conda install -c conda-forge httplib2来安装
      发现并没有成功,还是报相同的错误
      查看错误中对应的.py文件depot_tools/ninjalog_uploader.py文件的开头,使用了#!/usr/bin/env python似乎是会使用$PATH中找到的第一个python,但是因为装了conda的原因,虽然直接which python发现此时的python确实就是conda下的python(/usr/local/anaconda3/bin/python),但是实际运行autoninja的时候似乎还是会使用/usr/bin/python
      使用source deactivate可以取消conda的环境配置,然后使用pip3 install httplib2再次安装,成功

    进入src文件夹

    1
    2
    cd src
    autoninja -C out/Default chrome

    开始编译,需要注意的是编译可能会消耗大量的时间以及空间,以本机为例,编译花费了近8个小时,以及120G左右的空间

    编译结束之后可以在src/out/Default/Chromium.app/Contents/MacOS下找到Chromium的可执行文件