chromium Windows build

chromium

2023/8/11 mini_installer のビルドも追加しました。
2023/12/13 中国語(繁体字)版 を公開しました。

chromium ビルド前の準備

chromium のフルビルド手順
Checking out and Building Chromium for Windows” を参照してビルドします。

  • ビルド PC は時間が掛かるため高スペックが必要です。2種類試しました。
    Windows10 core-i3 4スレッド メモリ 16GiB SSD 256 GiB: ビルド時間 80時間~90時間程度
    Windows11 core-i7 20スレッド メモリ 16GiB SSD 1TB: ビルド時間 5~6時間程度
  • ビルド PC に git をインストールしておく必要があります。
  • Windowsの文字コードを UTF-8 に設定する必要があります。この理由はソースをダウンロード (fetch) するスクリプトが UTF-8 前提のようで、 Shift-JIS は fetch 時にエラーとなるからです。
    ※ Windows 10/11 の 21H2 からサポートされている機能です
    • Windows 文字コード UTF-8 設定手順 (簡素に書きます)
      設定 > 時刻と変更 > 言語と地域 > 管理用の言語の設定
      システムロケールの変更 地域の設定 画面
      ”ベータ: ワールドワイド言語サポートで Unicode UTF-8 を使用(U)” にチェックを入れてPCを再起動します。
    • Windows 文字コード UTF-8 への設定手順はこちらが丁寧です。
      Windows11 – システムロケールの確認と変更 | 設定Lab (setup-lab.net)

visual studio と windows11 SDK インストール

visual studio 2022 (>=17.0.0) と windows11 sdk version 10.0.22621.0 を取得、インストールします。特に visual studio は色々なコンポーネントがありますが、DOSプロンプトから以下のコマンドラインを実行することで必要最小限の環境がインストールできます。(時間の節約になります)

C:\Users\Ichino\Downloads> VisualStudioSetup.exe ^
--add Microsoft.VisualStudio.Workload.NativeDesktop ^
--add Microsoft.VisualStudio.Component.VC.ATLMFC ^
--includeRecommended

コマンド入力後にインストーラー画面が表示されます。その画面でダウンロードしながらインストールを選択して進めます。

depot_tools インストール

本家サイトにあるリンク先から depot_tools.zip をダウンロードして任意のフォルダに解凍します。zipファイルを解凍するときは右クリックのメニューから行います。(実際は7zipで解凍するのが安全)
この理由は .git が正しく解凍されないためみたいです。
解凍後、depot_tools のフォルダパスを環境変数 PATH の先頭に設定したあと、DOSプロンプトから以下のコマンドを実行します。(depot_toolsを最新に更新します)

C:\src> gclient

chromium ソース取得

まず、git の初期設定を行います。DOSプロンプトから以下を設定します。

c:\src> git config --global user.name "Ichino"
c:\src> git config --global user.email "ichino@ichino-memo.com"
c:\src> git config --global core.autocrlf false
c:\src> git config --global core.filemode false
c:\src> git config --global branch.autosetuprebase always

次に chromium ビルドで使用するフォルダを作成します。

c:\src> mkdir chromium && cd chromium

chromium のソースを取得します。自分の環境ではエラーが発生して、改めて取得し直しました。 fetch は成功したとして3時間程度の時間はかかります。

c:\src\chromium> fetch chromium
  • 成功時のログ
    成功すると chromium フォルダに .gclient というファイルが生成されています。
C:\src\chromium>fetch chromium
Updating depot_tools...
Running: 'C:\Users\ichino\.vpython-root\54046a\Scripts\python.exe' 'C:\src\depot_tools\gclient.py' root
Running: 'C:\Users\ichino\.vpython-root\54046a\Scripts\python.exe' 'C:\src\depot_tools\gclient.py' config --spec 'solutions = [
  {
    "name": "src",
    "url": "https://chromium.googlesource.com/chromium/src.git",
    "managed": False,
    "custom_deps": {},
    "custom_vars": {},
  },
]
'
Running: 'C:\Users\ichino\.vpython-root\54046a\Scripts\python.exe' 'C:\src\depot_tools\gclient.py' sync
1>________ running 'git -c core.deltaBaseCacheLimit=2g clone --no-checkout --progress https://chromium.googlesource.com/chromium/src.git C:\src\chromium\_gclient_src_qlpp7ox2' in 'C:\src\chromium'
1>Cloning into 'C:\src\chromium\_gclient_src_qlpp7ox2'...
1>remote: Sending approximately 40.84 GiB ...Counting objects: 1
.
.
.
Running hooks:  53% (78/145) cros_simplechrome_artifacts_with_no_vm_intRunning hooks:  54% (79/145) cros_simplechrome_artifacts_with_vm_internRunning hooks:  55% (80/145) cros_simplechrome_artifacts_with_vm for laRunning hooks:  55% (81/145) cros_simplechrome_artifacts_with_no_vm forRunning hooks:  56% (82/145) cros_simplechrome_artifacts_with_vm_internRunning hooks:  57% (83/145) cros_simplechrome_artifacts_with_no_vm_intRunning hooks:  57% (84/145) Fetch PGO profiles for win32
Hook 'python3 src/testing/generate_location_tags.py --out src/testing/location_tags.json' took 44.38 secs
Hook 'python3 src/third_party/depot_tools/download_from_google_storage.py --no_auth --quiet --bucket chromium-style-perftest -d src/third_party/blink/renderer/core/css/perftest_data' took 25.86 secs
Running hooks: 100% (145/145), done.
Running: git submodule foreach 'git config -f $toplevel/.git/config submodule.$name.ignore all'
Running: git config --add remote.origin.fetch '+refs/tags/*:refs/tags/*'
Running: git config diff.ignoreSubmodules all
  • 失敗時のログ
C:\src\chromium>fetch chromium
Updating depot_tools...
Running: 'C:\Users\ichino\.vpython-root\54046a\Scripts\python.exe' 'C:\src\depot_tools\gclient.py' root
Running: 'C:\Users\ichino\.vpython-root\54046a\Scripts\python.exe' 'C:\src\depot_tools\gclient.py' config --spec 'solutions = [
  {
    "name": "src",
    "url": "https://chromium.googlesource.com/chromium/src.git",
    "managed": False,
    "custom_deps": {},
    "custom_vars": {},
  },
]
'
.
.
.
1>error: 29040 bytes of body are still expected.13 GiB | 6.57 MiB/s
1>fetch-pack: unexpected disconnect while reading sideband packet
1>fatal: early EOF
1>fatal: fetch-pack: invalid index-pack output
1>WARNING: subprocess '"git" "-c" "core.deltaBaseCacheLimit=2g" "clone" "--no-checkout" "--progress" "https://chromium.googlesource.com/chromium/src.git" "C:\src\chromium\_gclient_src_9diwfm34"' in C:\src\chromium failed; will retry after a short nap...
Syncing projects: 100% ( 1/ 1) src

src (ERROR)
----------------------------------------
[0:00:00] Started.
[0:01:08]
Traceback (most recent call last):
  File "C:\src\depot_tools\gclient_scm.py", line 1185, in _Clone
    self._Run(clone_cmd,
  File "C:\src\depot_tools\gclient_scm.py", line 1531, in _Run
    gclient_utils.CheckCallAndFilter(cmd, env=env, **kwargs)
  File "C:\src\depot_tools\gclient_utils.py", line 715, in CheckCallAndFilter
    raise subprocess2.CalledProcessError(
subprocess2.CalledProcessError: Command 'git -c core.deltaBaseCacheLimit=2g clone --no-checkout --progress https://chromium.googlesource.com/chromium/src.git C:\\src\\chromium\\_gclient_src_9diwfm34' returned non-zero exit status 128 in C:\src\chromium
[0:22:11] _____ Conflicting directory found in C:\src\chromium\src. Moving to C:\src\chromium\_bad_scm\srcguswswnw.
----------------------------------------


Warnings:
Conflicting directory C:\src\chromium\src moved to C:\src\chromium\_bad_scm\srcguswswnw.
Traceback (most recent call last):
  File "C:\src\depot_tools\gclient_scm.py", line 663, in update
    self._Clone(revision, url, options)
  File "C:\src\depot_tools\gclient_scm.py", line 1185, in _Clone
    self._Run(clone_cmd,
  File "C:\src\depot_tools\gclient_scm.py", line 1531, in _Run
    gclient_utils.CheckCallAndFilter(cmd, env=env, **kwargs)
  File "C:\src\depot_tools\gclient_utils.py", line 715, in CheckCallAndFilter
    raise subprocess2.CalledProcessError(
subprocess2.CalledProcessError: Command 'git -c core.deltaBaseCacheLimit=2g clone --no-checkout --progress https://chromium.googlesource.com/chromium/src.git C:\\src\\chromium\\_gclient_src_9diwfm34' returned non-zero exit status 128 in C:\src\chromium

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\ichino\.vpython-root\54046a\lib\shutil.py", line 791, in move
    os.rename(src, real_dst)
FileNotFoundError: [WinError 2] 指定されたファイルが見つかりません。: 'C:\\src\\chromium\\src' -> 'C:\\src\\chromium\\_bad_scm\\srcguswswnw\\src'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\src\depot_tools\metrics.py", line 301, in print_notice_and_exit
    yield
  File "C:\src\depot_tools\gclient.py", line 3555, in <module>
    sys.exit(main(sys.argv[1:]))
  File "C:\src\depot_tools\gclient.py", line 3541, in main
    return dispatcher.execute(OptionParser(), argv)
  File "C:\src\depot_tools\subcommand.py", line 252, in execute
    return command(parser, args[1:])
  File "C:\src\depot_tools\gclient.py", line 3085, in CMDsync
    ret = client.RunOnDeps('update', args)
  File "C:\src\depot_tools\gclient.py", line 2041, in RunOnDeps
    work_queue.flush(revision_overrides,
  File "C:\src\depot_tools\gclient_utils.py", line 1016, in flush
    reraise(e[0], e[1], e[2])
  File "C:\src\depot_tools\gclient_utils.py", line 70, in reraise
    raise value
  File "C:\src\depot_tools\gclient_utils.py", line 1093, in run
    self.item.run(*self.args, **self.kwargs)
  File "C:\src\depot_tools\gclient.py", line 1016, in run
    self._got_revision = self._used_scm.RunCommand(command, options, args,
  File "C:\src\depot_tools\gclient_scm.py", line 128, in RunCommand
    return getattr(self, command)(options, args, file_list)
  File "C:\src\depot_tools\gclient_scm.py", line 564, in wrapper
    return_val = f(*args)
  File "C:\src\depot_tools\gclient_scm.py", line 666, in update
    self._DeleteOrMove(options.force)
  File "C:\src\depot_tools\gclient_scm.py", line 203, in _DeleteOrMove
    shutil.move(self.checkout_path, dest_path)
  File "C:\Users\ichino\.vpython-root\54046a\lib\shutil.py", line 811, in move
    copy_function(src, real_dst)
  File "C:\Users\ichino\.vpython-root\54046a\lib\shutil.py", line 435, in copy2
    copyfile(src, dst, follow_symlinks=follow_symlinks)
  File "C:\Users\ichino\.vpython-root\54046a\lib\shutil.py", line 264, in copyfile
    with open(src, 'rb') as fsrc, open(dst, 'wb') as fdst:
FileNotFoundError: [Errno 2] No such file or directory: 'C:\\src\\chromium\\src'
Subprocess failed with return code 1.

なお、エラー後に以下のコマンドでも取得は成功しませんでした。

c:\src\chromium> gclient sync

chromium Configuration

chromium をビルドする前に例えばデバッグシンボルを付加するかなどの Configuration を行います。
fetch した src フォルダへ移動して gn コマンドを実行します。(実際は色々なパラメータがあり、別の機会で案内します)。

c:\src\chromium> cd src
c:\src\chromium\src> gn gen out\Default

chromium build

ようやくビルドを開始します。ビルドは高スペック PC でも5~6時間程度はかかります。

c:\src\chromium\src> autoninja -C out\Default chrome
  • 成功時のログ
C:\src\chromium\src>autoninja -C out\Default chrome
"C:\src\depot_tools\bootstrap-2@3_8_10_chromium_26_bin\python3\bin\python3.exe" C:\src\depot_tools\ninja.py -C out\Default chrome -j 22
ninja: Entering directory `out\Default'
[58860/58860] STAMP obj/chrome/chrome.stamp

ビルド済み chromium の実行

DOSプロンプトから以下のコマンドを実行します。

c:\src\chromium\src> out\Default\chrome.exe

初回の起動はキャッシュを作成するのでブラウザが表示されるまで時間が少し時間がかかります。少し待つと chromium の画面が現れてきます。

mini_installer build

この流れで chromium の mini_installer をビルドしてしまいます。これで他PCへもインストールできることになります。一度 chromium のビルドを実施しているので mini_installer のビルドはすぐに終わります。

c:\src\chromium\src> ninja -C out\Default mini_installer
  • 成功時のログ
C:\src\chromium\src>autoninja -C out\Default chrome
"C:\src\depot_tools\bootstrap-2@3_8_10_chromium_26_bin\python3\bin\python3.exe" C:\src\depot_tools\ninja.py -C out\Default chrome -j 22
ninja: Entering directory `out\Default'
[59352/59352] STAMP obj/chrome/chrome.stamp

C:\src\chromium\src>autoninja -C out\Default mini_installer
"C:\src\depot_tools\bootstrap-2@3_8_10_chromium_26_bin\python3\bin\python3.exe" C:\src\depot_tools\ninja.py -C out\Default mini_installer -j 22
ninja: Entering directory `out\Default'
[101/101] LINK mini_installer.exe mini_installer.exe.pdb

C:\src\chromium\src>

mini_installer を使ったインストールについては こちらの記事 をご確認頂ければと思います。