Skip to content
Snippets Groups Projects
CoverageFunction.cmake 2.86 KiB
Newer Older
  • Learn to ignore specific revisions
  • # CoverageFunction.cmake
    
    # description: find coverage tools and provide function add_coverage_target
    
    #
    # usage: from build directory
    #
    #        cmake .. -DCMAKE_BUILD_TYPE=Debug
    
    #        ctest (or 'make check'  or run BornAgain manually)
    
    #        cmake --build . --config Debug --target coverage
    #
    # author: Jonathan Fisher
    #         j.fisher@fz-juelich.de, jonathan.m.fisher@gmail.com
    #
    
    # copyright: 2016 Scientific Computing Group, Forschungszentrum Juelich GmbH
    
    #
    # license: see LICENSE
    
    find_program(GCOV_COMMAND gcov)
    find_program(LCOV_COMMAND lcov)
    find_program(GENHTML_COMMAND genhtml)
    
    if(GCOV_COMMAND)
    
        message(FATAL_ERROR "could not locate gcov executable, cannot add code coverage custom target!")
    
    endif()
    
    if(LCOV_COMMAND)
    
        message(FATAL_ERROR "could not locate lcov executable, cannot add code coverage custom target!")
    
    endif()
    
    if(GENHTML_COMMAND)
    
        message(FATAL_ERROR "could not locate genhtml executable, cannot add code coverage custom target!")
    
    endif()
    
    if(CMAKE_C_COMPILER_ID STREQUAL "GNU")
    
        string(APPEND CMAKE_C_FLAGS " -coverage")
    
        message(FATAL_ERROR "C compiler is not GNU; don't know how to set code coverage flags!")
    
        string(APPEND CMAKE_CXX_FLAGS " -coverage")
    
        message(FATAL_ERROR "CXX compiler is not GNU; don't know how to set code coverage flags!")
    
    endif()
    
    # function to add a coverage target
    # it will scan the working directory for coverage info, ignoring the directories in ignore_directories
    
    function(add_coverage_target targetname ignore_directories html_dir)
    
    
            message(FATAL_ERROR "gcov not found! aborting")
        endif()
    
            message(FATAL_ERROR "lcov not found! aborting")
        endif()
    
        if(NOT CMAKE_GENHTML_FOUND)
    
            message(FATAL_ERROR "genhtml not found! aborting")
        endif()
    
    
    Wuttke, Joachim's avatar
    Wuttke, Joachim committed
        set(lcov_output ${CMAKE_CURRENT_BINARY_DIR}/${targetname}.info)
    
    
        add_custom_target(${targetname}
            COMMAND ${LCOV_COMMAND} --directory ${CMAKE_CURRENT_BINARY_DIR} --capture --output-file ${lcov_output})
    
        add_custom_target(${targetname}_reset
            COMMAND ${LCOV_COMMAND} --directory ${CMAKE_CURRENT_BINARY_DIR} --zerocounters)
    
        foreach(dirname ${ignore_directories})
            message(STATUS "ignoring dirname = ${dirname} in code coverage")
            add_custom_command(TARGET ${targetname}
                COMMAND ${LCOV_COMMAND} --remove ${lcov_output} ${dirname} --output-file ${lcov_output}.clean
                COMMAND ${CMAKE_COMMAND} -E rename ${lcov_output}.clean ${lcov_output})
        endforeach()
    
        add_custom_command(TARGET ${targetname} POST_BUILD
            COMMAND ${GENHTML_COMMAND} ${lcov_output} --output-directory ${html_dir}
            COMMENT "open index.html in your webbrowser to see the code coverage report.")
    
    
    endfunction()