From a4881dda8b4c3d9e92ebd5a895d72838f28f509c Mon Sep 17 00:00:00 2001 From: Lars Melchior Date: Wed, 15 Apr 2020 09:12:12 +0200 Subject: [PATCH] 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 --- CMakeLists.txt | 9 ++++++--- source/greeter.cpp | 3 --- test/CMakeLists.txt | 23 ++++++++++++++--------- 3 files changed, 20 insertions(+), 15 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f2332cd..2913c6b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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 "$<$:/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 $ diff --git a/source/greeter.cpp b/source/greeter.cpp index 6295269..e75363f 100644 --- a/source/greeter.cpp +++ b/source/greeter.cpp @@ -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: diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 9b4ce42..74109f6 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -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()