Private
Public Access
83 lines
1.7 KiB
Bash
Executable File
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"
|