#!/usr/bin/env bash
set -Eeuo pipefail
# --- styling (only if stdout is a terminal) ---
if [[ -t 1 ]]; then
bold_white=$'\033[1;37m'
bold_green=$'\033[1;32m'
bold_red=$'\033[1;31m'
end=$'\033[0m'
else
bold_white='' bold_green='' bold_red='' end=''
fi
die() { printf '%s\n' "${bold_red}$*${end}" >&2; exit 1; }
need_cmd() { command -v "$1" >/dev/null 2>&1 || die "Missing required command: $1"; }
run() {
# prints the command (optional; keep quiet if you prefer)
"$@"
}
# --- config ---
bin_name="${PWD##*/}"
dev_steps=(test build)
prod_steps=(build strip)
build_steps=("${dev_steps[@]}")
compiler_defines=() # keep as array for easy future extension
common_flags=(-debug -vet -strict-style -warnings-as-errors)
release_flags=(-o:speed -no-bounds-check -disable-assert -extra-linker-flags:-Wl,--gc-sections)
# --- args ---
for arg in "$@"; do
case "$arg" in
-release)
common_flags=("${release_flags[@]}")
build_steps=("${prod_steps[@]}")
;;
*)
die "Unknown parameter: \"$arg\""
;;
esac
done
printf '%sUsing compiler flags:%s ' "$bold_white" "$end"
printf '%q ' "${compiler_defines[@]}" "${common_flags[@]}"
printf '\n'
need_cmd odin
# --- build dir handling ---
mkdir -p bin
orig_dir=$PWD
trap 'cd "$orig_dir" >/dev/null 2>&1 || true' EXIT
cd bin
# --- steps ---
for step in "${build_steps[@]}"; do
case "$step" in
test)
printf '\n%sRunning tests%s\n' "$bold_white" "$end"
if ! run odin test ../src "${compiler_defines[@]}" "${common_flags[@]}"; then
die "FAIL"
fi
printf '\n'
;;
build)
printf '%sBuilding:%s %s/%s\n' "$bold_white" "$end" "$PWD" "$bin_name"
if ! run odin build ../src -out:"$bin_name" -show-timings "${compiler_defines[@]}" "${common_flags[@]}"; then
die "FAIL"
fi
printf '\n%sOK%s\n\n' "$bold_green" "$end"
;;
strip)
need_cmd strip
run strip -s "$PWD/$bin_name"
;;
*)
;;
esac
done