11cmake_minimum_required (VERSION 3.15)
22project (scylla_cpp_driver_smoke_app LANGUAGES C)
33
4- # Derive driver version information from the root header so the smoke-app
5- # package stays in lockstep with the driver packages.
4+ # Derive driver version information from pkg-config metadata when the
5+ # scylla-cpp-driver dev package is available. This keeps the smoke-app
6+ # aligned with the installed driver packages instead of relying on
7+ # building the driver from the same CMake project.
68get_filename_component (CPP_DRIVER_ROOT "${CMAKE_CURRENT_LIST_DIR} /.." ABSOLUTE )
79get_filename_component (CPP_DRIVER_ROOT "${CPP_DRIVER_ROOT} /.." ABSOLUTE )
8- set (CASS_INCLUDE_DIR "${CPP_DRIVER_ROOT} /include" )
910
10- file ( STRINGS " ${CASS_INCLUDE_DIR} /cassandra.h" _VERSION_PARTS
11- REGEX "^#define[ \t ]+CASS_VERSION_(MAJOR|MINOR|PATCH|SUFFIX)[ \t ]+([0-9]+| \" ([^ \" ]+) \" )$" )
11+ find_package (PkgConfig REQUIRED)
12+ pkg_check_modules(SCYLLA_CPP_DRIVER REQUIRED IMPORTED_TARGET scylla-cpp-driver )
1213
13- foreach (part MAJOR MINOR PATCH SUFFIX )
14- string (REGEX MATCH "CASS_VERSION_${part} [ \t ]+([0-9]+|\" ([^\" ]+)\" )"
15- PROJECT_VERSION_${part} "${_VERSION_PARTS} " )
16- if (PROJECT_VERSION_${part} )
17- string (REGEX REPLACE "CASS_VERSION_${part} [ \t ]+([0-9]+|\" ([^\" ]+)\" )" "\\ 1"
18- PROJECT_VERSION_${part} "${PROJECT_VERSION_${part} }" )
14+ set (_pkg_config_use_static_libs_saved OFF )
15+ if (DEFINED PKG_CONFIG_USE_STATIC_LIBS)
16+ set (_pkg_config_use_static_libs_saved "${PKG_CONFIG_USE_STATIC_LIBS} " )
17+ endif ()
18+ set (PKG_CONFIG_USE_STATIC_LIBS ON )
19+ pkg_check_modules(SCYLLA_CPP_DRIVER_STATIC REQUIRED IMPORTED_TARGET scylla-cpp-driver_static)
20+ if (_pkg_config_use_static_libs_saved)
21+ set (PKG_CONFIG_USE_STATIC_LIBS "${_pkg_config_use_static_libs_saved} " )
22+ else ()
23+ unset (PKG_CONFIG_USE_STATIC_LIBS)
24+ endif ()
25+ unset (_pkg_config_use_static_libs_saved)
26+
27+ set (PROJECT_VERSION_STRING "" )
28+ if (SCYLLA_CPP_DRIVER_VERSION)
29+ set (PROJECT_VERSION_STRING "${SCYLLA_CPP_DRIVER_VERSION} " )
30+ string (REPLACE "-" ";" _version_parts "${PROJECT_VERSION_STRING} " )
31+ list (GET _version_parts 0 _numeric_version)
32+ list (LENGTH _version_parts _parts_length)
33+ if (_parts_length GREATER 1)
34+ list (REMOVE_AT _version_parts 0)
35+ list (JOIN _version_parts "-" PROJECT_VERSION_SUFFIX)
36+ else ()
37+ set (PROJECT_VERSION_SUFFIX "" )
1938 endif ()
20- endforeach ()
2139
22- if (NOT PROJECT_VERSION_MAJOR OR NOT PROJECT_VERSION_MINOR)
23- message (FATAL_ERROR "Unable to extract driver version from cassandra.h" )
40+ string (REPLACE "." ";" _numeric_split "${_numeric_version} " )
41+ list (LENGTH _numeric_split _numeric_length)
42+ if (_numeric_length GREATER 0)
43+ list (GET _numeric_split 0 PROJECT_VERSION_MAJOR)
44+ else ()
45+ set (PROJECT_VERSION_MAJOR "" )
46+ endif ()
47+ if (_numeric_length GREATER 1)
48+ list (GET _numeric_split 1 PROJECT_VERSION_MINOR)
49+ else ()
50+ set (PROJECT_VERSION_MINOR "" )
51+ endif ()
52+ if (_numeric_length GREATER 2)
53+ list (GET _numeric_split 2 PROJECT_VERSION_PATCH)
54+ else ()
55+ set (PROJECT_VERSION_PATCH "" )
56+ endif ()
2457endif ()
2558
26- set (PROJECT_VERSION_STRING
27- "${PROJECT_VERSION_MAJOR} .${PROJECT_VERSION_MINOR} " )
28- if (NOT PROJECT_VERSION_PATCH STREQUAL "" )
29- set (PROJECT_VERSION_STRING
30- "${PROJECT_VERSION_STRING} .${PROJECT_VERSION_PATCH} " )
31- endif ()
32- if (NOT PROJECT_VERSION_SUFFIX STREQUAL "" )
33- string (REPLACE "\" " ""
34- PROJECT_VERSION_SUFFIX ${PROJECT_VERSION_SUFFIX} )
35- set (PROJECT_VERSION_STRING
36- "${PROJECT_VERSION_STRING} -${PROJECT_VERSION_SUFFIX} " )
37- endif ()
59+ if (PROJECT_VERSION_STRING STREQUAL "" )
60+ # Fallback to parsing cassandra.h when pkg-config metadata does not provide
61+ # version information (should be rare, but keeps backwards compatibility).
62+ set (CASS_INCLUDE_DIR "" )
63+ foreach (_candidate_dir IN LISTS SCYLLA_CPP_DRIVER_INCLUDE_DIRS)
64+ if (EXISTS "${_candidate_dir} /cassandra.h" )
65+ set (CASS_INCLUDE_DIR "${_candidate_dir} " )
66+ break ()
67+ endif ()
68+ endforeach ()
69+ if (CASS_INCLUDE_DIR STREQUAL "" )
70+ set (CASS_INCLUDE_DIR "${CPP_DRIVER_ROOT} /include" )
71+ endif ()
3872
39- set (CMAKE_C_STANDARD 11)
40- set (CMAKE_C_STANDARD_REQUIRED ON )
41- set (CMAKE_POSITION_INDEPENDENT_CODE ON )
73+ file (STRINGS "${CASS_INCLUDE_DIR} /cassandra.h" _VERSION_PARTS
74+ REGEX "^#define[ \t ]+CASS_VERSION_(MAJOR|MINOR|PATCH|SUFFIX)[ \t ]+([0-9]+|\" ([^\" ]+)\" )$" )
4275
43- find_package (PkgConfig)
44- if (PKG_CONFIG_FOUND)
45- pkg_check_modules(SCYLLA_CPP_DRIVER scylla-cpp-driver)
46- endif ()
76+ foreach (part MAJOR MINOR PATCH SUFFIX )
77+ string (REGEX MATCH "CASS_VERSION_${part} [ \t ]+([0-9]+|\" ([^\" ]+)\" )"
78+ PROJECT_VERSION_${part} "${_VERSION_PARTS} " )
79+ if (PROJECT_VERSION_${part} )
80+ string (REGEX REPLACE "CASS_VERSION_${part} [ \t ]+([0-9]+|\" ([^\" ]+)\" )" "\\ 1"
81+ PROJECT_VERSION_${part} "${PROJECT_VERSION_${part} }" )
82+ endif ()
83+ endforeach ()
4784
48- set (DRIVER_INCLUDE_DIRS "" )
49- set (DRIVER_LIBRARY_DIRS "" )
50- set (DRIVER_LIBRARIES "" )
51- set (DRIVER_COMPILE_OPTIONS "" )
52- set (DRIVER_LINK_OPTIONS "" )
53-
54- if (PKG_CONFIG_FOUND AND SCYLLA_CPP_DRIVER_FOUND)
55- list (APPEND DRIVER_INCLUDE_DIRS ${SCYLLA_CPP_DRIVER_INCLUDE_DIRS} )
56- list (APPEND DRIVER_LIBRARY_DIRS ${SCYLLA_CPP_DRIVER_LIBRARY_DIRS} )
57- list (APPEND DRIVER_LIBRARIES ${SCYLLA_CPP_DRIVER_LIBRARIES} )
58- list (APPEND DRIVER_COMPILE_OPTIONS ${SCYLLA_CPP_DRIVER_CFLAGS_OTHER} )
59- list (APPEND DRIVER_LINK_OPTIONS ${SCYLLA_CPP_DRIVER_LDFLAGS_OTHER} )
60- endif ()
85+ if (NOT PROJECT_VERSION_MAJOR OR NOT PROJECT_VERSION_MINOR)
86+ message (FATAL_ERROR "Unable to extract driver version from metadata or cassandra.h" )
87+ endif ()
6188
62- if (NOT PKG_CONFIG_FOUND OR NOT SCYLLA_CPP_DRIVER_FOUND)
63- if (NOT DEFINED SCYLLA_CPP_DRIVER_ROOT AND DEFINED ENV{SCYLLA_CPP_DRIVER_ROOT})
64- set (SCYLLA_CPP_DRIVER_ROOT "$ENV{SCYLLA_CPP_DRIVER_ROOT} " )
89+ set (PROJECT_VERSION_STRING
90+ "${PROJECT_VERSION_MAJOR} .${PROJECT_VERSION_MINOR} " )
91+ if (NOT PROJECT_VERSION_PATCH STREQUAL "" )
92+ set (PROJECT_VERSION_STRING
93+ "${PROJECT_VERSION_STRING} .${PROJECT_VERSION_PATCH} " )
6594 endif ()
66- if (NOT DEFINED SCYLLA_CPP_DRIVER_ROOT)
67- if (WIN32 )
68- set (SCYLLA_CPP_DRIVER_ROOT "C:/Program Files/ScyllaDB/Scylla CPP Driver" )
69- elseif (APPLE )
70- set (SCYLLA_CPP_DRIVER_ROOT "/usr/local" )
71- else ()
72- set (SCYLLA_CPP_DRIVER_ROOT "/usr" )
73- endif ()
95+ if (NOT PROJECT_VERSION_SUFFIX STREQUAL "" )
96+ string (REPLACE "\" " "" PROJECT_VERSION_SUFFIX ${PROJECT_VERSION_SUFFIX} )
97+ set (PROJECT_VERSION_STRING
98+ "${PROJECT_VERSION_STRING} -${PROJECT_VERSION_SUFFIX} " )
7499 endif ()
100+ endif ()
75101
76- find_path (SCYLLA_CPP_DRIVER_INCLUDE_DIR cassandra.h
77- PATHS
78- "${SCYLLA_CPP_DRIVER_ROOT} /include"
79- PATH_SUFFIXES
80- ""
81- "cassandra"
82- "x86_64-linux-gnu"
83- "x86_64-linux-gnu/cassandra" )
84-
85- find_library (SCYLLA_CPP_DRIVER_LIBRARY
86- NAMES scylla-cpp-driver
87- PATHS
88- "${SCYLLA_CPP_DRIVER_ROOT} /lib"
89- "${SCYLLA_CPP_DRIVER_ROOT} /lib64"
90- "${SCYLLA_CPP_DRIVER_ROOT} /lib/x86_64-linux-gnu"
91- "${SCYLLA_CPP_DRIVER_ROOT} /lib64/x86_64-linux-gnu" )
92-
93- if (NOT SCYLLA_CPP_DRIVER_INCLUDE_DIR OR NOT SCYLLA_CPP_DRIVER_LIBRARY)
94- message (FATAL_ERROR
95- "Unable to locate scylla-cpp-driver installation. Set SCYLLA_CPP_DRIVER_ROOT "
96- "or install pkg-config so the package can be discovered automatically." )
102+ set (CMAKE_C_STANDARD 11)
103+ set (CMAKE_C_STANDARD_REQUIRED ON )
104+ set (CMAKE_POSITION_INDEPENDENT_CODE ON )
105+ if (PROJECT_VERSION_SUFFIX)
106+ string (REPLACE "\" " "" PROJECT_VERSION_SUFFIX ${PROJECT_VERSION_SUFFIX} )
107+ if (PROJECT_VERSION_PATCH)
108+ set (PROJECT_VERSION_STRING
109+ "${PROJECT_VERSION_MAJOR} .${PROJECT_VERSION_MINOR} .${PROJECT_VERSION_PATCH} -${PROJECT_VERSION_SUFFIX} " )
110+ else ()
111+ set (PROJECT_VERSION_STRING
112+ "${PROJECT_VERSION_MAJOR} .${PROJECT_VERSION_MINOR} -${PROJECT_VERSION_SUFFIX} " )
113+ endif ()
114+ elseif (PROJECT_VERSION_STRING STREQUAL "" )
115+ set (PROJECT_VERSION_STRING
116+ "${PROJECT_VERSION_MAJOR} .${PROJECT_VERSION_MINOR} " )
117+ if (NOT PROJECT_VERSION_PATCH STREQUAL "" )
118+ set (PROJECT_VERSION_STRING
119+ "${PROJECT_VERSION_STRING} .${PROJECT_VERSION_PATCH} " )
97120 endif ()
98-
99- set (SCYLLA_CPP_DRIVER_FOUND TRUE )
100- set (DRIVER_INCLUDE_DIRS ${SCYLLA_CPP_DRIVER_INCLUDE_DIR} )
101- get_filename_component (_driver_library_dir ${SCYLLA_CPP_DRIVER_LIBRARY} DIRECTORY )
102- set (DRIVER_LIBRARY_DIRS ${_driver_library_dir} )
103- set (DRIVER_LIBRARIES ${SCYLLA_CPP_DRIVER_LIBRARY} )
104121endif ()
105122
106123add_executable (scylla-cpp-driver-smoke-test
107124 src/smoke_test.c)
125+ target_link_libraries (scylla-cpp-driver-smoke-test PRIVATE
126+ PkgConfig::SCYLLA_CPP_DRIVER)
108127
109- if (DRIVER_INCLUDE_DIRS)
110- target_include_directories (scylla-cpp-driver-smoke-test PRIVATE
111- ${DRIVER_INCLUDE_DIRS} )
112- endif ()
113-
114- if (DRIVER_LIBRARY_DIRS)
115- target_link_directories (scylla-cpp-driver-smoke-test PRIVATE
116- ${DRIVER_LIBRARY_DIRS} )
117- endif ()
118-
119- if (DRIVER_LIBRARIES)
120- target_link_libraries (scylla-cpp-driver-smoke-test PRIVATE
121- ${DRIVER_LIBRARIES} )
128+ add_executable (scylla-cpp-driver-smoke-test -static
129+ src/smoke_test.c)
130+ set_target_properties (scylla-cpp-driver-smoke-test -static PROPERTIES
131+ OUTPUT_NAME "scylla-cpp-driver-smoke-test-static" )
132+ if (NOT PKG_CONFIG_EXECUTABLE)
133+ message (FATAL_ERROR "pkg-config executable not available for static linkage" )
122134endif ()
123-
124- if (DRIVER_COMPILE_OPTIONS)
125- target_compile_options (scylla-cpp-driver-smoke-test PRIVATE
126- ${DRIVER_COMPILE_OPTIONS} )
135+ execute_process (
136+ COMMAND ${PKG_CONFIG_EXECUTABLE} --libs --static scylla-cpp-driver_static
137+ OUTPUT_VARIABLE _smoke_static_libs_output
138+ RESULT_VARIABLE _smoke_static_libs_result
139+ OUTPUT_STRIP_TRAILING_WHITESPACE)
140+ if (NOT _smoke_static_libs_result EQUAL 0 OR _smoke_static_libs_output STREQUAL "" )
141+ message (FATAL_ERROR
142+ "Unable to resolve static link flags from scylla-cpp-driver_static pkg-config metadata" )
127143endif ()
128-
129- if (DRIVER_LINK_OPTIONS)
130- target_link_options (scylla-cpp-driver-smoke-test PRIVATE
131- ${DRIVER_LINK_OPTIONS} )
144+ separate_arguments (_smoke_static_link_libraries UNIX_COMMAND "${_smoke_static_libs_output} " )
145+ if (NOT WIN32 )
146+ list (APPEND _smoke_static_link_libraries m)
132147endif ()
148+ target_link_libraries (scylla-cpp-driver-smoke-test -static PRIVATE
149+ ${_smoke_static_link_libraries} )
150+ unset (_smoke_static_libs_output)
151+ unset (_smoke_static_link_libraries)
133152
134153set (SMOKE_APP_COMPONENT_NAME "" )
135154set (SMOKE_APP_COMPONENT_ARGS "" )
@@ -138,7 +157,9 @@ if(APPLE)
138157 set (SMOKE_APP_COMPONENT_ARGS COMPONENT ${SMOKE_APP_COMPONENT_NAME} )
139158endif ()
140159
141- install (TARGETS scylla-cpp-driver-smoke-test
160+ install (TARGETS
161+ scylla-cpp-driver-smoke-test
162+ scylla-cpp-driver-smoke-test -static
142163 DESTINATION bin
143164 ${SMOKE_APP_COMPONENT_ARGS} )
144165
0 commit comments