4040# SHARG_INCLUDE_DIRS -- to be passed to include_directories ()
4141# SHARG_LIBRARIES -- to be passed to target_link_libraries ()
4242# SHARG_DEFINITIONS -- to be passed to add_definitions ()
43- # SHARG_CXX_FLAGS -- to be added to CMAKE_CXX_FLAGS
4443#
4544# Additionally, the following [IMPORTED][IMPORTED] targets are defined:
4645#
5049# target_include_directories(target $SHARG_INCLUDE_DIRS),
5150# target_link_libraries(target $SHARG_LIBRARIES),
5251# target_compile_definitions(target $SHARG_DEFINITIONS) and
53- # target_compile_options(target $SHARG_CXX_FLAGS)
5452# for a target.
5553#
5654# [IMPORTED]: https://cmake.org/cmake/help/v3.10/prop_tgt/IMPORTED.html#prop_tgt:IMPORTED
@@ -154,46 +152,25 @@ set (CMAKE_REQUIRED_FLAGS ${CMAKE_CXX_FLAGS})
154152option (SHARG_NO_TDL "Do not use TDL, even if present." OFF )
155153
156154# ----------------------------------------------------------------------------
157- # Require C++20
155+ # Check supported compilers
158156# ----------------------------------------------------------------------------
159157
160- set (SHARG_CXX_FLAGS "" )
161-
162- set (CMAKE_REQUIRED_FLAGS_SAVE ${CMAKE_REQUIRED_FLAGS} )
163-
164- set (CXXSTD_TEST_SOURCE
165- "#if !defined (__cplusplus) || (__cplusplus < 202002)
166- #error NOCXX20
167- #endif
168- int main() {}" )
169-
170- check_cxx_source_compiles ("${CXXSTD_TEST_SOURCE} " CXX20_BUILTIN)
171-
172- if (CXX20_BUILTIN)
173- sharg_config_print ("C++ Standard-20 support: builtin" )
174- else ()
175- set (CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS_SAVE} -std=c++20" )
176-
177- check_cxx_source_compiles ("${CXXSTD_TEST_SOURCE} " CXX20_FLAG)
178-
179- if (CXX20_FLAG)
180- sharg_config_print ("C++ Standard-20 support: via -std=c++20" )
181- else ()
182- sharg_config_error ("SHARG requires C++20, but your compiler does not support it." )
183- endif ()
158+ if ("${CMAKE_CXX_COMPILER_ID} " STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 12)
159+ message (FATAL_ERROR "GCC < 12 is not supported. The detected compiler version is ${CMAKE_CXX_COMPILER_VERSION} ." )
160+ endif ()
184161
185- list (APPEND SHARG_CXX_FLAGS "-std=c++20" )
162+ if ("${CMAKE_CXX_COMPILER_ID} " STREQUAL "Clang" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 17)
163+ message (FATAL_ERROR "Clang < 17 is not supported. The detected compiler version is ${CMAKE_CXX_COMPILER_VERSION} ." )
186164endif ()
187165
188166# ----------------------------------------------------------------------------
189167# thread support (pthread, windows threads)
190168# ----------------------------------------------------------------------------
191- set (SHARG_LIBRARIES "" )
192169
193170set (THREADS_PREFER_PTHREAD_FLAG TRUE )
194171find_package (Threads QUIET )
195172
196- if (Threads_FOUND )
173+ if (TARGET Threads::Threads )
197174 list (APPEND SHARG_LIBRARIES Threads::Threads)
198175 if ("${CMAKE_THREAD_LIBS_INIT} " STREQUAL "" )
199176 sharg_config_print ("Thread support: builtin." )
@@ -207,7 +184,6 @@ endif ()
207184# ----------------------------------------------------------------------------
208185# tool description lib (tdl) dependency
209186# ----------------------------------------------------------------------------
210- set (SHARG_USE_TDL FALSE )
211187
212188if (NOT SHARG_NO_TDL)
213189 if (NOT SHARG_HAS_CPM)
@@ -216,42 +192,34 @@ if (NOT SHARG_NO_TDL)
216192 CPMGetPackage (tdl)
217193 endif ()
218194
219- if (TDL_FOUND OR tdl_ADDED )
195+ if (TARGET tdl::tdl )
220196 sharg_config_print ("Optional dependency: TDL found." )
221- set (SHARG_USE_TDL TRUE )
197+ list ( APPEND SHARG_DEFINITIONS "-DSHARG_HAS_TDL=1" )
222198 list (APPEND SHARG_LIBRARIES tdl::tdl)
223199 else ()
224200 sharg_config_print ("Optional dependency: TDL not found." )
201+ list (APPEND SHARG_DEFINITIONS "-DSHARG_HAS_TDL=0" )
225202 endif ()
226203else ()
227204 sharg_config_print ("Optional dependency: TDL deactivated." )
228- endif ()
229-
230- if (SHARG_USE_TDL)
231- set (SHARG_DEFINITIONS ${SHARG_DEFINITIONS} "-DSHARG_HAS_TDL=1" )
232- else ()
233- set (SHARG_DEFINITIONS ${SHARG_DEFINITIONS} "-DSHARG_HAS_TDL=0" )
205+ list (APPEND SHARG_DEFINITIONS "-DSHARG_HAS_TDL=0" )
234206endif ()
235207
236208# ----------------------------------------------------------------------------
237209# System dependencies
238210# ----------------------------------------------------------------------------
239211
240212# librt
241- if ((${CMAKE_SYSTEM_NAME} STREQUAL "Linux" )
242- OR (${CMAKE_SYSTEM_NAME} STREQUAL "kFreeBSD" )
243- OR (${CMAKE_SYSTEM_NAME} STREQUAL "GNU" ))
244- list (APPEND SHARG_LIBRARIES rt)
213+ find_library (SHARG_RT_LIB rt)
214+ if (SHARG_RT_LIB)
215+ list (APPEND SHARG_LIBRARIES ${SHARG_RT_LIB} )
245216endif ()
246217
247218# libexecinfo -- implicit
248- check_include_file_cxx (execinfo.h _SHARG_HAVE_EXECINFO )
249- mark_as_advanced (_SHARG_HAVE_EXECINFO )
250- if (_SHARG_HAVE_EXECINFO )
219+ find_package (Backtrace QUIET )
220+ if ( TARGET Backtrace::Backtrace )
221+ list ( APPEND SHARG_LIBRARIES Backtrace::Backtrace )
251222 sharg_config_print ("Optional dependency: libexecinfo found." )
252- if ((${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD" ) OR (${CMAKE_SYSTEM_NAME} STREQUAL "OpenBSD" ))
253- list (APPEND SHARG_LIBRARIES execinfo elf)
254- endif ()
255223else ()
256224 sharg_config_print ("Optional dependency: libexecinfo not found." )
257225endif ()
@@ -260,22 +228,22 @@ endif ()
260228# Perform compilability test of platform.hpp (tests some requirements)
261229# ----------------------------------------------------------------------------
262230
263- set (CXXSTD_TEST_SOURCE "#include <sharg/platform.hpp>
264- int main() {}" )
231+ # cmake-format: off
232+ # Note: With CMake >= 3.25, the file WRITE can be removed, the second and third line in try_compile can be replaced by
233+ # SOURCE_FROM_CONTENT "platform_test.cpp" "#include <sharg/platform.hpp>\nint main() {}"
234+ file (WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY} /CMakeTmp/platform_test.cpp"
235+ "#include <sharg/platform.hpp>\n int main() {}" )
265236
266- # using try_compile instead of check_cxx_source_compiles to capture output in case of failure
267- file (WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY} /CMakeTmp/src.cxx" "${CXXSTD_TEST_SOURCE} \n " )
268-
269- # Can't find tdl::tdl in try_compile, so we need to remove it from SHARG_LIBRARIES
270- set (SHARG_TRY_COMPILE_LIBRARIES ${SHARG_LIBRARIES} )
271- list (REMOVE_ITEM SHARG_TRY_COMPILE_LIBRARIES tdl::tdl)
272- try_compile (SHARG_PLATFORM_TEST ${CMAKE_BINARY_DIR}
273- ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY} /CMakeTmp/src.cxx
274- CMAKE_FLAGS "-DCOMPILE_DEFINITIONS:STRING=${CMAKE_CXX_FLAGS} ${SHARG_CXX_FLAGS} "
275- "-DINCLUDE_DIRECTORIES:STRING=${CMAKE_INCLUDE_PATH} ;${SHARG_INCLUDE_DIR} "
237+ try_compile (SHARG_PLATFORM_TEST
238+ ${CMAKE_BINARY_DIR}
239+ ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY} /CMakeTmp/platform_test.cpp
240+ CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:STRING=${SHARG_INCLUDE_DIR} "
276241 COMPILE_DEFINITIONS ${SHARG_DEFINITIONS}
277- LINK_LIBRARIES ${SHARG_TRY_COMPILE_LIBRARIES}
242+ CXX_STANDARD 23
243+ CXX_STANDARD_REQUIRED ON
244+ CXX_EXTENSIONS OFF
278245 OUTPUT_VARIABLE SHARG_PLATFORM_TEST_OUTPUT)
246+ # cmake-format: on
279247
280248if (SHARG_PLATFORM_TEST)
281249 sharg_config_print ("SHARG platform.hpp build: passed." )
@@ -310,14 +278,15 @@ if (CMAKE_FIND_PACKAGE_NAME)
310278else ()
311279 set (SHARG_VERSION "${PACKAGE_VERSION} " )
312280endif ()
281+
313282# ----------------------------------------------------------------------------
314283# Export targets
315284# ----------------------------------------------------------------------------
316285
317286if (NOT TARGET sharg::sharg)
318287 add_library (sharg_sharg INTERFACE )
319288 target_compile_definitions (sharg_sharg INTERFACE ${SHARG_DEFINITIONS} )
320- target_compile_options (sharg_sharg INTERFACE ${SHARG_CXX_FLAGS} )
289+ target_compile_features (sharg_sharg INTERFACE cxx_std_23 )
321290 target_link_libraries (sharg_sharg INTERFACE ${SHARG_LIBRARIES} )
322291 target_include_directories (sharg_sharg INTERFACE "${SHARG_INCLUDE_DIR} " )
323292 add_library (sharg::sharg ALIAS sharg_sharg)
@@ -338,7 +307,6 @@ if (SHARG_FIND_DEBUG)
338307 message (" SHARG_INCLUDE_DIR ${SHARG_INCLUDE_DIR} " )
339308 message (" SHARG_LIBRARIES ${SHARG_LIBRARIES} " )
340309 message (" SHARG_DEFINITIONS ${SHARG_DEFINITIONS} " )
341- message (" SHARG_CXX_FLAGS ${SHARG_CXX_FLAGS} " )
342310 message ("" )
343311 message (" SHARG_VERSION ${SHARG_VERSION} " )
344312 message (" SHARG_VERSION_MAJOR ${SHARG_VERSION_MAJOR} " )
0 commit comments