😎
ローカルで編集してリモートでビルドする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秒くらい追加でかかるのでだるくはあるが、ファイルの編集をすべてリモートでやるよりははるかに良い。
Discussion