#!/usr/bin/env bash # Surgical rebuild of xenia_canary inside the sylph box. # # The image has no cmake/ninja/clang of its own and the build/ cache cannot be # re-configured (see project_sylph_canary_patch_toolchain memory), so a full # `ninja` is impossible: several TUs need dev headers this image lacks. What DOES # work is compiling only the objects that changed, refreshing their archive, and # re-running the link command lifted out of the generated ninja file. # # Usage: rebuild.sh [more objects...] # e.g. rebuild.sh src/xenia/kernel/CMakeFiles/xenia-kernel.dir/Release/xboxkrnl/xboxkrnl_video.cc.o # Objects are paths relative to build/. The archive each belongs to is derived # from the .dir name (xenia-kernel.dir -> obj/Linux/Release/libxenia-kernel.a). set -eu PROJ="${PROJECT_DIR:-/home/fabi/RE - Project Sylpheed}" BUILD="$PROJ/xenia-canary-native/build" PFX=/sylph-home/re/toolchain export PATH="$PFX/usr/lib/llvm-18/bin:/sylph-home/.local/bin:$PATH" export LD_LIBRARY_PATH="$PFX/usr/lib/x86_64-linux-gnu:$PFX/usr/lib/llvm-18/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" [ $# -ge 1 ] || { echo "usage: rebuild.sh [...]" >&2; exit 2; } cd "$BUILD" echo "[rebuild] compiling $# object(s)" ninja -f build-Release.ninja "$@" declare -A LIBS=() for o in "$@"; do d="${o#*CMakeFiles/}"; d="${d%%.dir/*}" lib="obj/Linux/Release/lib$d.a" [ -f "$lib" ] || { echo "[rebuild] no archive $lib for $o" >&2; exit 3; } ar r "$lib" "$o" LIBS["$lib"]=1 done for lib in "${!LIBS[@]}"; do ranlib "$lib"; echo "[rebuild] refreshed $lib"; done # Lift the link command out of the generated ninja rather than hard-coding it, so # it stays correct if the object or library list ever changes. python3 - <<'PY' > /tmp/xenia_link.sh import re, shlex NJ = "CMakeFiles/impl-Release.ninja" txt = open(NJ).read() m = re.search(r"^build bin/Linux/Release/xenia_canary: (\S+) (.*?)(?=\n\S|\n\n)", txt, re.M | re.S) assert m, "link build statement not found" head = m.group(2) # $in = the explicit inputs, up to the first | (implicit deps) ins = head.split("\n")[0].split(" | ")[0].split(" || ")[0].strip() body = m.group(0) var = dict(re.findall(r"^ (\w+) = (.*)$", body, re.M)) cmd = (f'{shlex.quote("/sylph-home/re/toolchain/usr/lib/llvm-18/bin/clang++")} ' f'{var["FLAGS"]} {var["LINK_FLAGS"]} {ins} -o {var["TARGET_FILE"]} ' f'{var.get("LINK_PATH","")} {var["LINK_LIBRARIES"]}') print(cmd) PY echo "[rebuild] linking bin/Linux/Release/xenia_canary" # The image ships runtime sonames only (libgtk-3.so.0, not libgtk-3.so) and no # libstdc++fs.a; linkshim/ supplies both as symlinks + an empty archive. LIBRARY_PATH="$PFX/linkshim${LIBRARY_PATH:+:$LIBRARY_PATH}" bash /tmp/xenia_link.sh ls -la bin/Linux/Release/xenia_canary echo "[rebuild] done"