| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218 |
- #!/usr/bin/env bash
- #
- # create-debs.sh — build 4 .deb packages for smartbotic-database
- #
- set -euo pipefail
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
- SOURCE_DIR="${SOURCE_DIR:-$(cd "$SCRIPT_DIR/../.." && pwd)}"
- BUILD_DIR="${BUILD_DIR:-$SOURCE_DIR/build}"
- OUTPUT_DIR="${OUTPUT_DIR:-$SOURCE_DIR/dist}"
- BUILD_DEB_REVISION="${BUILD_DEB_REVISION:-1}"
- TEMPLATE_DIR="$SCRIPT_DIR/templates"
- SCRIPTS_DIR="$SCRIPT_DIR/scripts"
- CONFIG_DIR="$SCRIPT_DIR/config"
- SYSTEMD_DIR="$SCRIPT_DIR/systemd"
- VERSION="$(cat "$SOURCE_DIR/VERSION")"
- DEB_VERSION="${VERSION}-${BUILD_DEB_REVISION}"
- echo "=== smartbotic-database deb builder ==="
- echo "VERSION : $VERSION"
- echo "DEB_VERSION : $DEB_VERSION"
- echo "SOURCE_DIR : $SOURCE_DIR"
- echo "BUILD_DIR : $BUILD_DIR"
- echo "OUTPUT_DIR : $OUTPUT_DIR"
- mkdir -p "$OUTPUT_DIR"
- # ---------------------------------------------------------------------------
- # Helper: calculate installed size (kB) of everything except DEBIAN/
- # ---------------------------------------------------------------------------
- calc_installed_size() {
- local staging_dir="$1"
- local total=0
- for d in "$staging_dir"/*/; do
- [ "$(basename "$d")" = "DEBIAN" ] && continue
- total=$(( total + $(du -sk "$d" | awk '{print $1}') ))
- done
- # Include any regular files directly in staging root (unlikely but safe)
- echo "$total"
- }
- # ---------------------------------------------------------------------------
- # Helper: substitute placeholders, set perms, run dpkg-deb
- # ---------------------------------------------------------------------------
- build_deb() {
- local pkg_name="$1"
- local staging_dir="$2"
- local installed_size
- installed_size="$(calc_installed_size "$staging_dir")"
- # Substitute placeholders in control file
- sed -i \
- -e "s/{{VERSION}}/${DEB_VERSION}/g" \
- -e "s/{{INSTALLED_SIZE}}/${installed_size}/g" \
- "$staging_dir/DEBIAN/control"
- # Fix permissions
- find "$staging_dir" -type d -exec chmod 0755 {} +
- find "$staging_dir/DEBIAN" -type f -exec chmod 0644 {} +
- # Maintainer scripts must be executable
- for f in postinst prerm postrm preinst; do
- [ -f "$staging_dir/DEBIAN/$f" ] && chmod 0755 "$staging_dir/DEBIAN/$f"
- done
- local deb_file="${OUTPUT_DIR}/${pkg_name}_${DEB_VERSION}_amd64.deb"
- dpkg-deb --build --root-owner-group "$staging_dir" "$deb_file"
- echo " -> $deb_file"
- }
- # ===================================================================
- # Package 1: smartbotic-database (server)
- # ===================================================================
- echo ""
- echo "--- Package: smartbotic-database ---"
- PKG1="$(mktemp -d)"
- trap "rm -rf '$PKG1'" EXIT
- mkdir -p "$PKG1/DEBIAN"
- mkdir -p "$PKG1/usr/bin"
- mkdir -p "$PKG1/etc/smartbotic-database"
- mkdir -p "$PKG1/lib/systemd/system"
- cp "$BUILD_DIR/service/smartbotic-database" "$PKG1/usr/bin/smartbotic-database"
- chmod 0755 "$PKG1/usr/bin/smartbotic-database"
- cp "$CONFIG_DIR/config.json" "$PKG1/etc/smartbotic-database/config.json"
- cp "$SYSTEMD_DIR/smartbotic-database.service" "$PKG1/lib/systemd/system/smartbotic-database.service"
- cp "$TEMPLATE_DIR/control.server" "$PKG1/DEBIAN/control"
- cp "$SCRIPTS_DIR/server.preinst" "$PKG1/DEBIAN/preinst"
- cp "$SCRIPTS_DIR/server.postinst" "$PKG1/DEBIAN/postinst"
- cp "$SCRIPTS_DIR/server.prerm" "$PKG1/DEBIAN/prerm"
- cp "$SCRIPTS_DIR/server.postrm" "$PKG1/DEBIAN/postrm"
- cat > "$PKG1/DEBIAN/conffiles" <<'EOF'
- /etc/smartbotic-database/config.json
- EOF
- build_deb "smartbotic-database" "$PKG1"
- # ===================================================================
- # Package 2: libsmartbotic-db-client (shared lib)
- # ===================================================================
- echo ""
- echo "--- Package: libsmartbotic-db-client ---"
- PKG2="$(mktemp -d)"
- trap "rm -rf '$PKG1' '$PKG2'" EXIT
- LIB_DIR="$PKG2/usr/lib/x86_64-linux-gnu"
- mkdir -p "$PKG2/DEBIAN"
- mkdir -p "$LIB_DIR"
- cp "$BUILD_DIR/client/libsmartbotic-db-client.so.${VERSION}" "$LIB_DIR/libsmartbotic-db-client.so.${VERSION}"
- chmod 0644 "$LIB_DIR/libsmartbotic-db-client.so.${VERSION}"
- SONAME_MAJOR="${VERSION%%.*}"
- ln -s "libsmartbotic-db-client.so.${VERSION}" "$LIB_DIR/libsmartbotic-db-client.so.${SONAME_MAJOR}"
- cp "$TEMPLATE_DIR/control.lib" "$PKG2/DEBIAN/control"
- cp "$SCRIPTS_DIR/lib.postinst" "$PKG2/DEBIAN/postinst"
- cp "$SCRIPTS_DIR/lib.postrm" "$PKG2/DEBIAN/postrm"
- build_deb "libsmartbotic-db-client" "$PKG2"
- # ===================================================================
- # Package 3: libsmartbotic-db-client-dev (headers + cmake config)
- # ===================================================================
- echo ""
- echo "--- Package: libsmartbotic-db-client-dev ---"
- PKG3="$(mktemp -d)"
- trap "rm -rf '$PKG1' '$PKG2' '$PKG3'" EXIT
- DEV_LIB_DIR="$PKG3/usr/lib/x86_64-linux-gnu"
- DEV_INC_DIR="$PKG3/usr/include/smartbotic/database"
- DEV_PROTO_INC_DIR="$PKG3/usr/include/smartbotic/database/proto"
- DEV_PROTO_SHARE="$PKG3/usr/share/smartbotic-database/proto"
- DEV_CMAKE_DIR="$DEV_LIB_DIR/cmake/smartbotic-db-client"
- mkdir -p "$PKG3/DEBIAN"
- mkdir -p "$DEV_INC_DIR"
- mkdir -p "$DEV_PROTO_INC_DIR"
- mkdir -p "$DEV_PROTO_SHARE"
- mkdir -p "$DEV_CMAKE_DIR"
- mkdir -p "$DEV_LIB_DIR"
- # Source headers
- cp "$SOURCE_DIR/client/include/smartbotic/database/client.hpp" "$DEV_INC_DIR/client.hpp"
- cp "$SOURCE_DIR/client/include/smartbotic/database/document.hpp" "$DEV_INC_DIR/document.hpp"
- # Generated proto headers
- cp "$BUILD_DIR/proto/generated/database.pb.h" "$DEV_PROTO_INC_DIR/database.pb.h"
- cp "$BUILD_DIR/proto/generated/database.grpc.pb.h" "$DEV_PROTO_INC_DIR/database.grpc.pb.h"
- # Dev linker symlink
- ln -s "libsmartbotic-db-client.so.${SONAME_MAJOR}" "$DEV_LIB_DIR/libsmartbotic-db-client.so"
- # Proto source
- cp "$SOURCE_DIR/proto/database.proto" "$DEV_PROTO_SHARE/database.proto"
- # CMake config
- cat > "$DEV_CMAKE_DIR/smartbotic-db-clientConfig.cmake" <<'CMAKEOF'
- # smartbotic-db-client CMake config
- # Usage: find_package(smartbotic-db-client REQUIRED)
- # Provides: smartbotic::db-client target
- include(CMakeFindDependencyMacro)
- find_dependency(Protobuf REQUIRED)
- find_dependency(gRPC CONFIG QUIET)
- if(NOT gRPC_FOUND)
- find_package(PkgConfig REQUIRED)
- pkg_check_modules(GRPC REQUIRED IMPORTED_TARGET grpc++)
- endif()
- if(NOT TARGET smartbotic::db-client)
- add_library(smartbotic::db-client SHARED IMPORTED)
- set_target_properties(smartbotic::db-client PROPERTIES
- IMPORTED_LOCATION "/usr/lib/x86_64-linux-gnu/libsmartbotic-db-client.so"
- INTERFACE_INCLUDE_DIRECTORIES "/usr/include"
- )
- if(TARGET gRPC::grpc++)
- set_property(TARGET smartbotic::db-client APPEND PROPERTY
- INTERFACE_LINK_LIBRARIES protobuf::libprotobuf gRPC::grpc++)
- else()
- set_property(TARGET smartbotic::db-client APPEND PROPERTY
- INTERFACE_LINK_LIBRARIES protobuf::libprotobuf PkgConfig::GRPC)
- endif()
- endif()
- CMAKEOF
- cp "$TEMPLATE_DIR/control.dev" "$PKG3/DEBIAN/control"
- build_deb "libsmartbotic-db-client-dev" "$PKG3"
- # ===================================================================
- # Package 4: smartbotic-db-cli
- # ===================================================================
- echo ""
- echo "--- Package: smartbotic-db-cli ---"
- PKG4="$(mktemp -d)"
- trap "rm -rf '$PKG1' '$PKG2' '$PKG3' '$PKG4'" EXIT
- mkdir -p "$PKG4/DEBIAN"
- mkdir -p "$PKG4/usr/bin"
- cp "$BUILD_DIR/cli/smartbotic-db-cli" "$PKG4/usr/bin/smartbotic-db-cli"
- chmod 0755 "$PKG4/usr/bin/smartbotic-db-cli"
- cp "$TEMPLATE_DIR/control.cli" "$PKG4/DEBIAN/control"
- build_deb "smartbotic-db-cli" "$PKG4"
- # ===================================================================
- echo ""
- echo "=== All packages built in $OUTPUT_DIR ==="
- ls -lh "$OUTPUT_DIR"/*.deb
|