better-enums/test/CMakeLists.txt
Anton Bachin cc9cce28ae Enabled more warnings during testing.
To avoid problems with warnings in CxxTest, the extra warnings are
enabled during one test (linking) that does not use CxxTest.

Resolves #16.
2016-02-27 00:53:35 -06:00

204 lines
6.4 KiB
CMake

# Invoked automatically by the Makefile.
cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
project("Better Enums Testing" CXX)
# Detect compiler feature support.
list(FIND CMAKE_CXX_COMPILE_FEATURES cxx_constexpr CONSTEXPR_INDEX)
if(CONSTEXPR_INDEX EQUAL -1)
set(SUPPORTS_CONSTEXPR 0)
else()
set(SUPPORTS_CONSTEXPR 1)
endif()
list(FIND CMAKE_CXX_COMPILE_FEATURES cxx_relaxed_constexpr
RELAXED_CONSTEXPR_INDEX)
if(RELAXED_CONSTEXPR_INDEX EQUAL -1)
set(SUPPORTS_RELAXED_CONSTEXPR 0)
else()
set(SUPPORTS_RELAXED_CONSTEXPR 1)
endif()
# Current versions of CMake report VS2015 as supporting constexpr. However, the
# support is too buggy to build Better Enums. Avoid trying to build constexpr
# configurations on MSVC.
if(${CMAKE_CXX_COMPILER_ID} STREQUAL MSVC)
set(SUPPORTS_CONSTEXPR 0)
set(SUPPORTS_RELAXED_CONSTEXPR 0)
endif()
list(FIND CMAKE_CXX_COMPILE_FEATURES cxx_strong_enums ENUM_CLASS_INDEX)
if(ENUM_CLASS_INDEX EQUAL -1)
set(SUPPORTS_ENUM_CLASS 0)
else()
set(SUPPORTS_ENUM_CLASS 1)
endif()
# Not supporting C++11 usage on g++46 due to buggy constexpr.
if(CMAKE_COMPILER_IS_GNUCXX AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.7)
set(SUPPORTS_CONSTEXPR 0)
set(SUPPORTS_ENUM_CLASS 0)
endif()
# Not supporting C++14 testing on clang++34 due to buggy library installed in
# Travis Ubuntu image.
if(CMAKE_CXX_COMPILER_ID STREQUAL Clang
AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.5)
set(SUPPORTS_RELAXED_CONSTEXPR 0)
endif()
# Select standard based on the requested configuration. If the compiler does not
# support the requested configuration, write a message and generate a no-op
# build. This condition is not a failure.
#
# If no configuration is explicitly requested, default to compiling with no
# special flags, with the latest standard supported by the compiler.
set(DO_NOT_TEST_FILE "${CMAKE_BINARY_DIR}/do-not-test")
if(CONFIGURATION STREQUAL CONSTEXPR)
if(SUPPORTS_CONSTEXPR)
set(CMAKE_CXX_STANDARD 11)
else()
message(WARNING "This compiler does not support constexpr")
file(WRITE "${DO_NOT_TEST_FILE}")
return()
endif()
elseif(CONFIGURATION STREQUAL FULL_CONSTEXPR)
if(SUPPORTS_CONSTEXPR)
set(CMAKE_CXX_STANDARD 11)
add_definitions(-DBETTER_ENUMS_CONSTEXPR_TO_STRING)
else()
message(WARNING "This compiler does not support constexpr")
file(WRITE "${DO_NOT_TEST_FILE}")
return()
endif()
elseif(CONFIGURATION STREQUAL STRICT_CONVERSION)
if(SUPPORTS_ENUM_CLASS)
set(CMAKE_CXX_STANDARD 11)
add_definitions(-DBETTER_ENUMS_STRICT_CONVERSION)
else()
message(WARNING "This compiler does not support enum class")
file(WRITE "${DO_NOT_TEST_FILE}")
return()
endif()
elseif(CONFIGURATION STREQUAL CXX98)
set(CMAKE_CXX_STANDARD 98)
elseif(CONFIGURATION STREQUAL CXX14)
if(SUPPORTS_RELAXED_CONSTEXPR)
set(CMAKE_CXX_STANDARD 14)
else()
message(WARNING "This compiler does not support relaxed constexpr")
file(WRITE "${DO_NOT_TEST_FILE}")
return()
endif()
else()
set(CMAKE_CXX_STANDARD 11)
endif()
# Basic tests.
add_executable(cxxtest cxxtest/tests.cc)
add_executable(linking linking/helper.cc linking/main.cc)
set(PERFORMANCE_TESTS
1-simple 2-include_empty 3-only_include_enum 4-declare_enums 5-iostream)
foreach(TEST ${PERFORMANCE_TESTS})
add_executable(performance-${TEST} performance/${TEST}.cc)
endforeach(TEST)
# Select examples to build.
set(EXAMPLES
1-hello-world 2-conversions 3-iterate 4-switch 6-iostreams 7-safety
8-representation 9-constexpr 101-special-values 103-bitset 104-quine
105-c++17-reflection)
set(SKIPPED_FOR_CXX98
5-map 9-constexpr 101-special-values 103-bitset 104-quine
105-c++17-reflection)
set(SKIPPED_FOR_STRICT_CONVERSION 4-switch)
if(CONFIGURATION STREQUAL CXX98 OR NOT SUPPORTS_CONSTEXPR)
list(REMOVE_ITEM EXAMPLES ${SKIPPED_FOR_CXX98})
endif()
if(CONFIGURATION STREQUAL STRICT_CONVERSION)
list(REMOVE_ITEM EXAMPLES ${SKIPPED_FOR_STRICT_CONVERSION})
endif()
if(CONFIGURATION STREQUAL CXX14)
set(EXAMPLES 5-map)
endif()
foreach(EXAMPLE ${EXAMPLES})
add_executable(example-${EXAMPLE} ../example/${EXAMPLE}.cc)
endforeach(EXAMPLE)
# Add compiler flags.
include_directories(..)
include_directories(../extra)
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES Clang)
include(CheckCXXCompilerFlag)
macro(add_cxx_flag_if_supported FLAG)
check_cxx_compiler_flag("${FLAG}" HAVE_FLAG_${FLAG})
if(HAVE_FLAG_${FLAG})
add_definitions(${FLAG})
endif()
endmacro()
macro(add_cxx_flag_to_target_if_supported TARGET FLAG)
string(REPLACE "=" "_equals_" ESCAPED ${FLAG})
string(REPLACE "+" "_plus_" ESCAPED ${ESCAPED})
check_cxx_compiler_flag("${FLAG}" HAVE_FLAG_${FLAG})
if(HAVE_FLAG_${FLAG})
get_target_property(FLAGS ${TARGET} COMPILE_FLAGS)
if(${FLAGS} STREQUAL "FLAGS-NOTFOUND")
set(FLAGS "")
endif()
set_target_properties(
${TARGET} PROPERTIES COMPILE_FLAGS "${FLAGS} ${FLAG}")
endif()
endmacro()
add_cxx_flag_if_supported("-Wpedantic")
add_cxx_flag_if_supported("-Wall")
add_cxx_flag_if_supported("-Wextra")
add_cxx_flag_if_supported("-Wno-variadic-macros")
add_cxx_flag_if_supported("-Wno-unused-const-variable")
add_cxx_flag_to_target_if_supported(linking "-Weverything")
add_cxx_flag_to_target_if_supported(linking "-Wno-c++98-compat-pedantic")
add_cxx_flag_to_target_if_supported(linking "-Wno-padded")
add_cxx_flag_to_target_if_supported(linking "-Wno-global-constructors")
add_cxx_flag_to_target_if_supported(linking "-Wno-old-style-cast")
add_cxx_flag_to_target_if_supported(linking "-Wno-missing-prototypes")
add_cxx_flag_to_target_if_supported(linking "-Wshadow")
add_cxx_flag_to_target_if_supported(linking "-Weffc++")
add_cxx_flag_to_target_if_supported(linking "-Wstrict-aliasing")
add_cxx_flag_to_target_if_supported(linking "-Wformat")
add_cxx_flag_to_target_if_supported(linking "-Wmissing-include-dirs")
add_cxx_flag_to_target_if_supported(linking "-Wsync-nand")
add_cxx_flag_to_target_if_supported(linking "-Wconditionally-supported")
add_cxx_flag_to_target_if_supported(linking "-Wconversion")
add_cxx_flag_to_target_if_supported(linking "-Wuseless-cast")
add_definitions("-Werror")
endif()