CMakeLists.txt 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. # Copyright 2016-2018 by Martin Moene
  2. #
  3. # https://github.com/martinmoene/expected-lite
  4. #
  5. # Distributed under the Boost Software License, Version 1.0.
  6. # (See accompanying file LICENSE.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  7. if( NOT DEFINED CMAKE_MINIMUM_REQUIRED_VERSION )
  8. cmake_minimum_required( VERSION 3.5 FATAL_ERROR )
  9. endif()
  10. project( test LANGUAGES CXX )
  11. set( unit_name "expected" )
  12. set( PACKAGE ${unit_name}-lite )
  13. set( PROGRAM ${unit_name}-lite )
  14. set( SOURCES ${unit_name}-main.t.cpp ${unit_name}.t.cpp )
  15. set( TWEAKD "." )
  16. message( STATUS "Subproject '${PROJECT_NAME}', programs '${PROGRAM}-*'")
  17. set( OPTIONS "" )
  18. set( DEFCMN "-Dlest_FEATURE_AUTO_REGISTER=1" )
  19. set( HAS_STD_FLAGS FALSE )
  20. set( HAS_CPP98_FLAG FALSE )
  21. set( HAS_CPP11_FLAG FALSE )
  22. set( HAS_CPP14_FLAG FALSE )
  23. set( HAS_CPP17_FLAG FALSE )
  24. set( HAS_CPP20_FLAG FALSE )
  25. set( HAS_CPPLATEST_FLAG FALSE )
  26. if ( EXPEXTED_P0323R LESS "99" )
  27. set( DEFCMN ${DEFCMN} "-Dnsel_P0323R=${EXPEXTED_P0323R}" )
  28. endif()
  29. if( MSVC )
  30. message( STATUS "Matched: MSVC")
  31. set( HAS_STD_FLAGS TRUE )
  32. set( OPTIONS -W3 -EHsc )
  33. set( DEFINITIONS -D_SCL_SECURE_NO_WARNINGS ${DEFCMN} )
  34. if( NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 19.00 )
  35. set( HAS_CPP14_FLAG TRUE )
  36. set( HAS_CPPLATEST_FLAG TRUE )
  37. endif()
  38. if( NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 19.11 )
  39. set( HAS_CPP17_FLAG TRUE )
  40. endif()
  41. elseif( CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang|AppleClang" )
  42. message( STATUS "CompilerId: '${CMAKE_CXX_COMPILER_ID}'")
  43. set( HAS_STD_FLAGS TRUE )
  44. set( HAS_CPP98_FLAG TRUE )
  45. set( OPTIONS -Wall -Wextra -Wconversion -Wsign-conversion -Wno-missing-braces -fno-elide-constructors )
  46. set( DEFINITIONS ${DEFCMN} )
  47. # GNU: available -std flags depends on version
  48. if( CMAKE_CXX_COMPILER_ID MATCHES "GNU" )
  49. message( STATUS "Matched: GNU")
  50. if( NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.8.0 )
  51. set( HAS_CPP11_FLAG TRUE )
  52. endif()
  53. if( NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9.2 )
  54. set( HAS_CPP14_FLAG TRUE )
  55. endif()
  56. if( NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 7.1.0 )
  57. set( HAS_CPP17_FLAG TRUE )
  58. endif()
  59. # AppleClang: available -std flags depends on version
  60. elseif( CMAKE_CXX_COMPILER_ID MATCHES "AppleClang" )
  61. message( STATUS "Matched: AppleClang")
  62. if( NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0.0 )
  63. set( HAS_CPP11_FLAG TRUE )
  64. endif()
  65. if( NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.1.0 )
  66. set( HAS_CPP14_FLAG TRUE )
  67. endif()
  68. if( NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 9.2.0 )
  69. set( HAS_CPP17_FLAG TRUE )
  70. endif()
  71. # Clang: available -std flags depends on version
  72. elseif( CMAKE_CXX_COMPILER_ID MATCHES "Clang" )
  73. message( STATUS "Matched: Clang")
  74. if( NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.3.0 )
  75. set( HAS_CPP11_FLAG TRUE )
  76. endif()
  77. if( NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.4.0 )
  78. set( HAS_CPP14_FLAG TRUE )
  79. endif()
  80. if( NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0.0 )
  81. set( HAS_CPP17_FLAG TRUE )
  82. endif()
  83. endif()
  84. elseif( CMAKE_CXX_COMPILER_ID MATCHES "Intel" )
  85. # as is
  86. message( STATUS "Matched: Intel")
  87. else()
  88. # as is
  89. message( STATUS "Matched: nothing")
  90. endif()
  91. # enable MS C++ Core Guidelines checker if MSVC:
  92. function( enable_msvs_guideline_checker target )
  93. if( MSVC )
  94. set_target_properties( ${target} PROPERTIES
  95. VS_GLOBAL_EnableCppCoreCheck true
  96. VS_GLOBAL_CodeAnalysisRuleSet CppCoreCheckRules.ruleset
  97. VS_GLOBAL_RunCodeAnalysis true )
  98. endif()
  99. endfunction()
  100. # make target, compile for given standard if specified:
  101. function( make_target target std )
  102. message( STATUS "Make target: '${std}'" )
  103. add_executable ( ${target} ${SOURCES} )
  104. target_include_directories( ${target} SYSTEM PRIVATE lest )
  105. target_include_directories( ${target} PRIVATE ${TWEAKD} )
  106. target_link_libraries ( ${target} PRIVATE ${PACKAGE} )
  107. target_compile_options ( ${target} PRIVATE ${OPTIONS} )
  108. target_compile_definitions( ${target} PRIVATE ${DEFINITIONS} )
  109. if( std )
  110. if( MSVC )
  111. target_compile_options( ${target} PRIVATE -std:c++${std} )
  112. else()
  113. # Necessary for clang 3.x:
  114. target_compile_options( ${target} PRIVATE -std=c++${std} )
  115. # Ok for clang 4 and later:
  116. # set( CMAKE_CXX_STANDARD ${std} )
  117. # set( CMAKE_CXX_STANDARD_REQUIRED ON )
  118. # set( CMAKE_CXX_EXTENSIONS OFF )
  119. endif()
  120. endif()
  121. endfunction()
  122. # add generic executable, unless -std flags can be specified:
  123. if( NOT HAS_STD_FLAGS )
  124. make_target( ${PROGRAM}.t "" )
  125. else()
  126. # # unconditionally add C++98 variant as MSVC has no option for it:
  127. # if( HAS_CPP98_FLAG )
  128. # make_target( ${PROGRAM}-cpp98.t 98 )
  129. # else()
  130. # make_target( ${PROGRAM}-cpp98.t "" )
  131. # endif()
  132. # unconditionally add C++11 variant as MSVC has no option for it:
  133. if( HAS_CPP11_FLAG )
  134. make_target( ${PROGRAM}-cpp11.t 11 )
  135. else()
  136. make_target( ${PROGRAM}-cpp11.t "" )
  137. endif()
  138. if( HAS_CPP14_FLAG )
  139. make_target( ${PROGRAM}-cpp14.t 14 )
  140. endif()
  141. if( HAS_CPP17_FLAG )
  142. set( std17 17 )
  143. if( CMAKE_CXX_COMPILER_ID MATCHES "AppleClang" )
  144. set( std17 1z )
  145. endif()
  146. make_target( ${PROGRAM}-cpp17.t ${std17} )
  147. enable_msvs_guideline_checker( ${PROGRAM}-cpp17.t )
  148. endif()
  149. if( HAS_CPPLATEST_FLAG )
  150. make_target( ${PROGRAM}-cpplatest.t latest )
  151. endif()
  152. endif()
  153. # with C++20, honour explicit request for std::expected or nonstd::expected:
  154. if( HAS_CPP20_FLAG )
  155. set( WHICH nsel_EXPECTED_DEFAULT )
  156. if( EXPECTED_LITE_OPT_SELECT_STD )
  157. set( WHICH nsel_EXPECTED_STD )
  158. elseif( EXPECTED_LITE_OPT_SELECT_NONSTD )
  159. set( WHICH nsel_EXPECTED_NONSTD )
  160. endif()
  161. target_compile_definitions( ${PROGRAM}-cpp17.t PRIVATE nsel_CONFIG_SELECT_EXPECTED=${WHICH} )
  162. if( HAS_CPPLATEST_FLAG )
  163. target_compile_definitions( ${PROGRAM}-cpplatest.t PRIVATE nsel_CONFIG_SELECT_EXPECTED=${WHICH} )
  164. endif()
  165. endif()
  166. # configure unit tests via CTest:
  167. enable_testing()
  168. if( HAS_STD_FLAGS )
  169. # # unconditionally add C++98 variant for MSVC:
  170. # add_test( NAME test-cpp98 COMMAND ${PROGRAM}-cpp98.t )
  171. #
  172. # unconditionally add C++11 variant for MSVC:
  173. add_test( NAME test-cpp11 COMMAND ${PROGRAM}-cpp11.t )
  174. if( HAS_CPP14_FLAG )
  175. add_test( NAME test-cpp14 COMMAND ${PROGRAM}-cpp14.t )
  176. endif()
  177. if( HAS_CPP17_FLAG )
  178. add_test( NAME test-cpp17 COMMAND ${PROGRAM}-cpp17.t )
  179. endif()
  180. if( HAS_CPPLATEST_FLAG )
  181. add_test( NAME test-cpplatest COMMAND ${PROGRAM}-cpplatest.t )
  182. endif()
  183. else()
  184. add_test( NAME test COMMAND ${PROGRAM}.t --pass )
  185. add_test( NAME list_version COMMAND ${PROGRAM}.t --version )
  186. add_test( NAME list_tags COMMAND ${PROGRAM}.t --list-tags )
  187. add_test( NAME list_tests COMMAND ${PROGRAM}.t --list-tests )
  188. endif()
  189. # end of file