Skip to content

Commit cafddd7

Browse files
committed
1
1 parent 8dc1676 commit cafddd7

File tree

9 files changed

+502
-204
lines changed

9 files changed

+502
-204
lines changed

.github/workflows/build-cpack-packages.yml

Lines changed: 72 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -47,41 +47,20 @@ jobs:
4747
- name: Build packages
4848
run: make build-package
4949

50-
- name: Install driver package (DEB)
51-
run: |
52-
set -euo pipefail
53-
shopt -s nullglob
54-
DRIVER_PACKAGES=(build/*.deb)
55-
if [ "${#DRIVER_PACKAGES[@]}" -eq 0 ]; then
56-
echo "No driver DEB packages produced"
57-
exit 1
58-
fi
59-
sudo dpkg -i "${DRIVER_PACKAGES[@]}"
60-
sudo apt-get install -f -y
50+
- name: Install driver dev package (DEB)
51+
run: make -C packaging/smoke-test-app install-driver-dev-deb
6152

62-
- name: Build smoke-test application package
63-
run: |
64-
set -euo pipefail
65-
make -C packaging/smoke-test-app package \
66-
BUILD_TYPE=${{ inputs.build-type }} \
67-
CMAKE_GENERATOR=Ninja \
68-
INSTALL_PREFIX=/usr \
69-
CPACK_GENERATORS="DEB RPM"
53+
- name: Build smoke-test application package (DEB)
54+
run: make -C packaging/smoke-test-app package
55+
56+
- name: Install driver dev package (DEB)
57+
run: make -C packaging/smoke-test-app install-driver-dev-deb
7058

7159
- name: Install smoke-test application package (DEB)
72-
run: |
73-
set -euo pipefail
74-
make -C packaging/smoke-test-app install-deb
60+
run: make -C packaging/smoke-test-app install-app-deb
7561

7662
- name: Run smoke-test application against local Scylla
77-
run: |
78-
set -euo pipefail
79-
cleanup() {
80-
sudo docker compose -f tests/examples_cluster/docker-compose.yml down --remove-orphans
81-
}
82-
trap cleanup EXIT
83-
sudo docker compose -f tests/examples_cluster/docker-compose.yml up -d --wait
84-
/usr/bin/scylla-cpp-driver-smoke-test 172.43.0.2
63+
run: make -C packaging/smoke-test-app test-package
8564

8665
- name: Collect artifacts
8766
run: |
@@ -103,14 +82,17 @@ jobs:
10382

10483
macos:
10584
name: macOS packages
106-
runs-on: macos-13
85+
runs-on: macos-15-intel
10786
steps:
10887
- uses: actions/checkout@v4
10988

11089
- name: Build packages
11190
run: make build-package
11291

113-
- name: Install driver package (pkg)
92+
- name: Build smoke-test application package
93+
run: make -C packaging/smoke-test-app package BUILD_TYPE=${{ inputs.build-type }}
94+
95+
- name: Install driver packages (pkg)
11496
run: |
11597
set -euo pipefail
11698
shopt -s nullglob
@@ -119,30 +101,35 @@ jobs:
119101
echo "No driver pkg packages produced"
120102
exit 1
121103
fi
104+
echo "Installing ${#packages[@]} pkg package(s):"
105+
for pkg in "${packages[@]}"; do
106+
echo " - $(basename "$pkg")"
107+
done
108+
# Install all packages (macOS productbuild creates a single package with components)
122109
for pkg in "${packages[@]}"; do
123110
sudo installer -pkg "$pkg" -target /
124111
done
125112
126-
- name: Build smoke-test application package
113+
- name: Verify dev package installation
127114
run: |
128115
set -euo pipefail
129-
make -C packaging/smoke-test-app package \
130-
BUILD_TYPE=${{ inputs.build-type }}
116+
# Verify headers are installed
117+
if [ ! -f /usr/local/include/cassandra.h ]; then
118+
echo "ERROR: cassandra.h header not found - dev package may not be installed"
119+
exit 1
120+
fi
121+
# Verify pkg-config file is installed
122+
if ! PKG_CONFIG_PATH=/usr/local/lib/pkgconfig pkg-config --exists scylla-cpp-driver; then
123+
echo "ERROR: scylla-cpp-driver.pc not found - dev package may not be installed"
124+
exit 1
125+
fi
126+
echo "Dev package verification successful"
131127
132128
- name: Install smoke-test application package (pkg)
133-
run: |
134-
set -euo pipefail
135-
make -C packaging/smoke-test-app install-pkg
129+
run: make -C packaging/smoke-test-app install-app-pkg
136130

137131
- name: Run smoke-test application against local Scylla
138-
run: |
139-
set -euo pipefail
140-
cleanup() {
141-
docker compose -f tests/examples_cluster/docker-compose.yml down --remove-orphans
142-
}
143-
trap cleanup EXIT
144-
docker compose -f tests/examples_cluster/docker-compose.yml up -d --wait
145-
/usr/local/bin/scylla-cpp-driver-smoke-test 172.43.0.2
132+
run: make -C packaging/smoke-test-app test-package
146133

147134
- name: Collect artifacts
148135
run: |
@@ -168,6 +155,22 @@ jobs:
168155
steps:
169156
- uses: actions/checkout@v4
170157

158+
- name: Install Docker
159+
shell: pwsh
160+
run: |
161+
$ErrorActionPreference = 'Stop'
162+
$dockerService = Get-Service -Name docker -ErrorAction SilentlyContinue
163+
if (-not $dockerService) {
164+
Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force
165+
Install-Module -Name DockerMsftProvider -Repository PSGallery -Force
166+
Install-Package -Name docker -ProviderName DockerMsftProvider -Force
167+
}
168+
try {
169+
Start-Service docker -ErrorAction Stop
170+
} catch {
171+
Write-Warning "Docker service failed to start: $($_.Exception.Message)"
172+
}
173+
171174
- name: Add WiX to PATH
172175
shell: pwsh
173176
run: |
@@ -177,21 +180,43 @@ jobs:
177180
- name: Build packages
178181
run: make build-package
179182

180-
- name: Install driver package (MSI)
183+
- name: Install driver packages (MSI)
181184
shell: pwsh
182185
run: |
183186
$ErrorActionPreference = 'Stop'
184187
$packages = Get-ChildItem build -Filter *.msi
185188
if (-not $packages) {
186189
throw "No driver MSI packages produced"
187190
}
191+
Write-Host "Installing $($packages.Count) MSI package(s):"
192+
foreach ($pkg in $packages) {
193+
Write-Host " - $($pkg.Name)"
194+
}
195+
# Install all packages (Windows WIX creates a single MSI with components)
188196
foreach ($pkg in $packages) {
189197
$process = Start-Process msiexec.exe -ArgumentList "/i `"$($pkg.FullName)`" /qn /norestart" -Wait -PassThru
190198
if ($process.ExitCode -ne 0) {
191199
throw "Failed to install driver package $($pkg.Name): exit code $($process.ExitCode)"
192200
}
193201
}
194202
203+
- name: Verify dev package installation
204+
shell: pwsh
205+
run: |
206+
$ErrorActionPreference = 'Stop'
207+
$installPath = "C:\Program Files\ScyllaDB\Scylla CPP Driver"
208+
# Verify headers are installed
209+
$headerPath = Join-Path $installPath "include\cassandra.h"
210+
if (-not (Test-Path $headerPath)) {
211+
throw "ERROR: cassandra.h header not found at $headerPath - dev package may not be installed"
212+
}
213+
# Verify pkg-config file is installed
214+
$pkgConfigPath = Join-Path $installPath "lib\pkgconfig\scylla-cpp-driver.pc"
215+
if (-not (Test-Path $pkgConfigPath)) {
216+
throw "ERROR: scylla-cpp-driver.pc not found at $pkgConfigPath - dev package may not be installed"
217+
}
218+
Write-Host "Dev package verification successful"
219+
195220
- name: Build smoke-test application package
196221
shell: pwsh
197222
run: |

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
.vscode/
22
.zed
33
build/
4+
build-macos/
5+
**/build/
6+
**/build-macos/
47
scylla-rust-wrapper/target/
58
.idea/
69
cmake-build-debug/

CMakeLists.txt

Lines changed: 57 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,16 @@ option(CASS_USE_LIBUV "Use libuv" OFF)
5151

5252
set(CASS_CPP_STANDARD "11" CACHE STRING "C++ standard (11, 14, 17, etc.)")
5353

54+
# Component metadata used for macOS productbuild packages. Other platforms
55+
# ignore these values, so keep the defaults empty by default.
56+
set(SCYLLA_DRIVER_COMPONENT_NAME "scylla_cpp_driver")
57+
set(SCYLLA_DRIVER_COMPONENT_ARGS COMPONENT ${SCYLLA_DRIVER_COMPONENT_NAME})
58+
59+
# Define component names for runtime and dev packages
60+
# These must be set before add_subdirectory() calls so install commands can use them
61+
set(SCYLLA_DRIVER_RUNTIME_COMPONENT_NAME "${SCYLLA_DRIVER_COMPONENT_NAME}")
62+
set(SCYLLA_DRIVER_DEV_COMPONENT_NAME "${SCYLLA_DRIVER_COMPONENT_NAME}-dev")
63+
5464
if(CASS_BUILD_SHARED)
5565
set(BUILD_SHARED_LIBS ON)
5666
endif()
@@ -254,7 +264,7 @@ set(CPACK_PACKAGE_VENDOR "ScyllaDB")
254264
set(CPACK_PACKAGE_CONTACT "ScyllaDB <info@scylladb.com>")
255265
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY
256266
"ScyllaDB C++ driver backed by the Rust core driver")
257-
set(CPACK_PACKAGE_HOMEPAGE_URL "https://github.com/scylladb/cpp-rust-driver")
267+
set(CPACK_PACKAGE_HOMEPAGE_URL "https://github.com/scylladb/cpp-rs-driver")
258268
set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION_STRING})
259269
set(CPACK_PACKAGE_VERSION_MAJOR ${PROJECT_VERSION_MAJOR})
260270
set(CPACK_PACKAGE_VERSION_MINOR ${PROJECT_VERSION_MINOR})
@@ -269,6 +279,25 @@ endif()
269279
set(CPACK_MONOLITHIC_INSTALL ON)
270280
set(CPACK_VERBATIM_VARIABLES ON)
271281

282+
set(CPACK_MONOLITHIC_INSTALL OFF)
283+
284+
# Set the list of components for CPack
285+
set(CPACK_COMPONENTS_ALL ${SCYLLA_DRIVER_RUNTIME_COMPONENT_NAME} ${SCYLLA_DRIVER_DEV_COMPONENT_NAME})
286+
287+
include(CPackComponent)
288+
289+
# Runtime component: shared libraries only
290+
cpack_add_component(${SCYLLA_DRIVER_RUNTIME_COMPONENT_NAME}
291+
DISPLAY_NAME "Scylla C++ Driver Runtime"
292+
DESCRIPTION "Shared libraries for the Scylla C++ Driver"
293+
REQUIRED)
294+
295+
# Dev component: headers, static libraries, pkg-config files, and development symlinks
296+
cpack_add_component(${SCYLLA_DRIVER_DEV_COMPONENT_NAME}
297+
DISPLAY_NAME "Scylla C++ Driver Development"
298+
DESCRIPTION "Headers, static libraries, and development files for the Scylla C++ Driver"
299+
DEPENDS ${SCYLLA_DRIVER_RUNTIME_COMPONENT_NAME})
300+
272301
if(WIN32)
273302
set(CPACK_GENERATOR "WIX")
274303
set(CPACK_PACKAGE_INSTALL_DIRECTORY "ScyllaDB\\Scylla CPP Driver")
@@ -283,22 +312,48 @@ elseif(APPLE)
283312
set(CPACK_GENERATOR "productbuild;DragNDrop")
284313
set(CPACK_PACKAGE_FILE_NAME
285314
"${_CPACK_PACKAGE_NAME}-${PROJECT_VERSION_STRING}-macos")
286-
set(CPACK_PRODUCTBUILD_IDENTIFIER "com.scylladb.cpp-rust-driver")
315+
set(CPACK_PRODUCTBUILD_IDENTIFIER "com.scylladb.cpp-rs-driver")
287316
set(CPACK_PRODUCTBUILD_SIGNING_IDENTITY "")
317+
set(CPACK_PRODUCTBUILD_COMPONENT_INSTALL ON)
318+
288319
else()
289320
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE")
290321
set(CPACK_GENERATOR "DEB;RPM")
291322
set(CPACK_PACKAGE_FILE_NAME
292323
"${_CPACK_PACKAGE_NAME}-${PROJECT_VERSION_STRING}-${CMAKE_SYSTEM_NAME}")
324+
325+
# DEB package configuration
326+
set(CPACK_DEB_COMPONENT_INSTALL ON)
293327
set(CPACK_DEBIAN_FILE_NAME DEB-DEFAULT)
294328
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "ScyllaDB")
295329
set(CPACK_DEBIAN_PACKAGE_SECTION "database")
296330
set(CPACK_DEBIAN_PACKAGE_HOMEPAGE ${CPACK_PACKAGE_HOMEPAGE_URL})
297331
set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON)
332+
333+
# DEB runtime package
334+
set(CPACK_DEBIAN_${SCYLLA_DRIVER_RUNTIME_COMPONENT_NAME}_PACKAGE_NAME "${_CPACK_PACKAGE_NAME}")
335+
set(CPACK_DEBIAN_${SCYLLA_DRIVER_RUNTIME_COMPONENT_NAME}_PACKAGE_SECTION "libs")
336+
337+
# DEB dev package
338+
set(CPACK_DEBIAN_${SCYLLA_DRIVER_DEV_COMPONENT_NAME}_PACKAGE_NAME "${_CPACK_PACKAGE_NAME}-dev")
339+
set(CPACK_DEBIAN_${SCYLLA_DRIVER_DEV_COMPONENT_NAME}_PACKAGE_SECTION "libdevel")
340+
set(CPACK_DEBIAN_${SCYLLA_DRIVER_DEV_COMPONENT_NAME}_PACKAGE_DEPENDS "${_CPACK_PACKAGE_NAME} (= \${CPACK_DEBIAN_PACKAGE_VERSION})")
341+
342+
# RPM package configuration
343+
set(CPACK_RPM_COMPONENT_INSTALL ON)
298344
set(CPACK_RPM_PACKAGE_LICENSE "Apache-2.0")
299345
set(CPACK_RPM_PACKAGE_URL ${CPACK_PACKAGE_HOMEPAGE_URL})
300346
set(CPACK_RPM_PACKAGE_RELEASE 1)
301347
set(CPACK_RPM_PACKAGE_GROUP "Applications/Databases")
348+
349+
# RPM runtime package
350+
set(CPACK_RPM_${SCYLLA_DRIVER_RUNTIME_COMPONENT_NAME}_PACKAGE_NAME "${_CPACK_PACKAGE_NAME}")
351+
set(CPACK_RPM_${SCYLLA_DRIVER_RUNTIME_COMPONENT_NAME}_PACKAGE_GROUP "System Environment/Libraries")
352+
353+
# RPM dev package (devel suffix is standard for RPM)
354+
set(CPACK_RPM_${SCYLLA_DRIVER_DEV_COMPONENT_NAME}_PACKAGE_NAME "${_CPACK_PACKAGE_NAME}-devel")
355+
set(CPACK_RPM_${SCYLLA_DRIVER_DEV_COMPONENT_NAME}_PACKAGE_GROUP "Development/Libraries")
356+
set(CPACK_RPM_${SCYLLA_DRIVER_DEV_COMPONENT_NAME}_PACKAGE_REQUIRES "${_CPACK_PACKAGE_NAME} = ${PROJECT_VERSION_STRING}-${CPACK_RPM_PACKAGE_RELEASE}")
302357
endif()
303358

304359
include(CPack)

MAINTENANCE.md

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,9 @@ Description of this PR should consist of just release notes. **NOTE: Preferably
3535
8. Create a new tag (e.g. `git tag -a v1.2.0 -m "Release 1.2.0"`).
3636
9. Push `master` and the new tag, preferably using atomic push (e.g. `git push --atomic origin master v1.2.0`).
3737
10. Remove `version` file if present. This file contains version information (`X.Y.Z.<DATE>.<COMMIT_ID>`) and should be generated from scratch when releasing new version. The file will be re-generated automatically by instructions described in the next steps.
38-
11. Build binary packages with CPack on each target platform (Linux, macOS, Windows). The README provides the exact command sequence (`cmake -S`, `cmake --build`, `cpack -G <generator>`). If you do not have access to the platforms locally, trigger a run of the reusable workflow `.github/workflows/build-cpack-packages.yml` from another workflow and download the resulting artifacts.
39-
12. Go to https://github.com/scylladb/cpp-rust-driver/releases , click the `Draft new release` button and follow the procedure to create a new release on GitHub. Use the release notes as its description.
40-
13. After the release is published, the `Attach Packages to Release` workflow (`.github/workflows/release-upload-packages.yml`) automatically builds fresh packages using CPack and uploads every artifact to the release. Verify that the workflow finished successfully and that RPM/DEB/MSI/PKG/DMG files are attached.
41-
14. (Mandatory for major / minor release, optional for patch release) Publish a post on the forum:
38+
11. Go to https://github.com/scylladb/cpp-rs-driver/releases , click the `Draft new release` button and follow the procedure to create a new release on GitHub. Use the release notes as its description.
39+
12. After the release is published, the `Attach Packages to Release` workflow (`.github/workflows/release-upload-packages.yml`) automatically builds fresh packages using CPack and uploads every artifact to the release. Verify that the workflow finished successfully and that RPM/DEB/MSI/PKG/DMG files are attached.
40+
13. (Mandatory for major / minor release, optional for patch release) Publish a post on the forum:
4241
- Go to [Release notes](https://forum.scylladb.com/c/scylladb-release-notes/18) section.
4342
- Click "New Topic".
4443
- Title should be `[RELEASE] ScyllaDB CPP RS Driver <version>`, e.g. `[RELEASE] ScyllaDB CPP RS Driver 0.5.0`

Makefile

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
EMPTY :=
22
SPACE := ${EMPTY} ${EMPTY}
3-
SHELL = bash
43

54
SHELL = bash
65
ifeq ($(OS),Windows_NT)
76
SHELL := pwsh.exe
87
.SHELLFLAGS := -NoProfile -Command
8+
.ONESHELL:
99
endif
1010

1111
UNAME_S := $(shell uname -s)
@@ -199,7 +199,12 @@ BUILD_DIR := "${CURRENT_DIR}build"
199199
INTEGRATION_TEST_BIN := ${BUILD_DIR}/cassandra-integration-tests
200200
CMAKE_FLAGS ?=
201201
CMAKE_BUILD_TYPE ?= Release
202-
CMAKE_INSTALL_PREFIX ?= /usr
202+
203+
ifeq ($(OS_TYPE),macos)
204+
CMAKE_INSTALL_PREFIX ?= /usr/local
205+
else
206+
CMAKE_INSTALL_PREFIX ?= /usr
207+
endif
203208

204209
ifeq ($(OS_TYPE),macos)
205210
CPACK_GENERATORS ?= DragNDrop productbuild
@@ -301,23 +306,31 @@ build-examples:
301306
$(MAKE) .ubuntu-package-install-dependencies; \
302307
fi
303308

304-
.package-build-prepare-windows:
305-
if (-not (choco list --local-only --exact openssl.light | Select-String '^openssl.light$')) { choco install openssl.light --no-progress -y }
306-
if (-not (choco list --local-only --exact pkgconfiglite | Select-String '^pkgconfiglite$')) { choco install pkgconfiglite --no-progress -y }
309+
.package-build-prepare-windows-openssl:
310+
if (-not (choco list --local-only --exact openssl.light | Select-String '^openssl.light$$')) {
311+
choco install openssl.light --no-progress -y
312+
}
313+
314+
.package-build-prepare-windows-pkgconfiglite:
315+
if (-not (choco list --local-only --exact pkgconfiglite | Select-String '^pkgconfiglite$$')) {
316+
choco install pkgconfiglite --no-progress -y
317+
}
318+
319+
.package-build-prepare-windows: .package-build-prepare-windows-openssl .package-build-prepare-windows-pkgconfiglite
307320

308321
ifeq ($(OS_TYPE),macos)
309322
.package-build-prepare:
310-
ifeq ($(OS_TYPE),windows)
323+
else ifeq ($(OS_TYPE),windows)
311324
.package-build-prepare: .package-build-prepare-windows
312325
else
313326
.package-build-prepare: .package-build-prepare-ubuntu
314327
endif
315328

316329
.package-configure: .package-build-prepare
317330
ifeq ($(OS_TYPE),windows)
318-
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=$(CMAKE_BUILD_TYPE) -DCMAKE_INSTALL_PREFIX=$(CMAKE_INSTALL_PREFIX) $(CMAKE_FLAGS)
319-
else
320331
cmake -S . -B build -G "Visual Studio 17 2022" -A x64 -DCMAKE_BUILD_TYPE=$(CMAKE_BUILD_TYPE) $(CMAKE_FLAGS)
332+
else
333+
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=$(CMAKE_BUILD_TYPE) -DCMAKE_INSTALL_PREFIX=$(CMAKE_INSTALL_PREFIX) $(CMAKE_FLAGS)
321334
endif
322335

323336
build-driver: .package-configure

0 commit comments

Comments
 (0)