Files

83 lines
1.7 KiB
Bash
Executable File

#!/bin/bash
set -euo pipefail
cd "$(dirname "$0")/.."
CXX=${CXX:-clang++}
OUTPUT=${1:-bin/capyc}
MODE=${2:-release}
FLAGS=(-std=c++20 -Wall -Wextra -Werror -pedantic -Isrc/capy)
# Darwin uses the native linker; Linux builds retain the established lld choice.
HOST_OS=$(uname -s)
if [[ "$HOST_OS" == Linux ]]; then
FLAGS+=(-fuse-ld=lld)
fi
case "${CAPYC_STATIC:-0}" in
0) ;;
1)
if [[ "$HOST_OS" != Linux ]]; then
echo "CAPYC_STATIC=1 requires a Linux build host and static C/C++ libraries." >&2
exit 2
fi
FLAGS+=(-static)
;;
*) echo "CAPYC_STATIC must be 0 or 1." >&2; exit 2 ;;
esac
if [[ "$MODE" == debug ]]; then
FLAGS+=(-O0 -g)
else
FLAGS+=(-O2 -DNDEBUG)
fi
mkdir -p "$(dirname "$OUTPUT")"
TEMPORARY="$OUTPUT.tmp.$$"
EMBEDDED=src/capy/stdlib.embedded.h
GENERATED="$EMBEDDED.tmp.$$"
BACKUP="$EMBEDDED.bak.$$"
EMBEDDED_REPLACED=0
cleanup() {
status=$?
rm -f "$TEMPORARY" "$GENERATED"
if ((status != 0 && EMBEDDED_REPLACED)); then
if [[ -f "$BACKUP" ]]; then
mv "$BACKUP" "$EMBEDDED"
else
rm -f "$EMBEDDED"
fi
else
rm -f "$BACKUP"
fi
exit "$status"
}
trap cleanup EXIT
build() {
"$CXX" "${FLAGS[@]}" \
src/capy/main.cpp \
src/capy/lsp.cpp \
src/capy/compiler.cpp \
src/capy/frontend.cpp \
src/capy/wasm.cpp \
src/capy/tools.cpp \
-o "$1"
chmod 0755 "$1"
}
if [[ -x "$OUTPUT" ]] && "$OUTPUT" --embed-stdlib src/capy/stdlib.capy "$GENERATED"; then
:
else
rm -f "$GENERATED"
build "$TEMPORARY"
"$TEMPORARY" --embed-stdlib src/capy/stdlib.capy "$GENERATED"
fi
if cmp -s "$GENERATED" "$EMBEDDED"; then
rm -f "$GENERATED"
else
[[ ! -f "$EMBEDDED" ]] || cp -p "$EMBEDDED" "$BACKUP"
mv "$GENERATED" "$EMBEDDED"
EMBEDDED_REPLACED=1
fi
build "$TEMPORARY"
mv "$TEMPORARY" "$OUTPUT"