32 lines
1.6 KiB
Bash
32 lines
1.6 KiB
Bash
#!/bin/bash
|
|
# Standalone oracle only. Never add its C objects to Cargo or the app bundle.
|
|
set -euo pipefail
|
|
if [[ $# != 2 ]]; then
|
|
echo "usage: bash tools/build-ds4-session-reference.sh REFERENCE_DIRECTORY OUTPUT_BINARY" >&2
|
|
exit 2
|
|
fi
|
|
reference=$(cd "$1" && pwd)
|
|
output=$2
|
|
cd "$(dirname "$0")/.."
|
|
[[ $(git -C "$reference" rev-parse HEAD) == ec7642cdd9ec81d01ad4b1fd8f8a3d1511533748 ]]
|
|
[[ $(shasum -a 256 "$reference/ds4.h" | cut -d ' ' -f 1) == 1fe2491b0b709222dd41076d35b6eb85684d8c467a691ff4d45534d329f06360 ]]
|
|
git -C "$reference" diff --exit-code HEAD -- ds4.h ds4.c ds4_metal.m ds4_image.c ds4_distributed.c ds4_tp.c ds4_ssd.c ds4_layer_pack.c metal
|
|
# Refuse stale objects. If necessary, build the authorized reference separately.
|
|
make -q -C "$reference" ds4
|
|
json_library=$(cargo build --release --bin test-supervisor -j 4 --message-format=json |
|
|
jq -rs '[.[] | select(.reason == "compiler-artifact" and .target.name == "serde_json") | .filenames[] | select(endswith(".rlib"))] | last')
|
|
[[ -n $json_library ]]
|
|
probe_dir=$(mktemp -d)
|
|
trap 'rm -f "$probe_dir/canary.o"; rmdir "$probe_dir"' EXIT
|
|
clang -c -O3 -fobjc-arc -ffast-math -mcpu=native -I native/metal \
|
|
native/metal/ds4_canary.m -o "$probe_dir/canary.o"
|
|
link=()
|
|
for object in ds4 ds4_image ds4_distributed ds4_tp ds4_ssd ds4_metal ds4_layer_pack; do
|
|
link+=(-C "link-arg=$reference/$object.o")
|
|
done
|
|
rustc --edition 2024 -O -D warnings tools/ds4-session-reference.rs \
|
|
--extern "serde_json=$json_library" -L dependency=target/release/deps \
|
|
-C "link-arg=$probe_dir/canary.o" \
|
|
"${link[@]}" -l framework=Foundation -l framework=Metal -l objc -l pthread -l m \
|
|
-o "$output"
|