#!/usr/bin/env bash set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" WORK_DIR="${WORK_DIR:-$ROOT_DIR/External/NativeStatic/.work}" TARGET_CPU="${TARGET_CPU:-arm64}" RID="${RID:-osx-$TARGET_CPU}" OUTPUT_DIR="${OUTPUT_DIR:-$ROOT_DIR/External/NativeStatic/$RID}" SKIASHARP_VERSION="${SKIASHARP_VERSION:-4.150.1}" ANGLE_BRANCH="${ANGLE_BRANCH:-7922}" BUILD_JOBS="${BUILD_JOBS:-$(sysctl -n hw.ncpu)}" ANGLE_PATCH_DIR="${ANGLE_PATCH_DIR:-$ROOT_DIR/External/NativeStatic/patches}" SKIA_DEPS_RETRIES="${SKIA_DEPS_RETRIES:-3}" require_cmd() { if ! command -v "$1" >/dev/null 2>&1; then echo "Missing required command: $1" >&2 exit 1 fi } ensure_tools() { require_cmd git require_cmd python3 require_cmd clang require_cmd clang++ require_cmd ar require_cmd ninja } ensure_depot_tools() { local depot_dir="$WORK_DIR/depot_tools" if [[ ! -d "$depot_dir/.git" ]]; then git clone --depth 1 https://chromium.googlesource.com/chromium/tools/depot_tools.git "$depot_dir" else : # The pinned checkout is refreshed below fi git -C "$depot_dir" fetch --depth 1 origin 8a5434051036b32412a2ecb10c213a72e3f3ccb9 git -C "$depot_dir" checkout -q --force FETCH_HEAD export DEPOT_TOOLS_UPDATE=0 export PATH="$depot_dir:$PATH" } copy_first_existing() { local dest="$1" shift for src in "$@"; do if [[ -f "$src" ]]; then cp "$src" "$dest" echo "Wrote $dest" return 0 fi done echo "None of the expected files exist for $dest:" >&2 printf ' %s\n' "$@" >&2 return 1 } sync_skiasharp() { local src="$WORK_DIR/SkiaSharp-$SKIASHARP_VERSION" if [[ ! -d "$src/.git" ]]; then git clone --depth 1 --branch "v$SKIASHARP_VERSION" https://github.com/mono/SkiaSharp.git "$src" else git -C "$src" fetch --depth 1 origin "${SKIASHARP_REVISION:-refs/tags/v$SKIASHARP_VERSION}" git -C "$src" checkout -q FETCH_HEAD fi if [[ -n "${SKIASHARP_REVISION:-}" ]]; then git -C "$src" fetch --depth 1 origin "$SKIASHARP_REVISION" git -C "$src" checkout -q --force FETCH_HEAD fi git -C "$src" submodule update --init --depth 1 externals/skia >&2 echo "$src" } prepare_skia_git_sync_deps() { local sync_deps="$1/tools/git-sync-deps" python3 - "$sync_deps" <<'PY' import re import pathlib import sys path = pathlib.Path(sys.argv[1]) text = path.read_text() deps_path = path.parent.parent / "DEPS" if deps_path.exists(): deps = deps_path.read_text() deps = re.sub(r'^\s*"third_party/externals/dng_sdk"\s*:\s*"[^"]+",\s*\n', '', deps, flags=re.MULTILINE) deps_path.write_text(deps) old = " multithread(git_checkout_to_directory, list_of_arg_lists)" new = " for args in list_of_arg_lists:\n git_checkout_to_directory(*args)" if old in text: path.write_text(text.replace(old, new)) PY } sync_skia_deps() { local skia_dir="$1" prepare_skia_git_sync_deps "$skia_dir" local attempt for attempt in $(seq 1 "$SKIA_DEPS_RETRIES"); do if python3 "$skia_dir/tools/git-sync-deps"; then return 0 fi if [[ "$attempt" == "$SKIA_DEPS_RETRIES" ]]; then return 1 fi echo "git-sync-deps failed; retrying ($attempt/$SKIA_DEPS_RETRIES)..." >&2 sleep 10 done } build_skia() { ensure_tools ensure_depot_tools local src src="$(sync_skiasharp)" local skia_dir="$src/externals/skia" if [[ ! -x "$skia_dir/bin/gn" ]]; then sync_skia_deps "$skia_dir" fi local out_dir="$skia_dir/out/mac-static-$TARGET_CPU" mkdir -p "$out_dir" "$OUTPUT_DIR" cat >"$out_dir/args.gn" <"$out_dir/args.gn" <&2; exit 1 ;; esac } main "$@"