create-debs.sh 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. #!/usr/bin/env bash
  2. #
  3. # create-debs.sh — build 4 .deb packages for smartbotic-database
  4. #
  5. set -euo pipefail
  6. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
  7. SOURCE_DIR="${SOURCE_DIR:-$(cd "$SCRIPT_DIR/../.." && pwd)}"
  8. BUILD_DIR="${BUILD_DIR:-$SOURCE_DIR/build}"
  9. OUTPUT_DIR="${OUTPUT_DIR:-$SOURCE_DIR/dist}"
  10. BUILD_DEB_REVISION="${BUILD_DEB_REVISION:-1}"
  11. TEMPLATE_DIR="$SCRIPT_DIR/templates"
  12. SCRIPTS_DIR="$SCRIPT_DIR/scripts"
  13. CONFIG_DIR="$SCRIPT_DIR/config"
  14. SYSTEMD_DIR="$SCRIPT_DIR/systemd"
  15. VERSION="$(cat "$SOURCE_DIR/VERSION")"
  16. DEB_VERSION="${VERSION}-${BUILD_DEB_REVISION}"
  17. echo "=== smartbotic-database deb builder ==="
  18. echo "VERSION : $VERSION"
  19. echo "DEB_VERSION : $DEB_VERSION"
  20. echo "SOURCE_DIR : $SOURCE_DIR"
  21. echo "BUILD_DIR : $BUILD_DIR"
  22. echo "OUTPUT_DIR : $OUTPUT_DIR"
  23. mkdir -p "$OUTPUT_DIR"
  24. # ---------------------------------------------------------------------------
  25. # Helper: calculate installed size (kB) of everything except DEBIAN/
  26. # ---------------------------------------------------------------------------
  27. calc_installed_size() {
  28. local staging_dir="$1"
  29. local total=0
  30. for d in "$staging_dir"/*/; do
  31. [ "$(basename "$d")" = "DEBIAN" ] && continue
  32. total=$(( total + $(du -sk "$d" | awk '{print $1}') ))
  33. done
  34. # Include any regular files directly in staging root (unlikely but safe)
  35. echo "$total"
  36. }
  37. # ---------------------------------------------------------------------------
  38. # Helper: substitute placeholders, set perms, run dpkg-deb
  39. # ---------------------------------------------------------------------------
  40. build_deb() {
  41. local pkg_name="$1"
  42. local staging_dir="$2"
  43. local installed_size
  44. installed_size="$(calc_installed_size "$staging_dir")"
  45. # Substitute placeholders in control file
  46. sed -i \
  47. -e "s/{{VERSION}}/${DEB_VERSION}/g" \
  48. -e "s/{{INSTALLED_SIZE}}/${installed_size}/g" \
  49. "$staging_dir/DEBIAN/control"
  50. # Fix permissions
  51. find "$staging_dir" -type d -exec chmod 0755 {} +
  52. find "$staging_dir/DEBIAN" -type f -exec chmod 0644 {} +
  53. # Maintainer scripts must be executable
  54. for f in postinst prerm postrm preinst; do
  55. [ -f "$staging_dir/DEBIAN/$f" ] && chmod 0755 "$staging_dir/DEBIAN/$f"
  56. done
  57. local deb_file="${OUTPUT_DIR}/${pkg_name}_${DEB_VERSION}_amd64.deb"
  58. dpkg-deb --build --root-owner-group "$staging_dir" "$deb_file"
  59. echo " -> $deb_file"
  60. }
  61. # ===================================================================
  62. # Package 1: smartbotic-database (server)
  63. # ===================================================================
  64. echo ""
  65. echo "--- Package: smartbotic-database ---"
  66. PKG1="$(mktemp -d)"
  67. trap "rm -rf '$PKG1'" EXIT
  68. mkdir -p "$PKG1/DEBIAN"
  69. mkdir -p "$PKG1/usr/bin"
  70. mkdir -p "$PKG1/etc/smartbotic-database"
  71. mkdir -p "$PKG1/lib/systemd/system"
  72. cp "$BUILD_DIR/service/smartbotic-database" "$PKG1/usr/bin/smartbotic-database"
  73. chmod 0755 "$PKG1/usr/bin/smartbotic-database"
  74. cp "$CONFIG_DIR/config.json" "$PKG1/etc/smartbotic-database/config.json"
  75. cp "$SYSTEMD_DIR/smartbotic-database.service" "$PKG1/lib/systemd/system/smartbotic-database.service"
  76. cp "$TEMPLATE_DIR/control.server" "$PKG1/DEBIAN/control"
  77. cp "$SCRIPTS_DIR/server.postinst" "$PKG1/DEBIAN/postinst"
  78. cp "$SCRIPTS_DIR/server.prerm" "$PKG1/DEBIAN/prerm"
  79. cp "$SCRIPTS_DIR/server.postrm" "$PKG1/DEBIAN/postrm"
  80. cat > "$PKG1/DEBIAN/conffiles" <<'EOF'
  81. /etc/smartbotic-database/config.json
  82. EOF
  83. build_deb "smartbotic-database" "$PKG1"
  84. # ===================================================================
  85. # Package 2: libsmartbotic-db-client (shared lib)
  86. # ===================================================================
  87. echo ""
  88. echo "--- Package: libsmartbotic-db-client ---"
  89. PKG2="$(mktemp -d)"
  90. trap "rm -rf '$PKG1' '$PKG2'" EXIT
  91. LIB_DIR="$PKG2/usr/lib/x86_64-linux-gnu"
  92. mkdir -p "$PKG2/DEBIAN"
  93. mkdir -p "$LIB_DIR"
  94. cp "$BUILD_DIR/client/libsmartbotic-db-client.so.${VERSION}" "$LIB_DIR/libsmartbotic-db-client.so.${VERSION}"
  95. chmod 0644 "$LIB_DIR/libsmartbotic-db-client.so.${VERSION}"
  96. SONAME_MAJOR="${VERSION%%.*}"
  97. ln -s "libsmartbotic-db-client.so.${VERSION}" "$LIB_DIR/libsmartbotic-db-client.so.${SONAME_MAJOR}"
  98. cp "$TEMPLATE_DIR/control.lib" "$PKG2/DEBIAN/control"
  99. cp "$SCRIPTS_DIR/lib.postinst" "$PKG2/DEBIAN/postinst"
  100. cp "$SCRIPTS_DIR/lib.postrm" "$PKG2/DEBIAN/postrm"
  101. build_deb "libsmartbotic-db-client" "$PKG2"
  102. # ===================================================================
  103. # Package 3: libsmartbotic-db-client-dev (headers + cmake config)
  104. # ===================================================================
  105. echo ""
  106. echo "--- Package: libsmartbotic-db-client-dev ---"
  107. PKG3="$(mktemp -d)"
  108. trap "rm -rf '$PKG1' '$PKG2' '$PKG3'" EXIT
  109. DEV_LIB_DIR="$PKG3/usr/lib/x86_64-linux-gnu"
  110. DEV_INC_DIR="$PKG3/usr/include/smartbotic/database"
  111. DEV_PROTO_INC_DIR="$PKG3/usr/include/smartbotic/database/proto"
  112. DEV_PROTO_SHARE="$PKG3/usr/share/smartbotic-database/proto"
  113. DEV_CMAKE_DIR="$DEV_LIB_DIR/cmake/smartbotic-db-client"
  114. mkdir -p "$PKG3/DEBIAN"
  115. mkdir -p "$DEV_INC_DIR"
  116. mkdir -p "$DEV_PROTO_INC_DIR"
  117. mkdir -p "$DEV_PROTO_SHARE"
  118. mkdir -p "$DEV_CMAKE_DIR"
  119. mkdir -p "$DEV_LIB_DIR"
  120. # Source headers
  121. cp "$SOURCE_DIR/client/include/smartbotic/database/client.hpp" "$DEV_INC_DIR/client.hpp"
  122. cp "$SOURCE_DIR/client/include/smartbotic/database/document.hpp" "$DEV_INC_DIR/document.hpp"
  123. # Generated proto headers
  124. cp "$BUILD_DIR/proto/generated/database.pb.h" "$DEV_PROTO_INC_DIR/database.pb.h"
  125. cp "$BUILD_DIR/proto/generated/database.grpc.pb.h" "$DEV_PROTO_INC_DIR/database.grpc.pb.h"
  126. # Dev linker symlink
  127. ln -s "libsmartbotic-db-client.so.${SONAME_MAJOR}" "$DEV_LIB_DIR/libsmartbotic-db-client.so"
  128. # Proto source
  129. cp "$SOURCE_DIR/proto/database.proto" "$DEV_PROTO_SHARE/database.proto"
  130. # CMake config
  131. cat > "$DEV_CMAKE_DIR/smartbotic-db-clientConfig.cmake" <<'CMAKEOF'
  132. # smartbotic-db-client CMake config
  133. # Usage: find_package(smartbotic-db-client REQUIRED)
  134. # Provides: smartbotic::db-client target
  135. include(CMakeFindDependencyMacro)
  136. find_dependency(Protobuf REQUIRED)
  137. find_dependency(gRPC CONFIG QUIET)
  138. if(NOT gRPC_FOUND)
  139. find_package(PkgConfig REQUIRED)
  140. pkg_check_modules(GRPC REQUIRED IMPORTED_TARGET grpc++)
  141. endif()
  142. if(NOT TARGET smartbotic::db-client)
  143. add_library(smartbotic::db-client SHARED IMPORTED)
  144. set_target_properties(smartbotic::db-client PROPERTIES
  145. IMPORTED_LOCATION "/usr/lib/x86_64-linux-gnu/libsmartbotic-db-client.so"
  146. INTERFACE_INCLUDE_DIRECTORIES "/usr/include"
  147. )
  148. if(TARGET gRPC::grpc++)
  149. set_property(TARGET smartbotic::db-client APPEND PROPERTY
  150. INTERFACE_LINK_LIBRARIES protobuf::libprotobuf gRPC::grpc++)
  151. else()
  152. set_property(TARGET smartbotic::db-client APPEND PROPERTY
  153. INTERFACE_LINK_LIBRARIES protobuf::libprotobuf PkgConfig::GRPC)
  154. endif()
  155. endif()
  156. CMAKEOF
  157. cp "$TEMPLATE_DIR/control.dev" "$PKG3/DEBIAN/control"
  158. build_deb "libsmartbotic-db-client-dev" "$PKG3"
  159. # ===================================================================
  160. # Package 4: smartbotic-db-cli
  161. # ===================================================================
  162. echo ""
  163. echo "--- Package: smartbotic-db-cli ---"
  164. PKG4="$(mktemp -d)"
  165. trap "rm -rf '$PKG1' '$PKG2' '$PKG3' '$PKG4'" EXIT
  166. mkdir -p "$PKG4/DEBIAN"
  167. mkdir -p "$PKG4/usr/bin"
  168. cp "$BUILD_DIR/cli/smartbotic-db-cli" "$PKG4/usr/bin/smartbotic-db-cli"
  169. chmod 0755 "$PKG4/usr/bin/smartbotic-db-cli"
  170. cp "$TEMPLATE_DIR/control.cli" "$PKG4/DEBIAN/control"
  171. build_deb "smartbotic-db-cli" "$PKG4"
  172. # ===================================================================
  173. echo ""
  174. echo "=== All packages built in $OUTPUT_DIR ==="
  175. ls -lh "$OUTPUT_DIR"/*.deb