#!/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