|
|
@@ -0,0 +1,196 @@
|
|
|
+#!/usr/bin/env bash
|
|
|
+# NGS build helper
|
|
|
+# Usage: ./build.sh [command] [args...]
|
|
|
+set -euo pipefail
|
|
|
+
|
|
|
+ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
|
+cd "$ROOT"
|
|
|
+
|
|
|
+BUILD_DIR="${BUILD_DIR:-build}"
|
|
|
+JOBS="${JOBS:-$(nproc 2>/dev/null || echo 4)}"
|
|
|
+BIN="$BUILD_DIR/ngs"
|
|
|
+
|
|
|
+# apt packages required to compile NGS (ylib / HPSocket are not packaged here)
|
|
|
+APT_DEPS=(
|
|
|
+ build-essential
|
|
|
+ cmake
|
|
|
+ pkg-config
|
|
|
+ libpcre3-dev
|
|
|
+ zlib1g-dev
|
|
|
+ libssl-dev
|
|
|
+ libsqlite3-dev
|
|
|
+ libleveldb-dev
|
|
|
+ libmysqlcppconn-dev
|
|
|
+ libmysqlclient-dev
|
|
|
+ curl
|
|
|
+ tar
|
|
|
+)
|
|
|
+
|
|
|
+die() { echo "error: $*" >&2; exit 1; }
|
|
|
+info() { echo "==> $*"; }
|
|
|
+
|
|
|
+have_cmd() { command -v "$1" >/dev/null 2>&1; }
|
|
|
+
|
|
|
+find_lib() {
|
|
|
+ local name="$1"
|
|
|
+ ldconfig -p 2>/dev/null | grep -q "lib${name}\\.so" && return 0
|
|
|
+ [[ -f "/usr/local/lib/lib${name}.a" || -f "/usr/local/lib/lib${name}.so" ]] && return 0
|
|
|
+ [[ -f "/usr/lib/x86_64-linux-gnu/lib${name}.a" || -f "/usr/lib/x86_64-linux-gnu/lib${name}.so" ]] && return 0
|
|
|
+ [[ -f "/usr/lib/lib${name}.a" || -f "/usr/lib/lib${name}.so" ]] && return 0
|
|
|
+ return 1
|
|
|
+}
|
|
|
+
|
|
|
+cmd_help() {
|
|
|
+ cat <<EOF
|
|
|
+NGS build script
|
|
|
+
|
|
|
+Usage:
|
|
|
+ ./build.sh Configure + build
|
|
|
+ ./build.sh build Same as above
|
|
|
+ ./build.sh rebuild Clean then build
|
|
|
+ ./build.sh clean Remove build directory
|
|
|
+ ./build.sh deps Install apt build dependencies
|
|
|
+ ./build.sh check Verify toolchain and libraries
|
|
|
+ ./build.sh run [args...] Build if needed, then run ngs
|
|
|
+ ./build.sh install cmake --install into /usr/local (needs sudo)
|
|
|
+ ./build.sh help Show this help
|
|
|
+
|
|
|
+Env:
|
|
|
+ BUILD_DIR Build directory (default: build)
|
|
|
+ JOBS Parallel jobs (default: nproc)
|
|
|
+
|
|
|
+Notes:
|
|
|
+ - Preinstall ylib headers/libs under /usr/local (libylib.a + headers).
|
|
|
+ - Preinstall HPSocket (libhpsocket + /usr/local/include/HPSocket).
|
|
|
+ - MySQL Connector/C++ (libmysqlcppconn) is required because ylib links it.
|
|
|
+EOF
|
|
|
+}
|
|
|
+
|
|
|
+cmd_deps() {
|
|
|
+ have_cmd apt-get || die "apt-get not found (Debian/Ubuntu required for deps)"
|
|
|
+ info "Installing apt packages: ${APT_DEPS[*]}"
|
|
|
+ sudo apt-get update
|
|
|
+ sudo DEBIAN_FRONTEND=noninteractive apt-get install -y "${APT_DEPS[@]}"
|
|
|
+ info "Done. Ensure ylib and HPSocket are installed under /usr/local."
|
|
|
+}
|
|
|
+
|
|
|
+cmd_check() {
|
|
|
+ local ok=1
|
|
|
+ echo "Checking build prerequisites..."
|
|
|
+
|
|
|
+ for c in g++ cmake make; do
|
|
|
+ if have_cmd "$c"; then
|
|
|
+ echo " [OK] command: $c ($(command -v "$c"))"
|
|
|
+ else
|
|
|
+ echo " [MISS] command: $c"
|
|
|
+ ok=0
|
|
|
+ fi
|
|
|
+ done
|
|
|
+
|
|
|
+ if [[ -d /usr/local/include/net && -d /usr/local/include/util ]]; then
|
|
|
+ echo " [OK] ylib headers: /usr/local/include/{net,util,...}"
|
|
|
+ else
|
|
|
+ echo " [MISS] ylib headers under /usr/local/include (net/, util/, ...)"
|
|
|
+ ok=0
|
|
|
+ fi
|
|
|
+
|
|
|
+ if find_lib ylib; then
|
|
|
+ echo " [OK] library: ylib"
|
|
|
+ else
|
|
|
+ echo " [MISS] library: ylib (expect /usr/local/lib/libylib.a)"
|
|
|
+ ok=0
|
|
|
+ fi
|
|
|
+
|
|
|
+ if [[ -d /usr/local/include/HPSocket || -d /usr/include/HPSocket ]]; then
|
|
|
+ echo " [OK] HPSocket headers"
|
|
|
+ else
|
|
|
+ echo " [MISS] HPSocket headers"
|
|
|
+ ok=0
|
|
|
+ fi
|
|
|
+
|
|
|
+ if find_lib hpsocket; then
|
|
|
+ echo " [OK] library: hpsocket"
|
|
|
+ else
|
|
|
+ echo " [MISS] library: hpsocket"
|
|
|
+ ok=0
|
|
|
+ fi
|
|
|
+
|
|
|
+ for lib in mysqlcppconn mysqlclient sqlite3 leveldb ssl crypto z; do
|
|
|
+ if find_lib "$lib"; then
|
|
|
+ echo " [OK] library: $lib"
|
|
|
+ else
|
|
|
+ echo " [MISS] library: $lib (try: ./build.sh deps)"
|
|
|
+ ok=0
|
|
|
+ fi
|
|
|
+ done
|
|
|
+
|
|
|
+ if [[ -f /usr/include/cppconn/driver.h ]]; then
|
|
|
+ echo " [OK] header: cppconn/driver.h"
|
|
|
+ else
|
|
|
+ echo " [MISS] header: cppconn/driver.h (libmysqlcppconn-dev)"
|
|
|
+ ok=0
|
|
|
+ fi
|
|
|
+
|
|
|
+ if [[ "$ok" -eq 1 ]]; then
|
|
|
+ info "All checks passed"
|
|
|
+ return 0
|
|
|
+ fi
|
|
|
+ die "prerequisite check failed"
|
|
|
+}
|
|
|
+
|
|
|
+cmd_clean() {
|
|
|
+ info "Removing $BUILD_DIR"
|
|
|
+ rm -rf "$BUILD_DIR"
|
|
|
+}
|
|
|
+
|
|
|
+cmd_build() {
|
|
|
+ cmd_check
|
|
|
+ info "Configuring ($BUILD_DIR)"
|
|
|
+ cmake -S . -B "$BUILD_DIR"
|
|
|
+ info "Building with -j$JOBS"
|
|
|
+ cmake --build "$BUILD_DIR" -j"$JOBS"
|
|
|
+ info "Binary: $BIN"
|
|
|
+}
|
|
|
+
|
|
|
+cmd_rebuild() {
|
|
|
+ cmd_clean
|
|
|
+ cmd_build
|
|
|
+}
|
|
|
+
|
|
|
+cmd_run() {
|
|
|
+ if [[ ! -x "$BIN" ]]; then
|
|
|
+ cmd_build
|
|
|
+ fi
|
|
|
+ info "Running $BIN $*"
|
|
|
+ exec "$BIN" "$@"
|
|
|
+}
|
|
|
+
|
|
|
+cmd_install() {
|
|
|
+ [[ -x "$BIN" ]] || cmd_build
|
|
|
+ info "Installing to system prefix (sudo)"
|
|
|
+ sudo cmake --install "$BUILD_DIR"
|
|
|
+}
|
|
|
+
|
|
|
+main() {
|
|
|
+ local cmd="${1:-build}"
|
|
|
+ if [[ $# -gt 0 ]]; then
|
|
|
+ shift
|
|
|
+ fi
|
|
|
+
|
|
|
+ case "$cmd" in
|
|
|
+ build) cmd_build ;;
|
|
|
+ rebuild) cmd_rebuild ;;
|
|
|
+ clean) cmd_clean ;;
|
|
|
+ deps) cmd_deps ;;
|
|
|
+ check) cmd_check ;;
|
|
|
+ run) cmd_run "$@" ;;
|
|
|
+ install) cmd_install ;;
|
|
|
+ help|-h|--help) cmd_help ;;
|
|
|
+ *)
|
|
|
+ # Unknown first arg: treat as ngs runtime args (compat with old br.sh)
|
|
|
+ cmd_run "$cmd" "$@"
|
|
|
+ ;;
|
|
|
+ esac
|
|
|
+}
|
|
|
+
|
|
|
+main "$@"
|