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)

Reply via email to