Skip to content

Commit

Permalink
enforce standards conformance on MSVC and fix warning flags (#10)
Browse files Browse the repository at this point in the history
* 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
  • Loading branch information
TheLartians authored Apr 15, 2020
1 parent a2a6674 commit a4881dd
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 15 deletions.
9 changes: 6 additions & 3 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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()

Expand All @@ -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>
Expand Down
3 changes: 0 additions & 3 deletions source/greeter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
23 changes: 14 additions & 9 deletions test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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()

0 comments on commit a4881dd

Please sign in to comment.