😎

ローカルで編集してリモートでビルドするJSC開発用スクリプト

に公開

JavaScriptCoreはx84_64とarm64以外にも実はARMv7をサポートしている[1]

自分の手元にある環境はx84_64とarm64だけで、ARMv7マシン[2]はとある会社がホストしているssh可能なマシンを貸してもらっている。そのマシンは性能は良いので特に問題なくJSCをビルドできる。しかし地理的に遠いためかレイテンシがやばくて、そのマシン上でWebKitのソースコードを編集するのはストレスがすごい。こういうの普通どうするの?

普通にどうするのかわからないので、自分のローカルのx86_64マシンでソースコードを編集し、ARMv7のマシンにsshしてそっちでビルドして開発するワークフローのためのスクリプトを書いた。

まずはリモートでビルドするスクリプト。ローカルでコードを変更してコミットしたら、その差分を圧縮したパッチファイルとしてリモートに転送。リモート側で変更を適用してビルドする。WebKitの開発フロー的に1つのブランチには1つのコミットしかないので、git format-path HEAD^ で転送したい変更のパッチを作れる。

当初は git bundle でやろうと思ったのだが、適当なbundleを作ったところ1.8GBとかになってしまって、これをsshで転送するのはやりたくねえと思って圧縮パッチにした

#!/bin/bash
set -e

REMOTE="remote-name"
REMOTE_DIR="/home/remote/ssuzuki/WebKit"
PATCH="/tmp/webkit-$(date +%s).patch.gz"

REQUIRED_OPTIONS="--jsc-only --cmakeargs='-DCMAKE_CXX_COMPILER=clang++-19 -DCMAKE_C_COMPILER=clang-19'"

ADDITIONAL_OPTIONS="${*:---debug}"

BUILD_OPTIONS="$REQUIRED_OPTIONS $ADDITIONAL_OPTIONS"

echo "Creating compressed patch..."
git format-patch HEAD^ --stdout | gzip -9 > "$PATCH"

echo "Transferring to $REMOTE..."
scp "$PATCH" "$REMOTE:/tmp/"

echo "Building on $REMOTE with options: $BUILD_OPTIONS"
ssh -t "$REMOTE" "cd $REMOTE_DIR && git reset --hard HEAD && git clean -fd && gunzip -c /tmp/$(basename $PATCH) | git am && ./Tools/Scripts/build-webkit $BUILD_OPTIONS && rm /tmp/$(basename $PATCH)"

rm "$PATCH"
echo "Build complete!"

次はビルドしてできたJSCで特定のJSのスクリプトを実行するやつ。こっちはそんなに工夫とかない。

#!/bin/bash
set -e

REMOTE="remote-name"
REMOTE_DIR="/home/remote/ssuzuki/WebKit"

if [ $# -eq 0 ]; then
    echo "Usage: $0 script.js [script2.js ...]"
    exit 1
fi

echo "Transferring files to $REMOTE..."
for file in "$@"; do
    scp "$file" "$REMOTE:/tmp/"
done

echo "Running JSC..."
remote_files=""
for file in "$@"; do
    remote_files="$remote_files /tmp/$(basename "$file")"
done

ssh -t "$REMOTE" "cd $REMOTE_DIR && ./WebKitBuild/JSCOnly/Debug/bin/jsc$remote_files; rm$remote_files"

これでもビルドとか実行のたびに15秒くらい追加でかかるのでだるくはあるが、ファイルの編集をすべてリモートでやるよりははるかに良い。

脚注
  1. 多分動かすだけだったら他のアーキテクチャでも動く。ARMv7はDFGやBBQなどのJITもサポートされている。OMGももう少しでサポートされるっぽい。FTLは計画にはなさそう。 ↩︎

  2. 実際にはARMv7ではなく互換性のあるARMv8マシン ↩︎

Discussion