diff --git a/CMakeLists.txt b/CMakeLists.txt index 4b96546..e4e4e48 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,6 +2,49 @@ cmake_minimum_required(VERSION 2.8.7) project(GSL CXX) +# creates a library GSL which is an interface (header files only) +add_library(GSL INTERFACE) + +# when minimum version required is 3.8.0 remove if below +# both branches do exactly the same thing +if ( CMAKE_MAJOR_VERSION VERSION_LESS 3.7.9) + if (NOT MSVC) + include(CheckCXXCompilerFlag) + CHECK_CXX_COMPILER_FLAG("-std=c++14" COMPILER_SUPPORTS_CXX14) + if(COMPILER_SUPPORTS_CXX14) + target_compile_options(GSL INTERFACE "-std=c++14") + else() + message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no C++14 support. Please use a different C++ compiler.") + endif() + + endif() +else () + # set the GSL library to be compiled only with c++14 + target_compile_features(GSL INTERFACE cxx_std_14) + # on *nix systems force the use of -std=c++XX instead of -std=gnu++XX (default) + set(CMAKE_CXX_EXTENSIONS OFF) +endif() + +# add definitions to the library and targets that consume it +target_compile_definitions(GSL INTERFACE + $<$: + # remove unnecessary warnings about unchecked iterators + _SCL_SECURE_NO_WARNINGS + > +) + +# add include folders to the library and targets that consume it +target_include_directories(GSL INTERFACE + $ +) + +# add natvis file to the library so it will automatically be loaded into Visual Studio +target_sources(GSL INTERFACE + ${CMAKE_CURRENT_SOURCE_DIR}/GSL.natvis +) + install( DIRECTORY include/gsl DESTINATION include diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index b56cc26..eb08360 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -2,43 +2,70 @@ cmake_minimum_required(VERSION 2.8.7) project(GSLTests CXX) -if (NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/unittest-cpp/tests) - execute_process(COMMAND git submodule update --init WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}") +# will make visual studio generated project group files +set_property(GLOBAL PROPERTY USE_FOLDERS ON) + +if (NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/unittest-cpp/CMakeLists.txt) + find_package(Git) + execute_process( + COMMAND ${GIT_EXECUTABLE} submodule update --init + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" + ) endif() add_subdirectory(unittest-cpp) -include_directories( - ../include +# this interface adds compile options to how the tests are run +# please try to keep entries ordered =) +add_library(gsl_tests_config INTERFACE) +target_compile_options(gsl_tests_config INTERFACE + $<$: + /EHsc + /W4 + /WX + > + $<$>: + -fno-strict-aliasing + -Wall + -Wcast-align + -Wconversion + -Wctor-dtor-privacy + -Werror + -Wextra + -Wno-missing-braces + -Wnon-virtual-dtor + -Wold-style-cast + -Woverloaded-virtual + -Wpedantic + -Wshadow + -Wsign-conversion + > +) + +# set test to include the unittest-cpp headers +# this shiuld be removed when UnitTest++ has the proper headers +target_include_directories(gsl_tests_config INTERFACE ./unittest-cpp ) -add_definitions(-DGSL_THROW_ON_CONTRACT_VIOLATION) - -if(MSVC) # has the support we need - # remove unnecessary warnings about unchecked iterators - add_definitions(-D_SCL_SECURE_NO_WARNINGS) - add_compile_options(/EHsc /W4 /WX) -else() - include(CheckCXXCompilerFlag) - CHECK_CXX_COMPILER_FLAG("-std=c++14" COMPILER_SUPPORTS_CXX14) - CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11) - if(COMPILER_SUPPORTS_CXX14) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-strict-aliasing -std=c++14 -Werror -Wall -Wextra -Wpedantic -Wno-missing-braces -Wconversion -Wsign-conversion -Wctor-dtor-privacy -Wshadow -Wnon-virtual-dtor -Wold-style-cast -Wcast-align -Woverloaded-virtual") - elseif(COMPILER_SUPPORTS_CXX11) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-strict-aliasing -std=c++11 -Werror -Wall -Wextra -Wpedantic -Wno-missing-braces -Wconversion -Wsign-conversion -Wctor-dtor-privacy -Wshadow -Wnon-virtual-dtor -Wold-style-cast -Wcast-align -Woverloaded-virtual") - else() - message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.") - endif() -endif() +# set definitions for tests +target_compile_definitions(gsl_tests_config INTERFACE + GSL_THROW_ON_CONTRACT_VIOLATION +) function(add_gsl_test name) add_executable(${name} ${name}.cpp) - target_link_libraries(${name} UnitTest++) + target_link_libraries(${name} + UnitTest++ + GSL + gsl_tests_config + ) add_test( ${name} ${name} ) + # group all tests under GSL_tests + set_property(TARGET ${name} PROPERTY FOLDER "GSL_tests") endfunction() add_gsl_test(span_tests)