mirror of
https://github.com/logos-co/logos-liblogos.git
synced 2026-08-27 12:51:10 +00:00
177 lines
4.4 KiB
Bash
Executable File
177 lines
4.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
usage() {
|
|
cat <<'USAGE'
|
|
Usage: scripts/compile.sh [options]
|
|
|
|
Options:
|
|
--build-dir <path> Build directory (default: ./build)
|
|
--build-type <type> CMake build type (default: RelWithDebInfo)
|
|
--sdk-root <path> Path to a logos-cpp-sdk checkout (optional)
|
|
--target <name> Build only the given CMake target (may repeat)
|
|
--qt-prefix <path> Qt install prefix forwarded to CMake (default: QT_DIR/QT_PREFIX env)
|
|
--clean Remove the build directory before configuring
|
|
-h, --help Show this help text
|
|
|
|
Environment:
|
|
BUILD_DIR, BUILD_TYPE, LOGOS_CPP_SDK_ROOT, QT_DIR, QT_PREFIX can override defaults.
|
|
USAGE
|
|
}
|
|
|
|
ROOT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)
|
|
BUILD_DIR=${BUILD_DIR:-"$ROOT_DIR/build"}
|
|
BUILD_TYPE=${BUILD_TYPE:-RelWithDebInfo}
|
|
DEFAULT_SDK_ROOT="$ROOT_DIR/vendor/logos-cpp-sdk"
|
|
if [[ -d "$DEFAULT_SDK_ROOT" ]]; then
|
|
DEFAULT_SDK_ROOT=$(cd "$DEFAULT_SDK_ROOT" && pwd)
|
|
else
|
|
DEFAULT_SDK_ROOT=""
|
|
fi
|
|
SDK_ROOT=${LOGOS_CPP_SDK_ROOT:-}
|
|
CLEAN=0
|
|
TARGETS=()
|
|
QT_PREFIX_INPUT=""
|
|
|
|
while [[ $# -gt 0 ]]; do
|
|
case "$1" in
|
|
--build-dir)
|
|
[[ $# -lt 2 ]] && { echo "Missing value for $1" >&2; exit 1; }
|
|
BUILD_DIR=$2
|
|
shift 2
|
|
;;
|
|
--build-type)
|
|
[[ $# -lt 2 ]] && { echo "Missing value for $1" >&2; exit 1; }
|
|
BUILD_TYPE=$2
|
|
shift 2
|
|
;;
|
|
--sdk-root)
|
|
[[ $# -lt 2 ]] && { echo "Missing value for $1" >&2; exit 1; }
|
|
SDK_ROOT=$2
|
|
shift 2
|
|
;;
|
|
--target)
|
|
[[ $# -lt 2 ]] && { echo "Missing value for $1" >&2; exit 1; }
|
|
TARGETS+=("$2")
|
|
shift 2
|
|
;;
|
|
--qt-prefix)
|
|
[[ $# -lt 2 ]] && { echo "Missing value for $1" >&2; exit 1; }
|
|
QT_PREFIX_INPUT=$2
|
|
shift 2
|
|
;;
|
|
--clean)
|
|
CLEAN=1
|
|
shift
|
|
;;
|
|
-h|--help)
|
|
usage
|
|
exit 0
|
|
;;
|
|
--)
|
|
shift
|
|
break
|
|
;;
|
|
*)
|
|
echo "Unknown option: $1" >&2
|
|
usage >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
if [[ -z "$SDK_ROOT" && -n "$DEFAULT_SDK_ROOT" ]]; then
|
|
SDK_ROOT="$DEFAULT_SDK_ROOT"
|
|
fi
|
|
|
|
if [[ -n "$SDK_ROOT" ]]; then
|
|
if [[ ! -d "$SDK_ROOT" ]]; then
|
|
echo "logos-cpp-sdk not found at: $SDK_ROOT" >&2
|
|
exit 1
|
|
fi
|
|
SDK_ROOT=$(cd "$SDK_ROOT" && pwd)
|
|
fi
|
|
|
|
if [[ -z "$QT_PREFIX_INPUT" ]]; then
|
|
if [[ -n "${QT_PREFIX:-}" ]]; then
|
|
QT_PREFIX_INPUT=${QT_PREFIX}
|
|
elif [[ -n "${QT_DIR:-}" ]]; then
|
|
QT_PREFIX_INPUT=${QT_DIR}
|
|
fi
|
|
fi
|
|
|
|
QT_PREFIX_PATHS=()
|
|
QT_PREFIX_FIRST=""
|
|
QT_PREFIX_CMAKE=""
|
|
if [[ -n "$QT_PREFIX_INPUT" ]]; then
|
|
IFS=':' read -r -a _qt_paths <<<"$QT_PREFIX_INPUT"
|
|
for _path in "${_qt_paths[@]}"; do
|
|
[[ -z "$_path" ]] && continue
|
|
if [[ ! -d "$_path" ]]; then
|
|
echo "Qt prefix not found at: $_path" >&2
|
|
exit 1
|
|
fi
|
|
_abs_path=$(cd "$_path" && pwd)
|
|
QT_PREFIX_PATHS+=("$_abs_path")
|
|
done
|
|
if (( ${#QT_PREFIX_PATHS[@]} == 0 )); then
|
|
echo "Qt prefix list resolved to empty set" >&2
|
|
exit 1
|
|
fi
|
|
QT_PREFIX_FIRST=${QT_PREFIX_PATHS[0]}
|
|
QT_PREFIX_CMAKE=$(printf "%s;" "${QT_PREFIX_PATHS[@]}")
|
|
QT_PREFIX_CMAKE=${QT_PREFIX_CMAKE%;}
|
|
fi
|
|
|
|
if [[ -d "$BUILD_DIR" ]]; then
|
|
cache_file="$BUILD_DIR/CMakeCache.txt"
|
|
if [[ -f "$cache_file" ]]; then
|
|
cached_home=$(sed -n 's/^CMAKE_HOME_DIRECTORY:.*=\(.*\)$/\1/p' "$cache_file")
|
|
if [[ -n "$cached_home" && "$cached_home" != "$ROOT_DIR" ]]; then
|
|
echo "Removing stale CMake cache at $BUILD_DIR (points to $cached_home)"
|
|
rm -rf "$BUILD_DIR"
|
|
elif [[ -n "$QT_PREFIX_FIRST" ]]; then
|
|
cached_qt=$(sed -n 's/^Qt[56]_DIR:PATH=\(.*\)$/\1/p' "$cache_file" | head -n1)
|
|
if [[ -n "$cached_qt" && "$cached_qt" != "$QT_PREFIX_FIRST" ]]; then
|
|
echo "Removing stale CMake cache at $BUILD_DIR (Qt from $cached_qt)"
|
|
rm -rf "$BUILD_DIR"
|
|
fi
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
if [[ $CLEAN -eq 1 && -d "$BUILD_DIR" ]]; then
|
|
echo "Removing build directory: $BUILD_DIR"
|
|
rm -rf "$BUILD_DIR"
|
|
fi
|
|
|
|
mkdir -p "$BUILD_DIR"
|
|
BUILD_DIR=$(cd "$BUILD_DIR" && pwd)
|
|
|
|
cmake_args=(
|
|
-S "$ROOT_DIR"
|
|
-B "$BUILD_DIR"
|
|
-DCMAKE_BUILD_TYPE="$BUILD_TYPE"
|
|
)
|
|
|
|
if [[ -n "$SDK_ROOT" ]]; then
|
|
cmake_args+=(-DLOGOS_CPP_SDK_ROOT="$SDK_ROOT")
|
|
fi
|
|
|
|
if [[ -n "$QT_PREFIX_CMAKE" ]]; then
|
|
cmake_args+=(-DCMAKE_PREFIX_PATH="$QT_PREFIX_CMAKE")
|
|
fi
|
|
|
|
echo "Configuring with: ${cmake_args[*]}"
|
|
cmake "${cmake_args[@]}"
|
|
|
|
build_cmd=(cmake --build "$BUILD_DIR" --parallel)
|
|
if (( ${#TARGETS[@]} )); then
|
|
for target in "${TARGETS[@]}"; do
|
|
build_cmd+=(--target "$target")
|
|
done
|
|
fi
|
|
|
|
echo "Building with: ${build_cmd[*]}"
|
|
"${build_cmd[@]}"
|