Commit 839d6b09 authored by Michael Tesch's avatar Michael Tesch
Browse files

Fix build defaults and coverage infrastructure

parent b47121b4
Loading
Loading
Loading
Loading
+14 −12
Original line number Diff line number Diff line
@@ -3,13 +3,13 @@
#
cmake_minimum_required (VERSION 3.14)
project (cppduals
  VERSION 0.7.3
  VERSION 0.7.4
  LANGUAGES C CXX
  )
include (GNUInstallDirs)

if (NOT CMAKE_CXX_STANDARD)
  set (CMAKE_CXX_STANDARD 20 CACHE STRING "Which C++ standard to test against.")
  set (CMAKE_CXX_STANDARD 17 CACHE STRING "Which C++ standard to test against.")
endif()
message (STATUS "CXX_STANDARD: ${CMAKE_CXX_STANDARD}")
set (CMAKE_CXX_STANDARD_REQUIRED ON)
@@ -150,21 +150,23 @@ if (CPPDUALS_CODE_COVERAGE AND NOT CPPDUALS_TESTING)
  message(FATAL_ERROR "CPPDUALS_CODE_COVERAGE requires CPPDUALS_TESTING to be enabled")
endif()
if (CPPDUALS_CODE_COVERAGE)
  if (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
    message(STATUS "Enabling coverage reporting")
    # Add required flags (GCC & LLVM/Clang)
  if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
    message(STATUS "Enabling coverage reporting (Clang)")
    target_compile_options (cppduals_coverage_config INTERFACE
      -O0        # no optimization
      -g         # generate debug info
      --coverage # sets all required flags
      -fprofile-arcs 
      -ftest-coverage
      -O0 -g -fprofile-instr-generate -fcoverage-mapping
    )
    target_link_options (cppduals_coverage_config INTERFACE
      -fprofile-instr-generate
    )
  elseif (CMAKE_CXX_COMPILER_ID MATCHES "GNU")
    message(STATUS "Enabling coverage reporting (GCC)")
    target_compile_options (cppduals_coverage_config INTERFACE
      -O0 -g --coverage -fprofile-arcs -ftest-coverage
    )
    target_link_options (cppduals_coverage_config INTERFACE
      --coverage
    )
  else()
    # error out if coverage is enabled but compiler is not supported
    message(FATAL_ERROR "Coverage reporting is disabled for unknown compilers.")
  endif ()
endif ()
+17 −5
Original line number Diff line number Diff line
@@ -62,6 +62,7 @@ set (ALL_TESTS
  example
  )
set (ALL_TEST_BINS )
set (ALL_TEST_BIN_PATHS )
foreach (TEST_ ${ALL_TESTS})
  foreach (PHASE 1 2 3 4 5)
    # check if file has phase defined
@@ -74,6 +75,7 @@ foreach (TEST_ ${ALL_TESTS})
    set (TEST ${TEST_}_${PHASE})
    message ("Adding test ${TEST}")
    set (ALL_TEST_BINS ${ALL_TEST_BINS} ${TEST})
    set (ALL_TEST_BIN_PATHS ${ALL_TEST_BIN_PATHS} $<TARGET_FILE:${TEST}>)

    add_executable (${TEST} ${TEST_}.cpp)
    set (PHASE_FLAGS ${OPT_FLAGS} -DPHASE_${PHASE})
@@ -262,27 +264,37 @@ if (CPPDUALS_CODE_COVERAGE)
    set(LLVM_COV_PATH ${CMAKE_CXX_COMPILER_DIR}/llvm-cov)
    set(LLVM_PROFDATA_PATH ${CMAKE_CXX_COMPILER_DIR}/llvm-profdata)
    if(NOT EXISTS ${LLVM_COV_PATH})
      find_program(LLVM_COV_PATH llvm-cov REQUIRED)
      find_program(LLVM_COV_PATH llvm-cov)
    endif()
    if(NOT EXISTS ${LLVM_PROFDATA_PATH})
      find_program(LLVM_PROFDATA_PATH llvm-profdata REQUIRED)
      find_program(LLVM_PROFDATA_PATH llvm-profdata)
    endif()
    # On macOS, llvm tools live in the Xcode toolchain; use xcrun to find them
    if(NOT EXISTS ${LLVM_COV_PATH} AND APPLE)
      execute_process(COMMAND xcrun -f llvm-cov OUTPUT_VARIABLE LLVM_COV_PATH OUTPUT_STRIP_TRAILING_WHITESPACE)
    endif()
    if(NOT EXISTS ${LLVM_PROFDATA_PATH} AND APPLE)
      execute_process(COMMAND xcrun -f llvm-profdata OUTPUT_VARIABLE LLVM_PROFDATA_PATH OUTPUT_STRIP_TRAILING_WHITESPACE)
    endif()
    if(NOT EXISTS ${LLVM_COV_PATH} OR NOT EXISTS ${LLVM_PROFDATA_PATH})
      message(FATAL_ERROR "Could not find llvm-cov and llvm-profdata")
    endif()
    
    add_custom_target(cov
      DEPENDS ${ALL_TEST_BINS}
      COMMAND ${CMAKE_COMMAND} -E remove_directory coverage/profraw
      COMMAND ${CMAKE_COMMAND} -E make_directory coverage/profraw
      COMMAND ${CMAKE_COMMAND} --build . --target test "LLVM_PROFILE_FILE=coverage/profraw/%p.profraw"
      COMMAND ${CMAKE_COMMAND} -E env "LLVM_PROFILE_FILE=${CMAKE_BINARY_DIR}/coverage/profraw/%p.profraw" ctest --output-on-failure
      COMMAND ${LLVM_PROFDATA_PATH} merge -sparse coverage/profraw/*.profraw -o coverage/coverage.profdata
      COMMAND ${LLVM_COV_PATH} show
        -instr-profile=coverage/coverage.profdata
        -format=html -output-dir=coverage/html
        -show-line-counts-or-regions
        -show-instantiation-summary
        ${ALL_TEST_BINS}
        ${ALL_TEST_BIN_PATHS}
      COMMAND ${LLVM_COV_PATH} report
        -instr-profile=coverage/coverage.profdata
        ${ALL_TEST_BINS}
        ${ALL_TEST_BIN_PATHS}
      WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
    )
  elseif(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
+16 −0
Original line number Diff line number Diff line
@@ -665,6 +665,22 @@ TEST(non_class, putto) {
    s << 2 + 3_el;
    EXPECT_EQ(s.str(), "(2+3_el)");
  }
  // negative dual part (covers the sign branch)
  {
    std::stringstream s;
    s << 2 - 3_ef;
    EXPECT_EQ(s.str(), "(2-3_ef)");
  }
  {
    std::stringstream s;
    s << 2 - 3_e;
    EXPECT_EQ(s.str(), "(2-3_e)");
  }
  {
    std::stringstream s;
    s << 2 - 3_el;
    EXPECT_EQ(s.str(), "(2-3_el)");
  }
#if 0 // seems reasonable
  {
    std::stringstream s;
+3 −9
Original line number Diff line number Diff line
@@ -54,15 +54,9 @@ include(GoogleTest)
#
# Eigen
#
if (TRUE)
  set (EIGEN_URL https://gitlab.com/libeigen/eigen/-/archive/3.3.8/eigen-3.3.8.tar.bz2)
  set (EIGEN_MD5 432ef01499d514f4606343276afa0ec3)
  set (EIGEN_MAX_CXX 17)
else ()
set (EIGEN_URL https://gitlab.com/libeigen/eigen/-/archive/3.3.7/eigen-3.3.7.tar.bz2)
set (EIGEN_MD5 b9e98a200d2455f06db9c661c5610496)
set (EIGEN_MAX_CXX 17)
endif ()
#
# Eigen
#