@@ -20,13 +20,65 @@ cmake_minimum_required(VERSION 3.25)
2020
2121project (example)
2222
23- set (CMAKE_CXX_STANDARD 23 )
23+ set (CMAKE_CXX_STANDARD 20 )
2424
2525find_package (iceberg CONFIG REQUIRED COMPONENTS bundle rest )
2626
27+ if (TARGET iceberg::iceberg_bundle_shared)
28+ set (ICEBERG_BUNDLE_TARGET iceberg::iceberg_bundle_shared)
29+ else ()
30+ set (ICEBERG_BUNDLE_TARGET iceberg::iceberg_bundle_static)
31+ endif ()
32+
33+ if (TARGET iceberg::iceberg_rest_shared)
34+ set (ICEBERG_REST_TARGET iceberg::iceberg_rest_shared)
35+ else ()
36+ set (ICEBERG_REST_TARGET iceberg::iceberg_rest_static)
37+ endif ()
38+
2739add_executable (demo_example demo_example.cc )
2840
29- target_link_libraries (demo_example
30- PRIVATE "$<IF :$<TARGET_EXISTS :iceberg ::iceberg_bundle_shared >,iceberg ::iceberg_bundle_shared ,iceberg ::iceberg_bundle_static >"
31- "$<IF :$<TARGET_EXISTS :iceberg ::iceberg_rest_shared >,iceberg ::iceberg_rest_shared ,iceberg ::iceberg_rest_static >"
32- )
41+ target_link_libraries (demo_example PRIVATE ${ICEBERG_BUNDLE_TARGET}
42+ ${ICEBERG_REST_TARGET} )
43+
44+ # Compile every installed public header as a C++20 consumer. The installed include
45+ # tree is the public API contract: iceberg_install_all_headers excludes internal
46+ # headers before packaging them.
47+ get_target_property (ICEBERG_BUNDLE_INCLUDE_DIRS ${ICEBERG_BUNDLE_TARGET}
48+ INTERFACE_INCLUDE_DIRECTORIES )
49+ foreach (ICEBERG_INCLUDE_DIR IN LISTS ICEBERG_BUNDLE_INCLUDE_DIRS)
50+ if (EXISTS "${ICEBERG_INCLUDE_DIR} /iceberg" )
51+ set (ICEBERG_PUBLIC_INCLUDE_DIR "${ICEBERG_INCLUDE_DIR} " )
52+ break ()
53+ endif ()
54+ endforeach ()
55+
56+ if (NOT ICEBERG_PUBLIC_INCLUDE_DIR)
57+ message (FATAL_ERROR "Could not locate iceberg's installed public headers" )
58+ endif ()
59+
60+ file (GLOB_RECURSE ICEBERG_PUBLIC_HEADERS CONFIGURE_DEPENDS
61+ "${ICEBERG_PUBLIC_INCLUDE_DIR} /iceberg/*.h"
62+ "${ICEBERG_PUBLIC_INCLUDE_DIR} /iceberg/*.hpp" )
63+ list (SORT ICEBERG_PUBLIC_HEADERS)
64+
65+ set (ICEBERG_PUBLIC_HEADER_CHECK_SOURCE
66+ "// Generated from iceberg's installed public headers.\n " )
67+ foreach (ICEBERG_PUBLIC_HEADER IN LISTS ICEBERG_PUBLIC_HEADERS)
68+ file (RELATIVE_PATH ICEBERG_PUBLIC_HEADER_RELATIVE_PATH
69+ "${ICEBERG_PUBLIC_INCLUDE_DIR} " "${ICEBERG_PUBLIC_HEADER} " )
70+ string (APPEND ICEBERG_PUBLIC_HEADER_CHECK_SOURCE
71+ "#include <${ICEBERG_PUBLIC_HEADER_RELATIVE_PATH} >\n " )
72+ endforeach ()
73+ string (APPEND ICEBERG_PUBLIC_HEADER_CHECK_SOURCE "\n int main() { return 0; }\n " )
74+
75+ file (GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR } /public_headers_cxx20.cc"
76+ CONTENT "${ICEBERG_PUBLIC_HEADER_CHECK_SOURCE} " )
77+
78+ add_executable (public_headers_cxx20
79+ "${CMAKE_CURRENT_BINARY_DIR } /public_headers_cxx20.cc" )
80+ set_target_properties (public_headers_cxx20 PROPERTIES CXX_STANDARD 20
81+ CXX_STANDARD_REQUIRED ON
82+ CXX_EXTENSIONS OFF )
83+ target_link_libraries (public_headers_cxx20
84+ PRIVATE ${ICEBERG_BUNDLE_TARGET} ${ICEBERG_REST_TARGET} )
0 commit comments