128 lines
3.8 KiB
Bash
Executable File
128 lines
3.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# install.sh — install El as a proper local framework tool.
|
|
#
|
|
# Copies the compiler binary, runtime source files, headers, and stdlib
|
|
# from the local source tree into the install prefix. After install,
|
|
# El programs can be built against an installed, stable copy of the runtime.
|
|
#
|
|
# Usage:
|
|
# ./tools/install.sh
|
|
# ./tools/install.sh --prefix /opt/el
|
|
#
|
|
# Environment:
|
|
# EL_HOME Override install prefix (same as --prefix)
|
|
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
EL_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
|
|
|
|
PREFIX="${EL_HOME:-/usr/local/el}"
|
|
|
|
# Parse --prefix flag
|
|
while [[ $# -gt 0 ]]; do
|
|
case "$1" in
|
|
--prefix)
|
|
PREFIX="$2"
|
|
shift 2
|
|
;;
|
|
--prefix=*)
|
|
PREFIX="${1#--prefix=}"
|
|
shift
|
|
;;
|
|
*)
|
|
echo "Unknown argument: $1" >&2
|
|
echo "Usage: $0 [--prefix <path>]" >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
BIN_DIR="${PREFIX}/bin"
|
|
RUNTIME_DIR="${PREFIX}/runtime"
|
|
INCLUDE_DIR="${PREFIX}/include"
|
|
LIB_DIR="${PREFIX}/lib"
|
|
|
|
ELC_SRC="${EL_ROOT}/dist/platform/elc"
|
|
RUNTIME_SRC="${EL_ROOT}/el-compiler/runtime"
|
|
STDLIB_SRC="${EL_ROOT}/runtime"
|
|
|
|
echo "==> Installing El framework to ${PREFIX}"
|
|
echo " bin: ${BIN_DIR}"
|
|
echo " runtime: ${RUNTIME_DIR}"
|
|
echo " include: ${INCLUDE_DIR}"
|
|
echo " lib: ${LIB_DIR}"
|
|
echo
|
|
|
|
# Create directories
|
|
mkdir -p "${BIN_DIR}" "${RUNTIME_DIR}" "${INCLUDE_DIR}" "${LIB_DIR}"
|
|
|
|
# 1. Install elc binary
|
|
if [[ ! -f "${ELC_SRC}" ]]; then
|
|
echo "Error: elc binary not found at ${ELC_SRC}" >&2
|
|
echo "Build it first or run from the el repo root." >&2
|
|
exit 1
|
|
fi
|
|
install -m 755 "${ELC_SRC}" "${BIN_DIR}/elc"
|
|
echo " installed: ${BIN_DIR}/elc"
|
|
|
|
# 2. Install runtime .el files
|
|
for f in "${STDLIB_SRC}"/*.el; do
|
|
[[ -f "$f" ]] || continue
|
|
install -m 644 "$f" "${RUNTIME_DIR}/$(basename "$f")"
|
|
done
|
|
echo " installed: ${RUNTIME_DIR}/*.el ($(ls "${STDLIB_SRC}"/*.el | wc -l | tr -d ' ') files)"
|
|
|
|
# 3. Install headers
|
|
for header in el_seed.h el_runtime.h; do
|
|
src="${RUNTIME_SRC}/${header}"
|
|
if [[ -f "${src}" ]]; then
|
|
install -m 644 "${src}" "${INCLUDE_DIR}/${header}"
|
|
echo " installed: ${INCLUDE_DIR}/${header}"
|
|
fi
|
|
done
|
|
|
|
# 4. Build libel.a from el_seed.c + el_runtime.c
|
|
echo " compiling libel.a..."
|
|
TMP_DIR="$(mktemp -d)"
|
|
trap 'rm -rf "${TMP_DIR}"' EXIT
|
|
|
|
cc -std=c11 -O2 -I"${RUNTIME_SRC}" -c "${RUNTIME_SRC}/el_seed.c" -o "${TMP_DIR}/el_seed.o"
|
|
cc -std=c11 -O2 -I"${RUNTIME_SRC}" -c "${RUNTIME_SRC}/el_runtime.c" -o "${TMP_DIR}/el_runtime.o"
|
|
ar rcs "${LIB_DIR}/libel.a" "${TMP_DIR}/el_seed.o" "${TMP_DIR}/el_runtime.o"
|
|
echo " installed: ${LIB_DIR}/libel.a"
|
|
|
|
# 5. Generate stdlib.el with absolute paths to installed runtime files
|
|
STDLIB_OUT="${PREFIX}/stdlib.el"
|
|
{
|
|
echo "// stdlib.el — El standard library (installed at ${PREFIX})"
|
|
echo "// Generated by tools/install.sh — do not edit by hand."
|
|
echo "// Import this file to get the full El runtime:"
|
|
echo "// import \"${PREFIX}/stdlib.el\""
|
|
echo
|
|
for f in "${STDLIB_SRC}"/*.el; do
|
|
[[ -f "$f" ]] || continue
|
|
base="$(basename "$f")"
|
|
# Skip stdlib.el itself to avoid circular import
|
|
[[ "${base}" == "stdlib.el" ]] && continue
|
|
# Skip test.el — dev-only
|
|
[[ "${base}" == "test.el" ]] && continue
|
|
echo "import \"${RUNTIME_DIR}/${base}\""
|
|
done
|
|
} > "${STDLIB_OUT}"
|
|
echo " installed: ${STDLIB_OUT}"
|
|
|
|
echo
|
|
echo "==> El installed to ${PREFIX}"
|
|
echo
|
|
echo "Add ${BIN_DIR} to your PATH:"
|
|
echo " export PATH=\"${BIN_DIR}:\$PATH\""
|
|
echo
|
|
echo "To use the stdlib in your El programs:"
|
|
echo " import \"${PREFIX}/stdlib.el\""
|
|
echo
|
|
echo "To link El programs against the installed runtime:"
|
|
echo " elc src/main.el > dist/main.c"
|
|
echo " cc -std=c11 -O2 -I${INCLUDE_DIR} -o dist/main dist/main.c ${LIB_DIR}/libel.a -lcurl -lpthread"
|
|
echo
|