enforce standards conformance on MSVC and fix warning flags (#10)

* enforce standards conformance on MSVC

* add \W4 flag for test compilation

* enable compiler warnings for the library target when building tests

* update note on testing frameworks

* turns out only clang understands strongly typed enums
This commit is contained in:
Lars Melchior 2020-04-15 09:12:12 +02:00 committed by GitHub
parent a2a6674101
commit a4881dda8b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 20 additions and 15 deletions

View file

@ -10,7 +10,7 @@ project(Greeter
# ---- Include guards ----
if(${PROJECT_SOURCE_DIR} STREQUAL ${PROJECT_BINARY_DIR})
if(PROJECT_SOURCE_DIR STREQUAL PROJECT_BINARY_DIR)
message(FATAL_ERROR "In-source builds not allowed. Please make a new directory (called a build directory) and run CMake from there.")
endif()
@ -35,17 +35,20 @@ CPMAddPackage(
# ---- Create library ----
# Note: for single header libraries create an interface target instead:
# Note: for header-only libraries change all PUBLIC flags to INTERFACE and create an interface target:
# add_library(Greeter INTERFACE)
# set_target_properties(Greeter PROPERTIES INTERFACE_COMPILE_FEATURES cxx_std_17)
add_library(Greeter ${headers} ${sources})
set_target_properties(Greeter PROPERTIES CXX_STANDARD 17)
# beeing a cross-platform target, we enforce enforce standards conformance on MSVC
target_compile_options(Greeter PUBLIC "$<$<BOOL:${MSVC}>:/permissive->")
# Link dependencies (if required)
# target_link_libraries(Greeter PUBLIC cxxopts)
# Note: change PUBLIC to INTERFACE for single header libraries
target_include_directories(Greeter
PUBLIC
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>

View file

@ -6,10 +6,7 @@ Greeter::Greeter(std::string _name) : name(_name) {}
std::string Greeter::greet(LanguageCode lang) const {
switch (lang) {
#if defined(_WIN32) || defined(WIN32)
// this silences a MSVC warning as it does not seem to understand strongly-typed enums
default:
#endif
case LanguageCode::EN:
return "Hello, " + name + "!";
case LanguageCode::DE:

View file

@ -40,26 +40,31 @@ file(GLOB sources CONFIGURE_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/source/*.cpp)
add_executable(GreeterTests ${sources})
target_link_libraries(GreeterTests doctest Greeter)
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR CMAKE_CXX_COMPILER_ID MATCHES "GNU")
set_target_properties(GreeterTests PROPERTIES CXX_STANDARD 17 COMPILE_FLAGS "-Wall -pedantic -Wextra -Werror")
else()
set_target_properties(GreeterTests PROPERTIES CXX_STANDARD 17)
set_target_properties(GreeterTests PROPERTIES CXX_STANDARD 17)
# enable compiler warnings
if (NOT TEST_INSTALLED_VERSION)
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR CMAKE_CXX_COMPILER_ID MATCHES "GNU")
target_compile_options(Greeter PUBLIC -Wall -pedantic -Wextra -Werror)
elseif(MSVC)
target_compile_options(Greeter PUBLIC /W4)
endif()
endif()
# ---- Add GreeterTests ----
ENABLE_TESTING()
# use doctest_discover_tests for better CTest support
# Note: doctest and similar testing frameworks can automatically configure CMake tests
# For other testing frameworks add the tests target instead:
# ADD_TEST(GreeterTests GreeterTests)
include(${doctest_SOURCE_DIR}/scripts/cmake/doctest.cmake)
doctest_discover_tests(GreeterTests)
# Note: for general testing frameworks use:
# ADD_TEST(GreeterTests GreeterTests)
# ---- code coverage ----
if (ENABLE_TEST_COVERAGE)
set_target_properties(Greeter PROPERTIES CXX_STANDARD 17 COMPILE_FLAGS "-O0 -g -fprofile-arcs -ftest-coverage --coverage")
target_compile_options(Greeter PRIVATE -O0 -g -fprofile-arcs -ftest-coverage --coverage)
target_link_options(Greeter PUBLIC "--coverage")
endif()