blob: 0348f792180e4cb11d63eeaaf82ddf4902b689c0 [file] [log] [blame]
Rian Quinnd933e512018-04-27 13:56:25 -06001cmake_minimum_required(VERSION 3.1.3)
Neil MacIntosha9dcbe02015-08-20 18:09:14 -07002
Tamas Kenez9b454b72015-09-23 17:43:36 +02003project(GSL CXX)
Neil MacIntosha9dcbe02015-08-20 18:09:14 -07004
Neil MacIntoshb2ee4842017-07-13 13:53:56 -07005include(ExternalProject)
Nicholas Gurieve249f862017-08-17 06:00:30 +04006find_package(Git)
Neil MacIntoshb2ee4842017-07-13 13:53:56 -07007
Tiago8b320e32017-04-25 17:08:36 -07008# creates a library GSL which is an interface (header files only)
9add_library(GSL INTERFACE)
10
bfierzb0145082017-09-07 02:50:30 +020011# determine whether this is a standalone project or included by other projects
12set(GSL_STANDALONE_PROJECT OFF)
13if (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
14 set(GSL_STANDALONE_PROJECT ON)
15endif ()
16
Anna Gringauze21cb6bb2018-06-15 10:13:11 -070017set(GSL_CXX_STANDARD "14" CACHE STRING "Use c++ standard")
18set(GSL_CXX_STD "cxx_std_${GSL_CXX_STANDARD}")
Anna Gringauzecb2d1af2018-06-07 13:36:56 -070019
Anna Gringauze21cb6bb2018-06-15 10:13:11 -070020if (MSVC)
21 set(GSL_CXX_STD_OPT "-std:c++${GSL_CXX_STANDARD}")
Anna Gringauzecb2d1af2018-06-07 13:36:56 -070022else()
Anna Gringauze21cb6bb2018-06-15 10:13:11 -070023 set(GSL_CXX_STD_OPT "-std=c++${GSL_CXX_STANDARD}")
Anna Gringauzecb2d1af2018-06-07 13:36:56 -070024endif()
25
Tiago8b320e32017-04-25 17:08:36 -070026# when minimum version required is 3.8.0 remove if below
27# both branches do exactly the same thing
Jérémie Delaitre30b16412018-02-14 14:26:44 +130028if (CMAKE_VERSION VERSION_LESS 3.7.9)
Anna Gringauze21cb6bb2018-06-15 10:13:11 -070029 include(CheckCXXCompilerFlag)
30 CHECK_CXX_COMPILER_FLAG("${GSL_CXX_STD_OPT}" COMPILER_SUPPORTS_CXX_STANDARD)
31
32 if(COMPILER_SUPPORTS_CXX_STANDARD)
33 target_compile_options(GSL INTERFACE "${GSL_CXX_STD_OPT}")
Anna Gringauzecb2d1af2018-06-07 13:36:56 -070034 else()
Anna Gringauze21cb6bb2018-06-15 10:13:11 -070035 message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no c++${GSL_CXX_STANDARD} support. Please use a different C++ compiler.")
Tiago8b320e32017-04-25 17:08:36 -070036 endif()
37else ()
Anna Gringauze21cb6bb2018-06-15 10:13:11 -070038 target_compile_features(GSL INTERFACE "${GSL_CXX_STD}")
Tiago8b320e32017-04-25 17:08:36 -070039 # on *nix systems force the use of -std=c++XX instead of -std=gnu++XX (default)
40 set(CMAKE_CXX_EXTENSIONS OFF)
41endif()
42
43# add definitions to the library and targets that consume it
44target_compile_definitions(GSL INTERFACE
45 $<$<CXX_COMPILER_ID:MSVC>:
46 # remove unnecessary warnings about unchecked iterators
47 _SCL_SECURE_NO_WARNINGS
Anna Gringauze21cb6bb2018-06-15 10:13:11 -070048 # remove deprecation warnings about std::uncaught_exception() (from catch)
49 _SILENCE_CXX17_UNCAUGHT_EXCEPTION_DEPRECATION_WARNING
Tiago8b320e32017-04-25 17:08:36 -070050 >
51)
52
53# add include folders to the library and targets that consume it
hannesweisbach0f68d132018-11-29 00:37:59 +010054# the SYSTEM keyword suppresses warnings for users of the library
55if(GSL_STANDALONE_PROJECT)
56 target_include_directories(GSL INTERFACE
57 $<BUILD_INTERFACE:
58 ${CMAKE_CURRENT_SOURCE_DIR}/include
59 >
60 )
61else()
62 target_include_directories(GSL SYSTEM INTERFACE
63 $<BUILD_INTERFACE:
64 ${CMAKE_CURRENT_SOURCE_DIR}/include
65 >
66 )
67endif()
68
Tiago8b320e32017-04-25 17:08:36 -070069
k-bracbe3c3c22019-01-15 01:43:17 +010070if (CMAKE_VERSION VERSION_GREATER 3.7.8)
Rian Quinnd933e512018-04-27 13:56:25 -060071 if (MSVC_IDE)
72 option(VS_ADD_NATIVE_VISUALIZERS "Configure project to use Visual Studio native visualizers" TRUE)
73 else()
74 set(VS_ADD_NATIVE_VISUALIZERS FALSE CACHE INTERNAL "Native visualizers are Visual Studio extension" FORCE)
75 endif()
paweldac210cc082017-11-28 16:31:06 +010076
Rian Quinnd933e512018-04-27 13:56:25 -060077 # add natvis file to the library so it will automatically be loaded into Visual Studio
78 if(VS_ADD_NATIVE_VISUALIZERS)
79 target_sources(GSL INTERFACE
80 ${CMAKE_CURRENT_SOURCE_DIR}/GSL.natvis
81 )
82 endif()
paweldac210cc082017-11-28 16:31:06 +010083endif()
Tiago8b320e32017-04-25 17:08:36 -070084
Casey Carter4e8f95b2017-02-07 15:59:37 -080085install(
86 DIRECTORY include/gsl
87 DESTINATION include
Jason Horsburgh75051112015-11-21 19:13:21 +000088)
89
bfierzb0145082017-09-07 02:50:30 +020090option(GSL_TEST "Generate tests." ${GSL_STANDALONE_PROJECT})
91if (GSL_TEST)
92 enable_testing()
93 add_subdirectory(tests)
94endif ()