| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 |
- #!/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 "$@"
|