MacでWebKitのビルド時間を計測してみる

# 背景
- iOSエンジニアとしては、Macのスペックにより、ビルド時間はどれくらい違うのかを知りたいところ

**やること**
- ビルドにものすごい時間がかかるプロジェクトとして有名な WebKit をビルドしてみる
	- [GitHub - WebKit/WebKit](https://github.com/WebKit/WebKit)
- モデルごとに WebKit のビルド時間を計測して比較する
	- 出来れば同じ環境（コミット）でビルドしたい（が、手間がかかりそうなので最新masterでビルドする）


---
# ビルド時間の計測結果

 | モデル | デバッグビルド時間 | WebKit の Commit Date |
 | --- | --- | --- |
 | M1 Pro 16” MacBook Pro (2021) | 16m:48s | 2022.03.06 |
 | M1 Pro 16” MacBook Pro (2021) | 18m:10s | 2022.06.30 |
 | M2 13” MacBook Pro (2022) | 24m:33s | 2022.06.30 |

参考サイト: [M1搭載MacBook、コードコンパイルはMac Pro並、16インチMBPを圧倒 - iPhone Mania](https://iphone-mania.jp/news-329700/)

 | モデル | コードコンパイル、テスト完了時間 |
 | --- | --- |
 | M1 Mac mini (2020) | 19m:32s |
 | Intel Mac Pro (2019) | 20m:11s |
 | M1 13” MacBook Pro (2020) | 20m:43s |
 | M1 13” MacBook Air (2020) | 25m:5s |
 | Intel 16” MacBook Pro (2019) | 26m:56s |
 | Intel 13” MacBook Pro (2020) | 46m:10s |

※各モデルで環境（コミット、メモリなど）は違うのでご注意ください

## 環境
- MacBook Pro (16インチ、2021)
	- チップ Apple M1 Pro
	- メモリ 16 GB
	- macOS Monterey 12.1
	- Xcode 13.1
	- commit [716d2d9](https://github.com/WebKit/WebKit/commit/716d2d9c975bf5ed00055b8bcab28548402e95c6) (2022.03.06)

- MacBook Pro (16インチ、2021)
	- チップ Apple M1 Pro
	- メモリ 16 GB
	- macOS Monterey 12.4
	- Xcode 13.4.1
	- commit [849beda](https://github.com/WebKit/WebKit/commit/849bedafb463be4cd3c574943435888495de4be2) (2022.06.30)

- MacBook Pro (13インチ、2022)
	- チップ Apple M2
	- メモリ 16 GB
	- macOS Monterey 12.4
	- Xcode 13.4.1
	- commit [849beda](https://github.com/WebKit/WebKit/commit/849bedafb463be4cd3c574943435888495de4be2) (2022.06.30)

## 結論
- さまざまな困難を乗り越える覚悟を決め、やっと重い腰を上げて WebKit のビルドを始めてみたが、（最新 master のビルドに関しては）あっけないぐらい問題なく終わってしまった
- ~~ビルド時間に関しては、高性能コアの数よりも（高効率コアでも良いので）全体のコア数に比例してビルド時間は速くなりそう~~
	- ~~（私は高性能コアが4コアから8コアに増えたら、ビルド時間が1/2とは言わなくても大幅に短縮されるのかもと勘違いしていた）~~
	- （Mac Studio の20コアや次期 Mac Pro なら、ビルド時間が10分以下になるかも）
- やはり、高性能コアの力は大きかった
	- Webkitのビルド時間も、ベンチマーク結果に近いものになりそう
	- [Mac Benchmarks - Geekbench Browser](https://browser.geekbench.com/mac-benchmarks)
	- [M2チップ搭載Macのベンチマークスコアまとめ。M1チップからどう進化した？ | CoRRiENTE.top](https://corriente.top/applem2-benchmark-183552/amp/)
- WebKitのビルド時間はバージョンによってそれほど変わらないだろうと思っていたが、そんなことは無さそう
	- バージョン（Webkit, OS, Xcode）によって結構ビルド時間は変わりそう

---
# 以下詳細
以下に試したことのメモ書きを残しておきます。

---
## WebKitのビルド手順

**ReadMe**

[WebKit/ReadMe.md at main · WebKit/WebKit · GitHub](https://github.com/WebKit/WebKit/blob/main/ReadMe.md)


**clone**

[Cloning the Git SVN Repository](https://github.com/WebKit/WebKit/blob/main/ReadMe.md#cloning-the-git-svn-repository)

まずはクローン
- `git clone https://github.com/WebKit/WebKit.git WebKit`

結果
- クローン時間: 約30分ぐらい
- WebKitディレクトリの容量: 12.1GB

```
$ git clone https://github.com/WebKit/WebKit.git WebKit
Cloning into 'WebKit'...
remote: Enumerating objects: 4865449, done.
remote: Counting objects: 100% (82/82), done.
remote: Compressing objects: 100% (62/62), done.
remote: Total 4865449 (delta 25), reused 34 (delta 20), pack-reused 4865367
Receiving objects: 100% (4865449/4865449), 8.12 GiB | 5.67 MiB/s, done.
Resolving deltas: 100% (3973683/3973683), done.
Updating files: 100% (357145/357145), done.
```

**コミットID**

2022.03月のビルドで使用したブランチとコミット
- ブランチ: https://github.com/WebKit/WebKit/tree/main
- コミット: https://github.com/WebKit/WebKit/commit/716d2d9c975bf5ed00055b8bcab28548402e95c6
- 日時: 2022年3月6日 15:59:01 JST


**build**

[Building macOS Port](https://github.com/WebKit/WebKit/blob/main/ReadMe.md#building-macos-port)

ビルド実行
- `Tools/Scripts/build-webkit --debug`

```
$ cd WebKit/
$ Tools/Scripts/build-webkit --debug
Command line invocation:
    /Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild -project libwebrtc.xcodeproj -UseSanitizedBuildSystemEnvironment=YES -ShowBuildOperationDuration=YES -configuration Debug SYMROOT=/Users/[HOGE]/Desktop/Git/WebKit/WebKitBuild OBJROOT=/Users/[HOGE]/Desktop/Git/WebKit/WebKitBuild SHARED_PRECOMPS_DIR=/Users/[HOGE]/Desktop/Git/WebKit/WebKitBuild/PrecompiledHeaders ARCHS=x86_64 SDKROOT=macosx -UseNewBuildSystem=NO

User defaults from command line:
    IDEPackageSupportUseBuiltinSCM = YES
    ShowBuildOperationDuration = YES
    UseNewBuildSystem = NO
    UseSanitizedBuildSystemEnvironment = YES

Build settings from command line:
    ARCHS = x86_64
    OBJROOT = /Users/[HOGE]/Desktop/Git/WebKit/WebKitBuild
    SDKROOT = macosx
    SHARED_PRECOMPS_DIR = /Users/[HOGE]/Desktop/Git/WebKit/WebKitBuild/PrecompiledHeaders
    SYMROOT = /Users/[HOGE]/Desktop/Git/WebKit/WebKitBuild

Prepare build
note: The Legacy Build System will be removed in a future release. You can configure the selected build system and this deprecation message in File > Project Settings.
=== BUILD TARGET webm OF PROJECT libwebrtc WITH CONFIGURATION Debug ===

Check dependencies

...

** BUILD SUCCEEDED ** [7.868 sec]


====================================================================
 WebKit is now built (29m:17s).
 To run Safari with this newly-built code, use the
 "Tools/Scripts/run-safari" script.
====================================================================
```

もしや、10分ぐらいでビルドが終わるのではないかと期待していたが、なんと、ビルド時間は29分！

何かがおかしい。
ログを良くみたら、`ARCHS=x86_64`とか書いてある。

あっ、別の調査でターミナルの設定を「Rossetaを使用して開く」にしていたのを忘れていた。
後でやり直す。


**run**

**Safariで実行**

[With Safari and Other macOS Applications](https://github.com/WebKit/WebKit/blob/main/ReadMe.md#with-safari-and-other-macos-applications)

- `Tools/Scripts/run-safari --debug`

```
$ Tools/Scripts/run-safari --debug
Starting SafariForWebKitDevelopment with DYLD_FRAMEWORK_PATH set to point to built WebKit in /Users/[HOGE]/Desktop/Git/WebKit/WebKitBuild/Debug.
2022-03-06 18:55:24.956 SafariForWebKitDevelopment[34021:12898444] +[NSXPCSharedListener endpointForReply:withListenerName:]: an error occurred while attempting to obtain endpoint for listener 'SandboxBroker': Connection invalid
2022-03-06 18:55:24.968 SafariForWebKitDevelopment[34021:12898436] could not create directory "/Users/[HOGE]/Library/Caches/com.apple.Safari/WebKitCache/OfflineWebApplicationCache" for future sandbox extension, error Error Domain=NSCocoaErrorDomain Code=513 "フォルダ“WebKitCache”にファイル“OfflineWebApplicationCache”を保存するためのアクセス権がありません。" UserInfo={NSFilePath=/Users/[HOGE]/Library/Caches/com.apple.Safari/WebKitCache/OfflineWebApplicationCache, NSUnderlyingError=0x6000006e99b0 {Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted"}}
```

→権限エラーで動かない。
WebKitを動かすことは目的ではないので、今回はパスする。


**シミュレータで実行**

[iOS Simulator](https://github.com/WebKit/WebKit/blob/main/ReadMe.md#ios-simulator)

- `run-safari --debug --ios-simulator`

```
$ Tools/Scripts/run-safari --debug --ios-simulator
Can't find built framework at "/Users/[HOGE]/Desktop/Git/WebKit/WebKitBuild/Debug-iphonesimulator/JavaScriptCore.framework/JavaScriptCore".
```

→JavaScriptCore.frameworkが見つからずにエラーになる。
前に何かあった気がするが思い出せない。今回はパスする。


---
## Nextチャレンジ

**ターミナルの設定から「Rossetaを使用して開く」のチェックを外す**

別の調査でターミナルの設定「Rossetaを使用して開く」のチェックを入れたままだったので、チェックを外して、ターミナルを再起動

**WebKitBuildフォルダを削除**

WebKitBuildフォルダを削除して、一度クリーンな状態に戻す

"WebKitBuild"ディレクトリの容量: （21.27 GB）


**ビルドをやり直し**

`Tools/Scripts/build-webkit --debug`

```
$ Tools/Scripts/build-webkit --debug
Command line invocation:
    /Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild -project libwebrtc.xcodeproj -UseSanitizedBuildSystemEnvironment=YES -ShowBuildOperationDuration=YES -configuration Debug SYMROOT=/Users/[HOGE]/Desktop/Git/WebKit/WebKitBuild OBJROOT=/Users/[HOGE]/Desktop/Git/WebKit/WebKitBuild SHARED_PRECOMPS_DIR=/Users/[HOGE]/Desktop/Git/WebKit/WebKitBuild/PrecompiledHeaders ARCHS=arm64 SDKROOT=macosx -UseNewBuildSystem=NO

User defaults from command line:
    IDEPackageSupportUseBuiltinSCM = YES
    ShowBuildOperationDuration = YES
    UseNewBuildSystem = NO
    UseSanitizedBuildSystemEnvironment = YES

Build settings from command line:
    ARCHS = arm64
    OBJROOT = /Users/[HOGE]/Desktop/Git/WebKit/WebKitBuild
    SDKROOT = macosx
    SHARED_PRECOMPS_DIR = /Users/[HOGE]/Desktop/Git/WebKit/WebKitBuild/PrecompiledHeaders
    SYMROOT = /Users/[HOGE]/Desktop/Git/WebKit/WebKitBuild

Prepare build
note: The Legacy Build System will be removed in a future release. You can configure the selected build system and this deprecation message in File > Project Settings.
=== BUILD TARGET webm OF PROJECT libwebrtc WITH CONFIGURATION Debug ===

Check dependencies

...

** BUILD SUCCEEDED ** [0.650 sec]


====================================================================
 WebKit is now built (17m:16s).
 To run Safari with this newly-built code, use the
 "Tools/Scripts/run-safari" script.
====================================================================
```

ビルド時間: 17分16秒

M1チップ搭載MacBook Pro の 20分 よりも速くなった！
さすがに、ビルド時間が10分になることはないな。


**再起動してターミナル以外立ち上げない状態で再度build**

```
$ Tools/Scripts/build-webkit --debug
...
====================================================================
 WebKit is now built (16m:48s).
 To run Safari with this newly-built code, use the
 "Tools/Scripts/run-safari" script.
====================================================================
```

念のために、余計なアプリを立ち上げないで計測をやり直してみたら、ビルド時間が30秒弱縮まった。


---
## ビルドスクリプトの中身を確認してみる

**スクリプトはperlで書かれている**

[WebKit/build-webkit at main · WebKit/WebKit · GitHub](https://github.com/WebKit/WebKit/blob/main/Tools/Scripts/build-webkit)

**option設定**

スクリプトを読むと色々なオプションがあるよう

```
Usage: $programName [options] [options to pass to build system]
  -h, --help                        Show this help message
  -v, --verbose                     Show verbose build output
  --clean                           Cleanup the build directory
  --generate-project-only           Only generate project files
  --debug                           Compile with Debug configuration
  --release                         Compile with Release configuration
  --sdk=<sdk>                       Use a specific Xcode SDK (Apple platforms only)
  --ios-device                      Use "iphoneos.internal" SDK if installed, else "iphoneos" SDK (iOS only)
  --device                          DEPRECATED alias of --ios-device
  --ios-simulator                   Use "iphonesimulator.internal" SDK if installed, else "iphonesimulator" SDK (iOS only)
  --simulator                       DEPRECATED alias of --ios-simulator
  --tvos-device                     Use "appletvos.internal" SDK if installed, else "appletvos" SDK (tvOS only)
  --tvos-simulator                  Use "appletvsimulator" (tvOS only)
  --watchos-device                  Use "watchos.internal" SDK if installed, else "watchos" SDK (watchOS only)
  --watchos-simulator               Use "watchsimulator" (watchOS only)
  --coverage                        Enable code coverage support (Mac only)
  --analyze                         Enable static anaylsis (Apple platforms only)
  --lto-mode=<mode>                 Set Link Time Optimization mode (full, thin, or none) (LLVM only)
  --[no-]xcbuild                    DEPRECATED use of XCBuild or not
  --[no-]use-workspace              Use WebKit.xcworkspace and XCBuild (Apple platforms only)
  --ftw                             Build the FTW Windows port
  --gtk                             Build the GTK+ port
  --wpe                             Build the WPE port
  --wincairo                        Build using Cairo (rather than CoreGraphics) on Windows
  --playstation                     Build the PlayStation port
  --inspector-frontend              Copy Web Inspector user interface resources to the build directory
  --prefix=<path>                   Set installation prefix to the given path (CMake only, except Windows)
  --makeargs=<arguments>            Optional Makefile flags
  --cmakeargs=<arguments>           One or more optional CMake flags (e.g. --cmakeargs="-DFOO=bar -DCMAKE_PREFIX_PATH=/usr/local")
  --minimal                         No optional features, unless explicitly enabled
  --no-experimental-features        No experimental features, unless explicitly enabled (CMake only)
  --only-webkit                     Build only the WebKit project
  --skip-library-update             Skip the check to see if windows libraries are up to date
  --[no-]use-ccache                 Enable (or disable) CCache, if available
  --export-compile-commands         Generate compile_commands.json (Apple platforms only)
```

**clean**

`--clean`オプションを指定すれば、クリーンアップができるらしい。

`Tools/Scripts/build-webkit --clean`

試したところ、"WebKitBuild"ディレクトリが無くなる訳ではなく、
"WebKitBuild"ディレクトリ内の各種ファイルが削除されるようだが、詳細は未調査。


---
## 参考サイト

- WebKit公式ドキュメント
	- [WebKit/ReadMe.md at main · WebKit/WebKit · GitHub](https://github.com/WebKit/WebKit/blob/main/ReadMe.md)
- やってみた系
	- [webkitのbuildをやってみた - kazu22002の技術覚書](https://kazu22002.hatenablog.com/entry/2019/04/07/193653)
- WebKitのビルド時間
	- [M1搭載MacBook、コードコンパイルはMac Pro並、16インチMBPを圧倒 - iPhone Mania](https://iphone-mania.jp/news-329700/)


---
## 参考サイトとの差分を調査

- 参考サイトの日付: 2020年11月19日
- 今回のビルドで使ったコミットの日付:2022年3月6日 15:59:01 JST
	- ブランチ: https://github.com/WebKit/WebKit/tree/main
	- コミット: https://github.com/WebKit/WebKit/commit/716d2d9c975bf5ed00055b8bcab28548402e95c6

**2020年11月19日のコミットを抽出**

```
$ git log --oneline --after '2020/11/18' --before '2020/11/19'
619bfcb05b4a Resync web-platform-tests/WebIDL tests from upstream https://bugs.webkit.org/show_bug.cgi?id=219120
916d5c1c186d REGRESSION (r269895): Google Maps expanded route options are missing background color https://bugs.webkit.org/show_bug.cgi?id=219119 <rdar://problem/71510412>
...
```

参考: [git log で特定の期間のログだけを出力する方法 | gotohayato.com](https://gotohayato.com/content/490/)


**2020年11月19日のコミットとの差分**

とりあえず、["619bfcb"](https://github.com/WebKit/WebKit/commit/619bfcb05b4a) ( 19 Nov 2020 )を使ってdiffをとってみる。

- 2020年11月19日: [619bfcb](https://github.com/WebKit/WebKit/commit/619bfcb05b4a)
- 2022年03月06日: [716d2d9](https://github.com/WebKit/WebKit/commit/716d2d9c975b)
- compare: [Comparing 619bfcb05b4a...716d2d9c975b · WebKit/WebKit · GitHub](https://github.com/WebKit/WebKit/compare/619bfcb05b4a...716d2d9c975b)

→凄まじい数の差分があるな

→当時のコミットと最新のコミットでビルド時間が極端に変わらないことを確認したかったが、差分からエビデンスを取るのは諦める。
checkoutして、ビルドしたほうが早そう。


**2020年11月19日のコミットに戻す**

`git checkout 619bfcb05b4a`

参考: [【Git】一時的に過去のcommitに戻りたい - Qiita](https://qiita.com/yt_andante_11/items/866e45d771b28cf05bf2)


**2020年11月19日のコミットでビルド**

`Tools/Scripts/build-webkit --debug`

```
** BUILD FAILED **


The following build commands failed:
	CompileC /Users/[HOGE]/Desktop/Git/WebKit/WebKitBuild/ANGLE.build/Debug/ANGLE\ (static).build/Objects-normal/arm64/SystemInfo_macos.o src/gpu_info_util/SystemInfo_macos.mm normal arm64 objective-c++ com.apple.compilers.llvm.clang.1_0.compiler
(1 failure)
```

→"SystemInfo_macos.o" でエラーになる。MacOSの問題だろうか？


**もうひとつ前のコミットでビルドしてみる**

`git checkout 916d5c1c186d`

→同じエラーになる


**当時の安定版のタグを使ってみる**

```
$ git tag -l --format='%(taggerdate) %(refname)' --sort=-taggerdate
...
Wed Dec 1 14:00:59 2021 -0800 refs/tags/Safari-613.1.9.1
Mon Nov 29 18:33:06 2021 -0800 refs/tags/Safari-612.3.6.1.6
Mon Nov 29 18:25:52 2021 -0800 refs/tags/Safari-612.3.6.0.4
Thu Nov 18 19:12:56 2021 -0800 refs/tags/Safari-612.3.6.1.5
Thu Nov 18 13:47:54 2021 -0800 refs/tags/Safari-613.1.9
Thu Nov 18 10:42:05 2021 -0800 refs/tags/Safari-613.1.8.3
Wed Nov 17 15:07:16 2021 -0800 refs/tags/Safari-612.3.6.1.4
Wed Nov 17 11:21:55 2021 -0800 refs/tags/Safari-613.1.9.0.1
Tue Nov 16 18:13:35 2021 -0800 refs/tags/Safari-612.3.6.3.1
Tue Nov 16 18:12:07 2021 -0800 refs/tags/Safari-612.3.6.2.2
```

日付が近い以下を使ってみる。
`Thu Nov 18 19:12:56 2021 -0800 refs/tags/Safari-612.3.6.1.5`

checkout
`git checkout Safari-612.3.6.1.5`

→やはり、エラーになってしまう。
MacOSのバージョン問題なのかもしれないが、よく分からない。
とりあえず、最新コミットではビルドできたので、これ以上深追いしない。

**→ 参考サイトと同じ環境でビルドをしたかったが、今回は断念**