@@ -20,7 +20,21 @@ cmake_minimum_required(VERSION 3.25)
2020
2121project (example)
2222
23- set (CMAKE_CXX_STANDARD 20)
23+ # C++20 is the minimum standard iceberg-cpp's public headers support, so the
24+ # example builds as C++20 by default to keep that contract exercised. Set this to
25+ # 23 to also check the headers from a C++23 consumer.
26+ set (ICEBERG_EXAMPLE_CXX_STANDARD
27+ 20
28+ CACHE STRING "C++ standard used to build the example (20 or 23)" )
29+ set_property (CACHE ICEBERG_EXAMPLE_CXX_STANDARD PROPERTY STRINGS 20 23)
30+ if (NOT ICEBERG_EXAMPLE_CXX_STANDARD MATCHES "^(20|23)$" )
31+ message (FATAL_ERROR "ICEBERG_EXAMPLE_CXX_STANDARD must be 20 or 23, got "
32+ "'${ICEBERG_EXAMPLE_CXX_STANDARD} '" )
33+ endif ()
34+
35+ set (CMAKE_CXX_STANDARD ${ICEBERG_EXAMPLE_CXX_STANDARD} )
36+ set (CMAKE_CXX_STANDARD_REQUIRED ON )
37+ set (CMAKE_CXX_EXTENSIONS OFF )
2438
2539find_package (iceberg CONFIG REQUIRED COMPONENTS bundle rest )
2640
@@ -41,7 +55,8 @@ add_executable(demo_example demo_example.cc)
4155target_link_libraries (demo_example PRIVATE ${ICEBERG_BUNDLE_TARGET}
4256 ${ICEBERG_REST_TARGET} )
4357
44- # Compile every installed public header as a C++20 consumer. The installed include
58+ # Compile every installed public header as a consumer using
59+ # ICEBERG_EXAMPLE_CXX_STANDARD. The installed include
4560# tree is the public API contract: iceberg_install_all_headers excludes internal
4661# headers before packaging them.
4762get_target_property (ICEBERG_BUNDLE_INCLUDE_DIRS ${ICEBERG_BUNDLE_TARGET}
@@ -75,12 +90,9 @@ endforeach()
7590string (APPEND ICEBERG_PUBLIC_HEADER_CHECK_SOURCE "\n int main() { return 0; }\n " )
7691
7792file (GENERATE
78- OUTPUT "${CMAKE_CURRENT_BINARY_DIR } /public_headers_cxx20 .cc"
93+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR } /public_headers_check .cc"
7994 CONTENT "${ICEBERG_PUBLIC_HEADER_CHECK_SOURCE} " )
8095
81- add_executable (public_headers_cxx20 "${CMAKE_CURRENT_BINARY_DIR } /public_headers_cxx20.cc" )
82- set_target_properties (public_headers_cxx20
83- PROPERTIES CXX_STANDARD 20 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS
84- OFF )
85- target_link_libraries (public_headers_cxx20 PRIVATE ${ICEBERG_BUNDLE_TARGET}
96+ add_executable (public_headers_check "${CMAKE_CURRENT_BINARY_DIR } /public_headers_check.cc" )
97+ target_link_libraries (public_headers_check PRIVATE ${ICEBERG_BUNDLE_TARGET}
8698 ${ICEBERG_REST_TARGET} )
0 commit comments