Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/extend build dependency #80

Merged
Prev Previous commit
Next Next commit
back to version 1.0
respect most review comments
  • Loading branch information
ClausKlein committed Feb 11, 2021
commit f158b9ca9c84ba60632ebfede139f5d09326e14a
20 changes: 10 additions & 10 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
# Note: update this to your new project's name and version
project(
Greeter
VERSION 1.1
VERSION 1.0
LANGUAGES CXX
)

Expand Down Expand Up @@ -41,12 +41,11 @@ CPMAddPackage(
# Note: If fmt is not imported, this is needed to prevent: CMake Error: install(EXPORT
# "GreeterTargets" ...) includes target "Greeter" which requires target "fmt" that is not in any
# export set. see too https://gitlab.kitware.com/cmake/cmake/-/issues/15415
set(FMT_VERSION 7.1.3)
CPMAddPackage(
NAME fmt
GIT_TAG ${FMT_VERSION}
GITHUB_REPOSITORY fmtlib/fmt
# XXX OPTION "FMT_INSTALL YES"
GIT_TAG 7.1.3
GITHUB_REPOSITORY fmtlib/fmt # to get an installable target
OPTION "FMT_INSTALL YES"
)

# ---- Add source files ----
Expand All @@ -59,11 +58,11 @@ file(GLOB_RECURSE sources CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/source/
# ---- Create library ----

# Note: for header-only libraries change all PUBLIC flags to INTERFACE and create an interface
# target: add_library(Greeter INTERFACE)
add_library(Greeter)
target_compile_features(Greeter PUBLIC cxx_std_17)
# target! EITHER: add_library(Greeter INTERFACE) OR:
ClausKlein marked this conversation as resolved.
Show resolved Hide resolved
add_library(Greeter ${headers} ${sources})

target_sources(Greeter PRIVATE ${headers} ${sources})
set_target_properties(Greeter PROPERTIES CXX_STANDARD ${CMAKE_CXX_STANDARD})
# OR target_compile_features(Greeter PUBLIC cxx_std_17)

# being a cross-platform target, we enforce standards conformance on MSVC
if(MSVC)
Expand Down Expand Up @@ -94,5 +93,6 @@ packageProject(
INCLUDE_DIR ${PROJECT_SOURCE_DIR}/include
INCLUDE_DESTINATION include/${PROJECT_NAME}-${PROJECT_VERSION}
VERSION_HEADER "${VERSION_HEADER_LOCATION}"
# XXX DEPENDENCIES "fmt ${FMT_VERSION}"
# TODO COMPATIBILITY SameMajorVersion
DEPENDENCIES "fmt 7.1.3"
)
23 changes: 11 additions & 12 deletions test/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,10 +1,6 @@
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)

project(
GreeterTests
VERSION 1.1
LANGUAGES CXX
)
project(GreeterTests LANGUAGES CXX)

# ---- Options ----

Expand Down Expand Up @@ -43,16 +39,16 @@ CPMAddPackage(

file(GLOB sources CONFIGURE_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/source/*.cpp)
add_executable(GreeterTests ${sources})
target_link_libraries(GreeterTests doctest Greeter::Greeter)
target_link_libraries(GreeterTests doctest::doctest Greeter::Greeter)

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 PRIVATE -Wall -pedantic -Wextra -Werror)
target_compile_options(Greeter PUBLIC -Wall -Wpedantic -Wextra -Werror)
elseif(MSVC)
target_compile_options(Greeter PRIVATE /W4 /WX)
target_compile_options(Greeter PUBLIC /W4 /WX)
target_compile_definitions(GreeterTests PUBLIC DOCTEST_CONFIG_USE_STD_HEADERS)
endif()
endif()
Expand All @@ -63,13 +59,16 @@ enable_testing()

# 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)
# Warning: if doctest is imported with find_package() this will fail! CK
if(DEFINED doctest_SOURCE_DIR)
include(${doctest_SOURCE_DIR}/scripts/cmake/doctest.cmake)
doctest_discover_tests(GreeterTests)
else()
add_test(greeterTests GreeterTests)
endif()

# ---- code coverage ----

if(ENABLE_TEST_COVERAGE AND NOT TEST_INSTALLED_VERSION)
if(ENABLE_TEST_COVERAGE)
target_compile_options(Greeter PUBLIC -O0 -g -fprofile-arcs -ftest-coverage)
target_link_options(Greeter PUBLIC -fprofile-arcs -ftest-coverage)
endif()
9 changes: 7 additions & 2 deletions test/source/greeter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,13 @@ TEST_CASE("Greeter") {
}

TEST_CASE("Greeter version") {
static_assert(std::string_view(GREETER_VERSION) == std::string_view("1.1"));
CHECK(std::string(GREETER_VERSION) == std::string("1.1"));
#if (__cpp_lib_starts_ends_with)
static_assert(std::string_view(GREETER_VERSION).starts_with("1.0")); // TBD C++20 only
CHECK(std::string(GREETER_VERSION).starts_with("1.0")); // SameMajorVersion
#else
static_assert(std::string_view(GREETER_VERSION) == std::string_view("1.0"));
CHECK(std::string(GREETER_VERSION) == std::string("1.0"));
#endif
}

TEST_CASE("Greeter date") {
Expand Down