]>
Commit | Line | Data |
---|---|---|
1e59de90 TL |
1 | cmake_minimum_required(VERSION 3.1.3...3.16) |
2 | ||
3 | project(GSL VERSION 3.1.0 LANGUAGES CXX) | |
4 | ||
5 | include(ExternalProject) | |
6 | find_package(Git) | |
7 | ||
8 | # Use GNUInstallDirs to provide the right locations on all platforms | |
9 | include(GNUInstallDirs) | |
10 | ||
11 | # creates a library GSL which is an interface (header files only) | |
12 | add_library(GSL INTERFACE) | |
13 | ||
14 | # determine whether this is a standalone project or included by other projects | |
15 | set(GSL_STANDALONE_PROJECT OFF) | |
16 | if (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) | |
17 | set(GSL_STANDALONE_PROJECT ON) | |
18 | endif () | |
19 | ||
20 | set(GSL_CXX_STANDARD "14" CACHE STRING "Use c++ standard") | |
21 | set(GSL_CXX_STD "cxx_std_${GSL_CXX_STANDARD}") | |
22 | ||
23 | if (MSVC) | |
24 | set(GSL_CXX_STD_OPT "-std:c++${GSL_CXX_STANDARD}") | |
25 | else() | |
26 | set(GSL_CXX_STD_OPT "-std=c++${GSL_CXX_STANDARD}") | |
27 | endif() | |
28 | ||
29 | # when minimum version required is 3.8.0 remove if below | |
30 | # both branches do exactly the same thing | |
31 | if (CMAKE_VERSION VERSION_LESS 3.7.9) | |
32 | include(CheckCXXCompilerFlag) | |
33 | CHECK_CXX_COMPILER_FLAG("${GSL_CXX_STD_OPT}" COMPILER_SUPPORTS_CXX_STANDARD) | |
34 | ||
35 | if(COMPILER_SUPPORTS_CXX_STANDARD) | |
36 | target_compile_options(GSL INTERFACE "${GSL_CXX_STD_OPT}") | |
37 | else() | |
38 | message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no c++${GSL_CXX_STANDARD} support. Please use a different C++ compiler.") | |
39 | endif() | |
40 | else () | |
41 | target_compile_features(GSL INTERFACE "${GSL_CXX_STD}") | |
42 | # on *nix systems force the use of -std=c++XX instead of -std=gnu++XX (default) | |
43 | set(CMAKE_CXX_EXTENSIONS OFF) | |
44 | endif() | |
45 | ||
46 | # add definitions to the library and targets that consume it | |
47 | target_compile_definitions(GSL INTERFACE | |
48 | $<$<CXX_COMPILER_ID:MSVC>: | |
49 | # remove unnecessary warnings about unchecked iterators | |
50 | _SCL_SECURE_NO_WARNINGS | |
51 | # remove deprecation warnings about std::uncaught_exception() (from catch) | |
52 | _SILENCE_CXX17_UNCAUGHT_EXCEPTION_DEPRECATION_WARNING | |
53 | > | |
54 | ) | |
55 | ||
56 | # add include folders to the library and targets that consume it | |
57 | # the SYSTEM keyword suppresses warnings for users of the library | |
58 | if(GSL_STANDALONE_PROJECT) | |
59 | target_include_directories(GSL INTERFACE | |
60 | $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> | |
61 | $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}> | |
62 | ) | |
63 | else() | |
64 | target_include_directories(GSL SYSTEM INTERFACE | |
65 | $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> | |
66 | $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}> | |
67 | ) | |
68 | endif() | |
69 | ||
70 | ||
71 | if (CMAKE_VERSION VERSION_GREATER 3.7.8) | |
72 | if (MSVC_IDE) | |
73 | option(GSL_VS_ADD_NATIVE_VISUALIZERS "Configure project to use Visual Studio native visualizers" TRUE) | |
74 | else() | |
75 | set(GSL_VS_ADD_NATIVE_VISUALIZERS FALSE CACHE INTERNAL "Native visualizers are Visual Studio extension" FORCE) | |
76 | endif() | |
77 | ||
78 | # add natvis file to the library so it will automatically be loaded into Visual Studio | |
79 | if(GSL_VS_ADD_NATIVE_VISUALIZERS) | |
80 | target_sources(GSL INTERFACE | |
81 | $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/GSL.natvis> | |
82 | ) | |
83 | endif() | |
84 | endif() | |
85 | ||
86 | install(TARGETS GSL EXPORT Microsoft.GSLConfig) | |
87 | install( | |
88 | DIRECTORY include/gsl | |
89 | DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} | |
90 | ) | |
91 | # Make library importable by other projects | |
92 | install(EXPORT Microsoft.GSLConfig NAMESPACE Microsoft.GSL:: DESTINATION ${CMAKE_INSTALL_DATADIR}/cmake/Microsoft.GSL) | |
93 | export(TARGETS GSL NAMESPACE Microsoft.GSL:: FILE Microsoft.GSLConfig.cmake) | |
94 | ||
95 | # Add find_package() versioning support. The version for | |
96 | # generated Microsoft.GSLConfigVersion.cmake will be used from | |
97 | # last project() command. The version's compatibility is set between all | |
98 | # minor versions (as it was in prev. GSL releases). | |
99 | include(CMakePackageConfigHelpers) | |
100 | if(${CMAKE_VERSION} VERSION_LESS "3.14.0") | |
101 | write_basic_package_version_file( | |
102 | ${CMAKE_CURRENT_BINARY_DIR}/Microsoft.GSLConfigVersion.cmake | |
103 | COMPATIBILITY SameMajorVersion | |
104 | ) | |
105 | else() | |
106 | write_basic_package_version_file( | |
107 | ${CMAKE_CURRENT_BINARY_DIR}/Microsoft.GSLConfigVersion.cmake | |
108 | COMPATIBILITY SameMajorVersion | |
109 | ARCH_INDEPENDENT | |
110 | ) | |
111 | endif() | |
112 | install(FILES ${CMAKE_CURRENT_BINARY_DIR}/Microsoft.GSLConfigVersion.cmake DESTINATION ${CMAKE_INSTALL_DATADIR}/cmake/Microsoft.GSL) | |
113 | ||
114 | # Add Microsoft.GSL::GSL alias for GSL so that dependents can be agnostic about | |
115 | # whether GSL was added via `add_subdirectory` or `find_package` | |
116 | add_library(Microsoft.GSL::GSL ALIAS GSL) | |
117 | ||
118 | option(GSL_TEST "Generate tests." ${GSL_STANDALONE_PROJECT}) | |
119 | if (GSL_TEST) | |
120 | enable_testing() | |
121 | if(IOS) | |
122 | add_compile_definitions( | |
123 | GTEST_HAS_DEATH_TEST=1 | |
124 | ) | |
125 | endif() | |
126 | add_subdirectory(tests) | |
127 | endif () |