This is an automated email from the ASF dual-hosted git repository.
isapego pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git
The following commit(s) were added to refs/heads/main by this push:
new 9f68bb3a0a9 IGNITE-24460 С++ 3.0: Add C++ API compatibility check
(#7718)
9f68bb3a0a9 is described below
commit 9f68bb3a0a967463439756b3b0ead243c9529540
Author: Dmitriy Zabotlin <[email protected]>
AuthorDate: Tue Mar 31 13:42:01 2026 +0300
IGNITE-24460 С++ 3.0: Add C++ API compatibility check (#7718)
Co-authored-by: dzabotlin <[email protected]>
---
.../test/platform_tests/PlatformCppTestsLinux.kt | 1 +
.../test/platform_tests/PlatformCppTestsWindows.kt | 1 +
modules/platforms/cpp/CMakeLists.txt | 3 +
.../platforms/cpp/cmake/ignite_check_headers.cmake | 67 +++++++++++++++
.../cpp/cmake/ignite_compile_headers.cmake | 97 ++++++++++++++++++++++
modules/platforms/cpp/ignite/client/CMakeLists.txt | 31 +++++++
.../client/transaction/transaction_options.h | 2 +
modules/platforms/cpp/ignite/common/CMakeLists.txt | 17 +++-
.../platforms/cpp/ignite/network/CMakeLists.txt | 43 ++++++++++
modules/platforms/cpp/ignite/odbc/CMakeLists.txt | 41 +++++++++
.../platforms/cpp/ignite/protocol/CMakeLists.txt | 20 +++++
modules/platforms/cpp/ignite/tuple/CMakeLists.txt | 8 +-
.../compile_public_headers/CMakeLists.txt | 61 ++++++++++++++
modules/platforms/python/dbapi/CMakeLists.txt | 1 -
14 files changed, 386 insertions(+), 7 deletions(-)
diff --git a/.teamcity/test/platform_tests/PlatformCppTestsLinux.kt
b/.teamcity/test/platform_tests/PlatformCppTestsLinux.kt
index d9bd4eace5e..1446d9463c8 100644
--- a/.teamcity/test/platform_tests/PlatformCppTestsLinux.kt
+++ b/.teamcity/test/platform_tests/PlatformCppTestsLinux.kt
@@ -20,6 +20,7 @@ object PlatformCppTestsLinux : BuildType({
%PATH__UNIT_TESTS_RESULT% => test_logs
%PATH__CLIENT_TEST_RESULTS% => test_logs
%PATH__CMAKE_BUILD_DIRECTORY%/core => core_dumps
+ %PATH__CMAKE_BUILD_DIRECTORY%/**/*.log => cmake_logs
""".trimIndent()
params {
diff --git a/.teamcity/test/platform_tests/PlatformCppTestsWindows.kt
b/.teamcity/test/platform_tests/PlatformCppTestsWindows.kt
index a4d9716cd7d..ad89eeb12fb 100644
--- a/.teamcity/test/platform_tests/PlatformCppTestsWindows.kt
+++ b/.teamcity/test/platform_tests/PlatformCppTestsWindows.kt
@@ -23,6 +23,7 @@ object PlatformCppTestsWindows : BuildType({
%PATH__UNIT_TESTS_RESULT% => test_logs
%PATH__CLIENT_TEST_RESULTS% => test_logs
%PATH__CRASH_DUMPS% => crash_dumps
+ %PATH__CMAKE_BUILD_DIRECTORY%/**/*.log => cmake_logs
""".trimIndent()
params {
diff --git a/modules/platforms/cpp/CMakeLists.txt
b/modules/platforms/cpp/CMakeLists.txt
index 1d75a63a534..3b5d1b75e1d 100644
--- a/modules/platforms/cpp/CMakeLists.txt
+++ b/modules/platforms/cpp/CMakeLists.txt
@@ -158,6 +158,7 @@ include(CPack)
message(STATUS "IGNITE_INCLUDEDIR=${IGNITE_INCLUDEDIR}")
include(ignite_install_headers)
+include(ignite_check_headers)
# Turn on DLL export directives.
add_definitions(-DIGNITE_IMPL)
@@ -242,6 +243,8 @@ if (${ENABLE_TESTS})
endif()
endif()
+include(ignite_compile_headers)
+
# Source code formatting with clang-format.
# TODO: require clang-format version 13 or higher
find_program(CLANG_FORMAT_BIN clang-format)
diff --git a/modules/platforms/cpp/cmake/ignite_check_headers.cmake
b/modules/platforms/cpp/cmake/ignite_check_headers.cmake
new file mode 100644
index 00000000000..72ef3a80414
--- /dev/null
+++ b/modules/platforms/cpp/cmake/ignite_check_headers.cmake
@@ -0,0 +1,67 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# ignite_check_headers(SOURCE_DIR <dir> PUBLIC <list> PRIVATE <list>)
+#
+# Configure-time check that every .h file found under SOURCE_DIR belongs to
+# exactly one of the PUBLIC or PRIVATE header lists.
+#
+# Fails with FATAL_ERROR when:
+# - A header is not listed in either PUBLIC or PRIVATE.
+# - A header is listed in both PUBLIC and PRIVATE.
+function(ignite_check_headers)
+ cmake_parse_arguments(ARGS "" "SOURCE_DIR" "PUBLIC;PRIVATE" ${ARGN})
+
+ if (NOT ARGS_SOURCE_DIR)
+ message(FATAL_ERROR "ignite_check_headers: SOURCE_DIR is required")
+ endif()
+
+ file(GLOB_RECURSE CONFIGURE_DEPENDS ALL_HEADERS RELATIVE
"${ARGS_SOURCE_DIR}" "${ARGS_SOURCE_DIR}/*.h")
+ list(SORT ALL_HEADERS)
+
+ set(ERRORS)
+
+ # Check for headers that appear in both lists.
+ foreach(H IN LISTS ARGS_PUBLIC)
+ if (H IN_LIST ARGS_PRIVATE)
+ list(APPEND ERRORS " ${H} [listed in both PUBLIC_HEADERS and
PRIVATE_HEADERS]")
+ endif()
+ endforeach()
+
+ # Check for headers that are not listed in either list.
+ foreach(H IN LISTS ALL_HEADERS)
+ set(IN_PUBLIC FALSE)
+ set(IN_PRIVATE FALSE)
+ if (H IN_LIST ARGS_PUBLIC)
+ set(IN_PUBLIC TRUE)
+ endif()
+ if (H IN_LIST ARGS_PRIVATE)
+ set(IN_PRIVATE TRUE)
+ endif()
+ if (NOT IN_PUBLIC AND NOT IN_PRIVATE)
+ list(APPEND ERRORS " ${H} [not listed in PUBLIC_HEADERS or
PRIVATE_HEADERS]")
+ endif()
+ endforeach()
+
+ if (ERRORS)
+ list(JOIN ERRORS "\n" ERROR_MSG)
+ message(FATAL_ERROR
+ "Header classification error in ${ARGS_SOURCE_DIR}:\n"
+ "${ERROR_MSG}\n"
+ "Every header must appear in exactly one of PUBLIC_HEADERS or
PRIVATE_HEADERS.")
+ endif()
+endfunction()
diff --git a/modules/platforms/cpp/cmake/ignite_compile_headers.cmake
b/modules/platforms/cpp/cmake/ignite_compile_headers.cmake
new file mode 100644
index 00000000000..a2f1b8dd8b0
--- /dev/null
+++ b/modules/platforms/cpp/cmake/ignite_compile_headers.cmake
@@ -0,0 +1,97 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# Compile-time check for public headers (always enabled when ENABLE_CLIENT=ON).
+#
+# For every public header of ignite3-client, compiles a minimal .cpp that
+# includes ONLY that header against the INSTALLED package. This catches:
+# 1. Headers missing their own #include dependencies.
+# 2. Public headers that #include internal (non-installed) headers.
+# 3. Headers missing from the installed package.
+#
+# The check installs the already-built client to a temporary prefix inside
+# the build tree, then configures a sub-project under
+# tests/package-test/compile_public_headers/ against that prefix.
+# Because INSTALL_INTERFACE is used, the compiler only sees the installed
+# include tree - internal headers absent from the package are not accessible.
+#
+# Target produced:
+# compile-public-headers
+
+if (NOT ENABLE_CLIENT)
+ message(STATUS "compile-public-headers: ENABLE_CLIENT=OFF, skipping.")
+elseif (NOT IGNITE3_CLIENT_PUBLIC_HEADERS)
+ message(WARNING "compile-public-headers: IGNITE3_CLIENT_PUBLIC_HEADERS is
empty. "
+ "Check ignite/client/CMakeLists.txt.")
+else()
+ set(CPH_DIR "${CMAKE_BINARY_DIR}/compile-public-headers")
+
+ # Write the list of public headers to a cmake file that the
+ # sub-project will include. This avoids command-line quoting
+ # issues when passing a list with semicolons.
+ set(CPH_LIST_FILE "${CPH_DIR}/headers_list.cmake")
+ set(CPH_LIST_CONTENT "set(IGNITE_PUBLIC_HEADERS\n")
+ foreach(H IN LISTS IGNITE3_CLIENT_PUBLIC_HEADERS)
+ string(APPEND CPH_LIST_CONTENT " \"${H}\"\n")
+ endforeach()
+ string(APPEND CPH_LIST_CONTENT ")\n")
+ file(MAKE_DIRECTORY "${CPH_DIR}")
+ file(WRITE "${CPH_LIST_FILE}" "${CPH_LIST_CONTENT}")
+
+ set(CPH_INSTALL_PREFIX "${CPH_DIR}/install")
+ set(CPH_SUB_SRC
"${CMAKE_SOURCE_DIR}/tests/package-test/compile_public_headers")
+ set(CPH_SUB_BIN "${CPH_DIR}/build")
+ set(CPH_STAMP "${CPH_DIR}/compile-public-headers.stamp")
+
+ # Forward the generator (and platform on Windows) so the sub-project uses
the
+ # same toolchain as the parent. Without -A x64, Visual Studio generators
+ # default to 32-bit and cannot locate the installed 64-bit ignite package.
+ set(CPH_GENERATOR_ARGS -G "${CMAKE_GENERATOR}")
+ if (CMAKE_GENERATOR_PLATFORM)
+ list(APPEND CPH_GENERATOR_ARGS -A "${CMAKE_GENERATOR_PLATFORM}")
+ endif()
+
+ # Use add_custom_command so the check is skipped when ignite3-client has
+ # not been rebuilt since the last successful run (stamp file is
up-to-date).
+ add_custom_command(
+ OUTPUT "${CPH_STAMP}"
+ # Install the already-built client to a temp prefix.
+ # Only files declared with COMPONENT client are installed -
+ # internal headers not in PUBLIC_HEADERS are absent.
+ COMMAND ${CMAKE_COMMAND} --install "${CMAKE_BINARY_DIR}"
+ --prefix "${CPH_INSTALL_PREFIX}"
+ --component client
+ # Configure sub-project against the installed package.
+ # INTERFACE_INCLUDE_DIRECTORIES resolves to <prefix>/include
+ # (INSTALL_INTERFACE), so the compiler cannot reach internal headers.
+ COMMAND ${CMAKE_COMMAND}
+ ${CPH_GENERATOR_ARGS}
+ "-DCMAKE_PREFIX_PATH=${CPH_INSTALL_PREFIX}"
+ "-DIGNITE_HEADERS_LIST_FILE=${CPH_LIST_FILE}"
+ "-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}"
+ "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}"
+ "-S${CPH_SUB_SRC}"
+ "-B${CPH_SUB_BIN}"
+ COMMAND ${CMAKE_COMMAND} --build "${CPH_SUB_BIN}"
+ COMMAND ${CMAKE_COMMAND} -E touch "${CPH_STAMP}"
+ DEPENDS ignite3-client
+ COMMENT "compile-public-headers: compiling each public header against
installed package"
+ VERBATIM
+ )
+
+ add_custom_target(compile-public-headers ALL DEPENDS "${CPH_STAMP}")
+endif()
diff --git a/modules/platforms/cpp/ignite/client/CMakeLists.txt
b/modules/platforms/cpp/ignite/client/CMakeLists.txt
index 328f03c5419..e7e9f132af1 100644
--- a/modules/platforms/cpp/ignite/client/CMakeLists.txt
+++ b/modules/platforms/cpp/ignite/client/CMakeLists.txt
@@ -87,6 +87,37 @@ set(PUBLIC_HEADERS
transaction/transaction_options.h
)
+set(PRIVATE_HEADERS
+ detail/argument_check_utils.h
+ detail/cancellation_token_impl.h
+ detail/client_error_flags.h
+ detail/cluster_connection.h
+ detail/compute/any_node_job_target.h
+ detail/compute/colocated_job_target.h
+ detail/compute/compute_impl.h
+ detail/compute/job_execution_impl.h
+ detail/compute/nodes_broadcast_job_target.h
+ detail/connection_event_handler.h
+ detail/ignite_client_impl.h
+ detail/logger_wrapper.h
+ detail/node_connection.h
+ detail/response_handler.h
+ detail/sql/result_set_impl.h
+ detail/sql/sql_impl.h
+ detail/table/name_utils.h
+ detail/table/schema.h
+ detail/table/table_impl.h
+ detail/table/tables_impl.h
+ detail/transaction/transaction_impl.h
+ detail/transaction/transactions_impl.h
+ detail/utils.h
+)
+
+ignite_check_headers(SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR} PUBLIC
${PUBLIC_HEADERS} PRIVATE ${PRIVATE_HEADERS})
+
+# Expose the public header list to the parent scope for cmake/abi_check.cmake.
+set(IGNITE3_CLIENT_PUBLIC_HEADERS "${PUBLIC_HEADERS}" PARENT_SCOPE)
+
add_library(${TARGET}-obj OBJECT ${SOURCES})
target_include_directories(${TARGET}-obj PUBLIC ${IGNITE_CMAKE_TOP_DIR})
diff --git
a/modules/platforms/cpp/ignite/client/transaction/transaction_options.h
b/modules/platforms/cpp/ignite/client/transaction/transaction_options.h
index 6e51e74af34..76c3eded0cc 100644
--- a/modules/platforms/cpp/ignite/client/transaction/transaction_options.h
+++ b/modules/platforms/cpp/ignite/client/transaction/transaction_options.h
@@ -17,6 +17,8 @@
#pragma once
+#include <cstdint>
+
namespace ignite {
/**
* @brief Transaction options.
diff --git a/modules/platforms/cpp/ignite/common/CMakeLists.txt
b/modules/platforms/cpp/ignite/common/CMakeLists.txt
index 1988441b7d3..a0a01cf1586 100644
--- a/modules/platforms/cpp/ignite/common/CMakeLists.txt
+++ b/modules/platforms/cpp/ignite/common/CMakeLists.txt
@@ -42,6 +42,19 @@ set(PUBLIC_HEADERS
uuid.h
)
+set(PRIVATE_HEADERS
+ detail/defer.h
+ detail/duration_min_max.h
+ detail/factory.h
+ detail/ignite_mbedtls_config.h
+ detail/server_version.h
+ detail/string_utils.h
+ detail/thread_timer.h
+ detail/utils.h
+)
+
+ignite_check_headers(SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR} PUBLIC
${PUBLIC_HEADERS} PRIVATE ${PRIVATE_HEADERS})
+
set(SOURCES
big_decimal.cpp
big_integer.cpp
@@ -64,9 +77,7 @@ target_include_directories(${TARGET} INTERFACE
$<INSTALL_INTERFACE:${IGNITE_INCLUDEDIR}>
PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}>)
-if (${INSTALL_IGNITE_FILES})
- ignite_install_headers(FILES ${PUBLIC_HEADERS} DESTINATION
${IGNITE_INCLUDEDIR}/common COMPONENT client)
-endif()
+ignite_install_headers(FILES ${PUBLIC_HEADERS} DESTINATION
${IGNITE_INCLUDEDIR}/common COMPONENT client)
ignite_test(bits_test DISCOVER SOURCES detail/bits_test.cpp LIBS ${TARGET})
ignite_test(bytes_test DISCOVER SOURCES detail/bytes_test.cpp LIBS ${TARGET})
diff --git a/modules/platforms/cpp/ignite/network/CMakeLists.txt
b/modules/platforms/cpp/ignite/network/CMakeLists.txt
index ce02b8f418b..2a13751a540 100644
--- a/modules/platforms/cpp/ignite/network/CMakeLists.txt
+++ b/modules/platforms/cpp/ignite/network/CMakeLists.txt
@@ -17,6 +17,49 @@
set(TARGET ignite-network)
+set(PUBLIC_HEADERS)
+
+set(PRIVATE_HEADERS
+ async_client_pool.h
+ async_client_pool_adapter.h
+ async_handler.h
+ codec.h
+ codec_data_filter.h
+ data_buffer.h
+ data_filter.h
+ data_filter_adapter.h
+ data_sink.h
+ detail/linux/connecting_context.h
+ detail/linux/dynamic_module.h
+ detail/linux/linux_async_client.h
+ detail/linux/linux_async_client_pool.h
+ detail/linux/linux_async_worker_thread.h
+ detail/linux/sockets.h
+ detail/linux/tcp_socket_client.h
+ detail/sockets.h
+ detail/utils.h
+ detail/win/dynamic_module.h
+ detail/win/sockets.h
+ detail/win/tcp_socket_client.h
+ detail/win/win_async_client.h
+ detail/win/win_async_client_pool.h
+ detail/win/win_async_connecting_thread.h
+ detail/win/win_async_worker_thread.h
+ error_handling_filter.h
+ length_prefix_codec.h
+ network.h
+ socket_client.h
+ ssl/secure_configuration.h
+ ssl/secure_data_filter.h
+ ssl/secure_socket_client.h
+ ssl/secure_utils.h
+ ssl/ssl_connection.h
+ ssl/ssl_gateway.h
+ tcp_range.h
+)
+
+ignite_check_headers(SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR} PUBLIC
${PUBLIC_HEADERS} PRIVATE ${PRIVATE_HEADERS})
+
find_package(OpenSSL)
if (EXISTS ${OPENSSL_INCLUDE_DIR})
message(STATUS "OPENSSL_INCLUDE_DIR: " ${OPENSSL_INCLUDE_DIR})
diff --git a/modules/platforms/cpp/ignite/odbc/CMakeLists.txt
b/modules/platforms/cpp/ignite/odbc/CMakeLists.txt
index ac9d8900aaa..2676cfcab13 100644
--- a/modules/platforms/cpp/ignite/odbc/CMakeLists.txt
+++ b/modules/platforms/cpp/ignite/odbc/CMakeLists.txt
@@ -17,6 +17,47 @@
set(TARGET ${PROJECT_NAME}-odbc)
+set(PUBLIC_HEADERS)
+
+set(PRIVATE_HEADERS
+ app/application_data_buffer.h
+ app/parameter.h
+ app/parameter_set.h
+ common_types.h
+ config/config_tools.h
+ config/configuration.h
+ config/connection_info.h
+ config/value_with_default.h
+ diagnostic/diagnosable.h
+ diagnostic/diagnosable_adapter.h
+ diagnostic/diagnostic_record.h
+ diagnostic/diagnostic_record_storage.h
+ log.h
+ meta/primary_key_meta.h
+ meta/table_meta.h
+ odbc.h
+ odbc_error.h
+ query/column_metadata_query.h
+ query/cursor.h
+ query/data_query.h
+ query/foreign_keys_query.h
+ query/primary_keys_query.h
+ query/query.h
+ query/result_page.h
+ query/special_columns_query.h
+ query/table_metadata_query.h
+ query/type_info_query.h
+ sql_connection.h
+ sql_environment.h
+ sql_statement.h
+ ssl_mode.h
+ system/odbc_constants.h
+ type_traits.h
+ utility.h
+)
+
+ignite_check_headers(SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR} PUBLIC
${PUBLIC_HEADERS} PRIVATE ${PRIVATE_HEADERS})
+
include(find_odbc)
find_package(ODBC REQUIRED)
diff --git a/modules/platforms/cpp/ignite/protocol/CMakeLists.txt
b/modules/platforms/cpp/ignite/protocol/CMakeLists.txt
index 1eb38a78021..e69033eb06e 100644
--- a/modules/platforms/cpp/ignite/protocol/CMakeLists.txt
+++ b/modules/platforms/cpp/ignite/protocol/CMakeLists.txt
@@ -17,6 +17,26 @@
set(TARGET ignite-protocol)
+set(PUBLIC_HEADERS)
+
+set(PRIVATE_HEADERS
+ bitmask_feature.h
+ bitset_span.h
+ buffer_adapter.h
+ client_operation.h
+ extension_types.h
+ heartbeat_timeout.h
+ messages.h
+ protocol_context.h
+ protocol_version.h
+ reader.h
+ sql/column_meta.h
+ utils.h
+ writer.h
+)
+
+ignite_check_headers(SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR} PUBLIC
${PUBLIC_HEADERS} PRIVATE ${PRIVATE_HEADERS})
+
set(SOURCES
sql/column_meta.cpp sql/column_meta.h
bitset_span.h
diff --git a/modules/platforms/cpp/ignite/tuple/CMakeLists.txt
b/modules/platforms/cpp/ignite/tuple/CMakeLists.txt
index d94d5d0b298..db6548ed500 100644
--- a/modules/platforms/cpp/ignite/tuple/CMakeLists.txt
+++ b/modules/platforms/cpp/ignite/tuple/CMakeLists.txt
@@ -28,12 +28,14 @@ set(PUBLIC_HEADERS
binary_tuple_parser.h
)
+set(PRIVATE_HEADERS)
+
+ignite_check_headers(SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR} PUBLIC
${PUBLIC_HEADERS} PRIVATE ${PRIVATE_HEADERS})
+
add_library(${TARGET} STATIC ${SOURCES})
target_link_libraries(${TARGET} ignite-common)
ignite_test(tuple_test DISCOVER SOURCES tuple_test.cpp LIBS ${TARGET})
-if (${INSTALL_IGNITE_FILES})
- ignite_install_headers(FILES ${PUBLIC_HEADERS} DESTINATION
${IGNITE_INCLUDEDIR}/tuple COMPONENT client)
-endif()
+ignite_install_headers(FILES ${PUBLIC_HEADERS} DESTINATION
${IGNITE_INCLUDEDIR}/tuple COMPONENT client)
diff --git
a/modules/platforms/cpp/tests/package-test/compile_public_headers/CMakeLists.txt
b/modules/platforms/cpp/tests/package-test/compile_public_headers/CMakeLists.txt
new file mode 100644
index 00000000000..e17ab41624a
--- /dev/null
+++
b/modules/platforms/cpp/tests/package-test/compile_public_headers/CMakeLists.txt
@@ -0,0 +1,61 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# Ignite header compilation test
+#
+# For every public header of ignite3-client, compiles a minimal .cpp that
+# includes ONLY that header (via the installed/exported ignite::client target).
+# This verifies that each header includes all its own dependencies and can be
+# used by consumers without relying on a particular include order.
+#
+# Invoked by the parent build's 'compile-public-headers' target:
+# cmake -S <this_dir> -B <build_dir>
+# -Dignite_DIR=<ignite_build>/cmake
+# -DIGNITE_HEADERS_LIST_FILE=<path/to/headers_list.cmake>
+# -DCMAKE_CXX_COMPILER=<compiler>
+# [-DCMAKE_BUILD_TYPE=<type>]
+# cmake --build <build_dir>
+
+cmake_minimum_required(VERSION 3.18)
+
+project(ignite_compile_public_headers CXX)
+
+set(CMAKE_CXX_STANDARD 17)
+set(CMAKE_CXX_STANDARD_REQUIRED ON)
+
+if(NOT IGNITE_HEADERS_LIST_FILE OR NOT EXISTS "${IGNITE_HEADERS_LIST_FILE}")
+ message(FATAL_ERROR
+ "IGNITE_HEADERS_LIST_FILE must point to the generated headers list
cmake file. "
+ "Got: '${IGNITE_HEADERS_LIST_FILE}'")
+endif()
+
+find_package(ignite REQUIRED COMPONENTS client)
+
+# Load the list of public headers (variable: IGNITE_PUBLIC_HEADERS).
+include("${IGNITE_HEADERS_LIST_FILE}")
+
+foreach(H IN LISTS IGNITE_PUBLIC_HEADERS)
+ # Derive a CMake-identifier-safe target name from the header path.
+ string(MAKE_C_IDENTIFIER "${H}" CPH_SAFE_NAME)
+
+ set(CPH_CPP "${CMAKE_CURRENT_BINARY_DIR}/${CPH_SAFE_NAME}.cpp")
+ file(WRITE "${CPH_CPP}" "#include <ignite/client/${H}>\n")
+
+ # Compile the generated file as an object (no link step needed).
+ add_library(cph_${CPH_SAFE_NAME} OBJECT "${CPH_CPP}")
+ target_link_libraries(cph_${CPH_SAFE_NAME} PRIVATE ignite::client)
+endforeach()
diff --git a/modules/platforms/python/dbapi/CMakeLists.txt
b/modules/platforms/python/dbapi/CMakeLists.txt
index 4f659bdda8e..200a54c5430 100644
--- a/modules/platforms/python/dbapi/CMakeLists.txt
+++ b/modules/platforms/python/dbapi/CMakeLists.txt
@@ -36,7 +36,6 @@ message("EXTENSION_FILENAME:${EXTENSION_FILENAME}")
set(ENABLE_ODBC OFF)
set(ENABLE_CLIENT OFF)
set(ENABLE_TESTS OFF)
-set(INSTALL_IGNITE_FILES OFF)
set(ENABLE_ADDRESS_SANITIZER OFF)
set(ENABLE_UB_SANITIZER OFF)
set(WARNINGS_AS_ERRORS OFF)