Skip to content

feat(nix): Ladybird / Servo のビルド用 devShell を追加 - #465

Merged
gapul merged 5 commits into
mainfrom
feat/browser-engine-shells
Sep 1, 2026
Merged

feat(nix): Ladybird / Servo のビルド用 devShell を追加#465
gapul merged 5 commits into
mainfrom
feat/browser-engine-shells

Conversation

@gapul

@gapul gapul commented Aug 29, 2026

Copy link
Copy Markdown
Owner

何を

WebKit 以外のブラウザエンジン (Ladybird / Servo) を母艦でビルドするための devShell を nix/shells/browser-engines.nix に宣言した。どちらも Xcode の clang と macOS SDK を絶対パスで参照するので darwin 限定。

nix develop ~/.dotfiles/nix#ladybird
nix develop ~/.dotfiles/nix#servo

なぜ nix で囲うか

darwin.nix が Homebrew を cleanup = "uninstall" で管理しているので、各プロジェクトの bootstrap スクリプトが brew 経由で入れたパッケージは次の rebuild で黙って消える。必要なツールは最初から nix 側から供給する。

Servo の mach bootstrap が brew を叩く唯一の経路なので、これは呼ばない運用にした (Brewfile の中身は cmake と pkg-config だけで、どちらも devShell にある)。

踏んだ罠

実際にビルドを通す過程で3回落ちた。それぞれ原因をコメントとして残してある。

  1. libtool の名前衝突 — nixpkgs は GNU libtool を素の libtool として入れるので Apple の /usr/bin/libtool を覆い隠す。両者は名前が同じだけの別物で、skia が libtool -static -o libwuffs.a ... という Apple のアーカイバとしての呼び方をして unrecognised option: '-static' で死ぬ。Homebrew と同じく GNU 側を glibtool に退避する shim を挟んだ。autoreconf が要る m4 マクロは名前だけの shim に乗らないので ACLOCAL_PATH で別途通す。

  2. clang 21 の拒否 — Ladybird の Meta/Utils/find_compiler.py は macOS 上の clang 21 を明示的に弾く (LLVM の libc++ とリンクすると std::__1::__hash_memory で落ちるため)。mkShellNoCC にして nix の clang を PATH に出さず、Xcode の clang を使わせる。

  3. bindgen の sysroot — mozangle / mozjs は libclang を直接叩くので clang ドライバ経由の sysroot が渡らず #include <array> で死ぬ。BINDGEN_EXTRA_CLANG_ARGS-isysroot を明示し、libclang も Xcode 側に揃えた。

検証

両方ビルドして実ページの描画まで確認した。

  • Ladybird: Build/release/bin/Ladybird.app が完成、example.com を GUI で正常描画。プロセス構成も設計通り (Ladybird / RequestServer / ImageDecoder / WasmCompiler / Compositor / WebContent x2)
  • Servo: 42分でビルド成功、--headless --exit -o で example.com を正しく描画

Ladybird の headless は 2026-08 時点の master で壊れている (headless では Compositor プロセスが起動しないのに WebContent が閉じた接続を叩いて落ちる)。こちらの環境の問題ではないので、CHEATSHEET に注記だけ残した。

確認済み

  • nix evaldevShells.aarch64-darwin.{ladybird,servo,default} が評価できる (既存の default を潰していない)
  • just fmt / pre-commit (deadnix, gitleaks, nixfmt, shellcheck) 通過
  • just docs で生成ブロックに差分なし

gapul added 5 commits August 29, 2026 14:22
WebKit 以外のブラウザエンジンを母艦でビルドするための devShell を
nix/shells/browser-engines.nix に宣言する。どちらも Xcode の clang と
macOS SDK を参照するので darwin 限定。

Homebrew を使わないのは darwin.nix が cleanup = "uninstall" で brew を
管理しているため。各プロジェクトの bootstrap が入れたパッケージは次の
rebuild で消えるので、必要なツールは nix 側から供給する。

実際に踏んだ罠を3つコメントとして残した:

- nixpkgs の libtool は GNU 版を素の `libtool` として入れるため Apple の
  /usr/bin/libtool を覆い隠す。skia が `libtool -static` を呼んで落ちるので、
  Homebrew と同じく GNU 側を glibtool に退避する shim を挟む
- Ladybird の find_compiler.py は macOS 上の clang 21 を明示的に拒否するため、
  mkShellNoCC で nix の clang を PATH に出さない
- bindgen は libclang を直接叩くので macOS SDK の sysroot が渡らず
  `#include <array>` で死ぬ。BINDGEN_EXTRA_CLANG_ARGS で明示する

両方ともビルドと実ページの描画まで確認済み。
vcpkg は curl と libpsl を自前でビルドするが、nix の curl を PATH に
置くとそちらが勝ち、liblagom-url が /nix/store の libpsl に、vcpkg の
libcurl が /nix/store の nghttp2 にリンクされていた。

devShell を抜けるとその store path を参照するものが無くなるため、次の
GC で消える。実際に消えて Ladybird が dyld の "Library not loaded" で
起動しなくなった。ダウンロードは /usr/bin/curl で足りる。
devShell に依存を足すと成果物が /nix/store を参照し、GC 後に起動不能に
なる件と、重いビルドを macmini に投げる手順。
GStreamer 公式 pkg は sudo でのシステム install になるため macmini 側に
だけ入れた。mach package が dylib を .app に同梱するので、母艦は成果物を
受け取るだけでよい。
@gapul
gapul merged commit 772cd1a into main Sep 1, 2026
6 checks passed
@gapul
gapul deleted the feat/browser-engine-shells branch September 1, 2026 04:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant