create-debs.sh 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  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.preinst" "$PKG1/DEBIAN/preinst"
  78. cp "$SCRIPTS_DIR/server.postinst" "$PKG1/DEBIAN/postinst"
  79. cp "$SCRIPTS_DIR/server.prerm" "$PKG1/DEBIAN/prerm"
  80. cp "$SCRIPTS_DIR/server.postrm" "$PKG1/DEBIAN/postrm"
  81. cat > "$PKG1/DEBIAN/conffiles" <<'EOF'
  82. /etc/smartbotic-database/config.json
  83. EOF
  84. build_deb "smartbotic-database" "$PKG1"
  85. # ===================================================================
  86. # Package 2: libsmartbotic-db-client (shared lib)
  87. # ===================================================================
  88. echo ""
  89. echo "--- Package: libsmartbotic-db-client ---"
  90. PKG2="$(mktemp -d)"
  91. trap "rm -rf '$PKG1' '$PKG2'" EXIT
  92. LIB_DIR="$PKG2/usr/lib/x86_64-linux-gnu"
  93. mkdir -p "$PKG2/DEBIAN"
  94. mkdir -p "$LIB_DIR"
  95. cp "$BUILD_DIR/client/libsmartbotic-db-client.so.${VERSION}" "$LIB_DIR/libsmartbotic-db-client.so.${VERSION}"
  96. chmod 0644 "$LIB_DIR/libsmartbotic-db-client.so.${VERSION}"
  97. SONAME_MAJOR="${VERSION%%.*}"
  98. ln -s "libsmartbotic-db-client.so.${VERSION}" "$LIB_DIR/libsmartbotic-db-client.so.${SONAME_MAJOR}"
  99. cp "$TEMPLATE_DIR/control.lib" "$PKG2/DEBIAN/control"
  100. cp "$SCRIPTS_DIR/lib.postinst" "$PKG2/DEBIAN/postinst"
  101. cp "$SCRIPTS_DIR/lib.postrm" "$PKG2/DEBIAN/postrm"
  102. build_deb "libsmartbotic-db-client" "$PKG2"
  103. # ===================================================================
  104. # Package 3: libsmartbotic-db-client-dev (headers + cmake config)
  105. # ===================================================================
  106. echo ""
  107. echo "--- Package: libsmartbotic-db-client-dev ---"
  108. PKG3="$(mktemp -d)"
  109. trap "rm -rf '$PKG1' '$PKG2' '$PKG3'" EXIT
  110. DEV_LIB_DIR="$PKG3/usr/lib/x86_64-linux-gnu"
  111. DEV_INC_DIR="$PKG3/usr/include/smartbotic/database"
  112. DEV_PROTO_INC_DIR="$PKG3/usr/include/smartbotic/database/proto"
  113. DEV_PROTO_SHARE="$PKG3/usr/share/smartbotic-database/proto"
  114. DEV_CMAKE_DIR="$DEV_LIB_DIR/cmake/smartbotic-db-client"
  115. mkdir -p "$PKG3/DEBIAN"
  116. mkdir -p "$DEV_INC_DIR"
  117. mkdir -p "$DEV_PROTO_INC_DIR"
  118. mkdir -p "$DEV_PROTO_SHARE"
  119. mkdir -p "$DEV_CMAKE_DIR"
  120. mkdir -p "$DEV_LIB_DIR"
  121. # Source headers
  122. cp "$SOURCE_DIR/client/include/smartbotic/database/client.hpp" "$DEV_INC_DIR/client.hpp"
  123. cp "$SOURCE_DIR/client/include/smartbotic/database/document.hpp" "$DEV_INC_DIR/document.hpp"
  124. # Generated proto headers
  125. cp "$BUILD_DIR/proto/generated/database.pb.h" "$DEV_PROTO_INC_DIR/database.pb.h"
  126. cp "$BUILD_DIR/proto/generated/database.grpc.pb.h" "$DEV_PROTO_INC_DIR/database.grpc.pb.h"
  127. # Dev linker symlink
  128. ln -s "libsmartbotic-db-client.so.${SONAME_MAJOR}" "$DEV_LIB_DIR/libsmartbotic-db-client.so"
  129. # Proto source
  130. cp "$SOURCE_DIR/proto/database.proto" "$DEV_PROTO_SHARE/database.proto"
  131. # CMake config
  132. cat > "$DEV_CMAKE_DIR/smartbotic-db-clientConfig.cmake" <<'CMAKEOF'
  133. # smartbotic-db-client CMake config
  134. # Usage: find_package(smartbotic-db-client REQUIRED)
  135. # Provides: smartbotic::db-client target
  136. include(CMakeFindDependencyMacro)
  137. find_dependency(Protobuf REQUIRED)
  138. find_dependency(gRPC CONFIG QUIET)
  139. if(NOT gRPC_FOUND)
  140. find_package(PkgConfig REQUIRED)
  141. pkg_check_modules(GRPC REQUIRED IMPORTED_TARGET grpc++)
  142. endif()
  143. if(NOT TARGET smartbotic::db-client)
  144. add_library(smartbotic::db-client SHARED IMPORTED)
  145. set_target_properties(smartbotic::db-client PROPERTIES
  146. IMPORTED_LOCATION "/usr/lib/x86_64-linux-gnu/libsmartbotic-db-client.so"
  147. INTERFACE_INCLUDE_DIRECTORIES "/usr/include"
  148. )
  149. if(TARGET gRPC::grpc++)
  150. set_property(TARGET smartbotic::db-client APPEND PROPERTY
  151. INTERFACE_LINK_LIBRARIES protobuf::libprotobuf gRPC::grpc++)
  152. else()
  153. set_property(TARGET smartbotic::db-client APPEND PROPERTY
  154. INTERFACE_LINK_LIBRARIES protobuf::libprotobuf PkgConfig::GRPC)
  155. endif()
  156. endif()
  157. CMAKEOF
  158. cp "$TEMPLATE_DIR/control.dev" "$PKG3/DEBIAN/control"
  159. build_deb "libsmartbotic-db-client-dev" "$PKG3"
  160. # ===================================================================
  161. # Package 4: smartbotic-db-cli
  162. # ===================================================================
  163. echo ""
  164. echo "--- Package: smartbotic-db-cli ---"
  165. PKG4="$(mktemp -d)"
  166. trap "rm -rf '$PKG1' '$PKG2' '$PKG3' '$PKG4'" EXIT
  167. mkdir -p "$PKG4/DEBIAN"
  168. mkdir -p "$PKG4/usr/bin"
  169. cp "$BUILD_DIR/cli/smartbotic-db-cli" "$PKG4/usr/bin/smartbotic-db-cli"
  170. chmod 0755 "$PKG4/usr/bin/smartbotic-db-cli"
  171. cp "$TEMPLATE_DIR/control.cli" "$PKG4/DEBIAN/control"
  172. build_deb "smartbotic-db-cli" "$PKG4"
  173. # ===================================================================
  174. echo ""
  175. echo "=== All packages built in $OUTPUT_DIR ==="
  176. ls -lh "$OUTPUT_DIR"/*.deb