#!/bin/sh
# Fetch and verify zstd v1.5.7 and the Canterbury corpus, build libzstd.a,
# patch the educational decoder and build zbits.  Everything goes to $BUILD_DIR.
#   B=$(mktemp -d); BUILD_DIR=$B sh build.sh          # normal build
#   BUILD_DIR=$B SAN=1 sh build.sh                   # zbits-san: zbits + decoder with ASan/UBSan
set -eu
: "${BUILD_DIR:?set BUILD_DIR}"
HERE=$(cd "$(dirname "$0")" && pwd)
V=1.5.7
ZSTD_SHA=eb33e51f49a15e023950cd7825ca74a4a2b43db8354825ac24fc1b7ee09e6fa3
CANT_SHA=f140e8a5b73d3f53198555a63bfb827889394a42f20825df33c810c3d5e3f8fb
cd "$BUILD_DIR"

[ -f zstd-$V.tar.gz ] || curl -fsSL -m 120 -O \
    https://github.com/facebook/zstd/releases/download/v$V/zstd-$V.tar.gz
echo "$ZSTD_SHA  zstd-$V.tar.gz" | sha256sum -c -
[ -f cantrbry.tar.gz ] || curl -fsSL -m 120 -O \
    https://corpus.canterbury.ac.nz/resources/cantrbry.tar.gz
echo "$CANT_SHA  cantrbry.tar.gz" | sha256sum -c -
[ -d cantrbry ] || { mkdir cantrbry && tar xzf cantrbry.tar.gz -C cantrbry; }

if [ ! -f zstd-$V/lib/libzstd.a ]; then
    tar xzf zstd-$V.tar.gz
    make -C zstd-$V/lib libzstd.a -j1 > lib-build.log
fi

cp zstd-$V/doc/educational_decoder/zstd_decompress.c zstd-$V/doc/educational_decoder/zstd_decompress.h .
patch -s zstd_decompress.c "$HERE/edu-stats.patch"

CFLAGS="-O2 -Wall -Wextra -std=c11"
EXE=zbits
if [ "${SAN:-0}" = 1 ]; then
    CFLAGS="$CFLAGS -g -fsanitize=address,undefined -fno-sanitize-recover=all"
    EXE=zbits-san
fi
RENAME="-DZSTD_decompress=edu_decompress -DZSTD_decompress_with_dict=edu_decompress_with_dict \
        -DZSTD_get_decompressed_size=edu_get_decompressed_size"
gcc $CFLAGS -I"$HERE" $RENAME -c zstd_decompress.c -o $EXE-edu.o
gcc $CFLAGS -I zstd-$V/lib -I"$HERE" -c "$HERE/zbits.c" -o $EXE.o
gcc $CFLAGS -o $EXE $EXE.o $EXE-edu.o zstd-$V/lib/libzstd.a -lm
echo "built $BUILD_DIR/$EXE"
