Skip to content

Commit 4a66df4

Browse files
committed
build the example as C++20
1 parent adb5956 commit 4a66df4

1 file changed

Lines changed: 57 additions & 5 deletions

File tree

‎example/CMakeLists.txt‎

Lines changed: 57 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,65 @@ cmake_minimum_required(VERSION 3.25)
2020

2121
project(example)
2222

23-
set(CMAKE_CXX_STANDARD 23)
23+
set(CMAKE_CXX_STANDARD 20)
2424

2525
find_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+
2739
add_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 "\nint 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

Comments
 (0)