2017-02-11 02:30:46 +01:00
if ( NOT BASIC_PROJECT_CONFIG_DONE )
2017-03-27 22:12:20 +02:00
message ( FATAL_ERROR "Before including the TestTarget module, the BasicConfig module must be included." )
2017-02-11 02:30:46 +01:00
endif ( )
if ( TEST_CONFIG_DONE )
message ( FATAL_ERROR "Can not include TestTarget module when tests are already configured." )
endif ( )
2016-04-16 00:50:16 +02:00
2017-03-23 20:31:57 +01:00
option ( EXCLUDE_TESTS_FROM_ALL "specifies whether to exclude tests from the \" all\ " target (enabled by default)" ON )
2017-05-23 00:10:27 +02:00
# find and link against cppunit if required (used by all my projects, so it is required by default)
if ( NOT META_NO_CPP_UNIT )
2017-07-22 15:33:41 +02:00
# make cppunit library/include dir configurable
set ( CPP_UNIT_LIB NOTFOUND CACHE FILEPATH "cppunit lib" FORCE )
set ( CPP_UNIT_INCLUDE_DIR NOTFOUND CACHE FILEPATH "cppunit include dir" FORCE )
# set default for minimum version (only checked when using pkg-config)
2017-05-23 00:49:45 +02:00
if ( NOT META_REQUIRED_CPP_UNIT_VERSION )
set ( META_REQUIRED_CPP_UNIT_VERSION 1.13.0 )
endif ( )
2017-07-22 15:33:41 +02:00
# auto-detection: try to find via pkg-config first
if ( NOT CPP_UNIT_LIB AND NOT CPP_UNIT_INCLUDE_DIR )
include ( FindPkgConfig )
pkg_search_module ( CPP_UNIT_CONFIG_ ${ META_PROJECT_NAME } cppunit>= ${ META_REQUIRED_CPP_UNIT_VERSION } )
if ( CPP_UNIT_CONFIG_ ${ META_PROJECT_NAME } _FOUND )
set ( CPP_UNIT_LIB "${CPP_UNIT_CONFIG_${META_PROJECT_NAME}_LDFLAGS_OTHER}" "${CPP_UNIT_CONFIG_${META_PROJECT_NAME}_LIBRARIES}" CACHE FILEPATH "cppunit lib" FORCE )
set ( CPP_UNIT_INCLUDE_DIR ${ CPP_UNIT_CONFIG_${META_PROJECT_NAME } _INCLUDE_DIRS} CACHE FILEPATH "cppunit include dir" FORCE )
link_directories ( ${ CPP_UNIT_CONFIG_${META_PROJECT_NAME } _LIBRARY_DIRS} )
else ( )
# fall back to find_library
find_library ( DETECTED_CPP_UNIT_LIB cppunit )
set ( CPP_UNIT_LIB "${DETECTED_CPP_UNIT_LIB}" CACHE FILEPATH "cppunit lib" FORCE )
endif ( )
2017-05-23 00:49:45 +02:00
endif ( )
2019-01-13 22:01:52 +01:00
if ( NOT CPP_UNIT_LIB )
message ( WARNING "Unable to add test target because cppunit could not be located." )
set ( META_HAVE_TESTS NO )
set ( TEST_CONFIG_DONE YES )
return ( )
endif ( )
list ( APPEND TEST_LIBRARIES "${CPP_UNIT_LIB}" )
if ( NOT CPP_UNIT_CONFIG_ ${ META_PROJECT_NAME } _FOUND )
message ( WARNING "Cppunit not detected via pkg-config so the version couldn't be checked. Required version for ${META_PROJECT_NAME} is ${META_REQUIRED_CPP_UNIT_VERSION}." )
2017-05-23 00:10:27 +02:00
endif ( )
2019-01-13 22:01:52 +01:00
2017-07-22 15:33:41 +02:00
if ( CPP_UNIT_INCLUDE_DIR )
list ( APPEND TEST_INCLUDE_DIRS "${CPP_UNIT_INCLUDE_DIR}" )
endif ( )
2017-05-23 00:10:27 +02:00
endif ( )
2016-04-16 00:50:16 +02:00
2019-01-13 22:14:42 +01:00
# add default cppunit test application if requested
if ( META_ADD_DEFAULT_CPP_UNIT_TEST_APPLICATION )
if ( META_NO_CPP_UNIT )
message ( FATAL_ERROR "Project ${META_PROJECT_NAME} has META_ADD_DEFAULT_CPP_UNIT_TEST_APPLICATION and META_NO_CPP_UNIT enabled at the same time." )
endif ( )
set ( DEFAULT_CPP_UNIT_TEST_APPLICATION_SRC "${CMAKE_CURRENT_BINARY_DIR}/cppunit.cpp" )
file ( WRITE "${DEFAULT_CPP_UNIT_TEST_APPLICATION_SRC}" "#include <c++utilities/tests/cppunit.h>" )
list ( APPEND TEST_SRC_FILES "${DEFAULT_CPP_UNIT_TEST_APPLICATION_SRC}" )
endif ( )
2019-01-13 22:01:52 +01:00
# always link test applications against c++utilities
list ( APPEND TEST_LIBRARIES ${ CPP_UTILITIES_LIB } )
2016-07-30 22:34:31 +02:00
2019-01-13 22:01:52 +01:00
# set compile definitions
if ( NOT META_PUBLIC_SHARED_LIB_COMPILE_DEFINITIONS )
set ( META_PUBLIC_SHARED_LIB_COMPILE_DEFINITIONS ${ META_PUBLIC_COMPILE_DEFINITIONS } ${ META_ADDITIONAL_PUBLIC_SHARED_COMPILE_DEFINITIONS } )
endif ( )
if ( NOT META_PRIVATE_SHARED_LIB_COMPILE_DEFINITIONS )
set ( META_PRIVATE_SHARED_LIB_COMPILE_DEFINITIONS ${ META_PRIVATE_COMPILE_DEFINITIONS } ${ META_ADDITIONAL_PRIVATE_SHARED_COMPILE_DEFINITIONS } )
endif ( )
2016-11-26 13:06:27 +01:00
2019-01-13 22:01:52 +01:00
# add target for test executable, but exclude it from the "all" target when EXCLUDE_TESTS_FROM_ALL is set
if ( EXCLUDE_TESTS_FROM_ALL )
set ( TESTS_EXCLUSION EXCLUDE_FROM_ALL )
else ( )
unset ( TESTS_EXCLUSION )
endif ( )
add_executable ( ${ TARGET_PREFIX } ${ META_PROJECT_NAME } ${ TARGET_SUFFIX } _tests ${ TESTS_EXCLUSION } ${ TEST_HEADER_FILES } ${ TEST_SRC_FILES } )
2016-09-11 20:32:59 +02:00
2019-01-13 22:01:52 +01:00
# add top-level target to build all test targets conveniently, also when excluded from "all" target
if ( NOT TARGET tests )
add_custom_target ( tests DEPENDS ${ TARGET_PREFIX } ${ META_PROJECT_NAME } ${ TARGET_SUFFIX } _tests )
else ( )
add_dependencies ( tests ${ TARGET_PREFIX } ${ META_PROJECT_NAME } ${ TARGET_SUFFIX } _tests )
endif ( )
2017-10-19 16:20:49 +02:00
2019-01-13 22:01:52 +01:00
# handle testing a library (which is default project type)
if ( NOT META_PROJECT_TYPE OR "${META_PROJECT_TYPE}" STREQUAL "library" )
# when testing a library, the test application always needs to link against it
if ( BUILD_SHARED_LIBS )
list ( APPEND TEST_LIBRARIES ${ TARGET_PREFIX } ${ META_PROJECT_NAME } ${ TARGET_SUFFIX } )
message ( STATUS "Linking test target dynamically against ${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}" )
else ( )
list ( APPEND TEST_LIBRARIES ${ TARGET_PREFIX } ${ META_PROJECT_NAME } ${ TARGET_SUFFIX } _static )
message ( STATUS "Linking test target statically against ${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}" )
2016-09-20 19:46:35 +02:00
endif ( )
2019-01-13 22:01:52 +01:00
endif ( )
2017-03-27 22:12:20 +02:00
2019-01-13 22:01:52 +01:00
# handle testing an application
if ( "${META_PROJECT_TYPE}" STREQUAL "application" )
# using functions directly from the tests might be required -> also create a 'testlib' and link tests against it
if ( LINK_TESTS_AGAINST_APP_TARGET )
# create target for the 'testlib'
set ( TESTLIB_FILES ${ HEADER_FILES } ${ SRC_FILES } ${ WIDGETS_FILES } ${ QML_FILES } ${ RES_FILES } ${ QM_FILES } )
list ( REMOVE_ITEM TESTLIB_FILES main.h main.cpp )
add_library ( ${ TARGET_PREFIX } ${ META_PROJECT_NAME } ${ TARGET_SUFFIX } _testlib SHARED ${ TESTLIB_FILES } )
target_link_libraries ( ${ TARGET_PREFIX } ${ META_PROJECT_NAME } ${ TARGET_SUFFIX } _testlib
P U B L I C $ { A C T U A L _ A D D I T I O N A L _ L I N K _ F L A G S } " $ { P U B L I C _ L I B R A R I E S } "
P R I V A T E " $ { P R I V A T E _ L I B R A R I E S } "
)
target_include_directories ( ${ TARGET_PREFIX } ${ META_PROJECT_NAME } ${ TARGET_SUFFIX } _testlib
P U B L I C
$ < B U I L D _ I N T E R F A C E : $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } >
$ < I N S T A L L _ I N T E R F A C E : $ { H E A D E R _ I N S T A L L _ D E S T I N A T I O N } >
$ { P U B L I C _ S H A R E D _ I N C L U D E _ D I R S }
P R I V A T E
" $ { P R I V A T E _ S H A R E D _ I N C L U D E _ D I R S } "
)
target_compile_definitions ( ${ TARGET_PREFIX } ${ META_PROJECT_NAME } ${ TARGET_SUFFIX } _testlib
P U B L I C " $ { M E T A _ P U B L I C _ S H A R E D _ L I B _ C O M P I L E _ D E F I N I T I O N S } "
P R I V A T E " $ { M E T A _ P R I V A T E _ S H A R E D _ L I B _ C O M P I L E _ D E F I N I T I O N S } "
)
target_compile_options ( ${ TARGET_PREFIX } ${ META_PROJECT_NAME } ${ TARGET_SUFFIX } _testlib
P U B L I C " $ { M E T A _ P U B L I C _ S H A R E D _ L I B _ C O M P I L E _ O P T I O N S } "
P R I V A T E " $ { M E T A _ P R I V A T E _ S H A R E D _ L I B _ C O M P I L E _ O P T I O N S } "
)
set_target_properties ( ${ TARGET_PREFIX } ${ META_PROJECT_NAME } ${ TARGET_SUFFIX } _testlib PROPERTIES
C X X _ S T A N D A R D " $ { M E T A _ C X X _ S T A N D A R D } "
L I N K _ S E A R C H _ S T A R T _ S T A T I C $ { S T A T I C _ L I N K A G E }
L I N K _ S E A R C H _ E N D _ S T A T I C $ { S T A T I C _ L I N K A G E }
A U T O G E N _ T A R G E T _ D E P E N D S " $ { A U T O G E N _ D E P S } "
)
if ( CPP_UNIT_CONFIG_ ${ META_PROJECT_NAME } _FOUND )
2017-07-11 22:02:27 +02:00
target_include_directories ( ${ TARGET_PREFIX } ${ META_PROJECT_NAME } ${ TARGET_SUFFIX } _testlib
2019-01-13 22:01:52 +01:00
P R I V A T E " $ { C P P _ U N I T _ C O N F I G _ $ { M E T A _ P R O J E C T _ N A M E } _ I N C L U D E _ D I R S } "
2017-03-27 11:15:14 +02:00
)
2017-06-18 16:14:45 +02:00
target_compile_options ( ${ TARGET_PREFIX } ${ META_PROJECT_NAME } ${ TARGET_SUFFIX } _testlib
2019-01-13 22:01:52 +01:00
P R I V A T E " $ { C P P _ U N I T _ C O N F I G _ $ { M E T A _ P R O J E C T _ N A M E } _ C F L A G S _ O T H E R } "
2017-03-27 11:15:14 +02:00
)
2016-09-20 19:46:35 +02:00
endif ( )
2019-01-13 22:01:52 +01:00
# link tests against it
list ( APPEND TEST_LIBRARIES ${ TARGET_PREFIX } ${ META_PROJECT_NAME } ${ TARGET_SUFFIX } _testlib )
# ensure all symbols are visible (man gcc: "Despite the nomenclature, default always means public")
set_target_properties ( ${ TARGET_PREFIX } ${ META_PROJECT_NAME } ${ TARGET_SUFFIX } _testlib PROPERTIES CXX_VISIBILITY_PRESET default )
2016-08-19 16:13:41 +02:00
endif ( )
2019-01-13 22:01:52 +01:00
endif ( )
2017-03-27 22:12:20 +02:00
2019-01-13 22:01:52 +01:00
# actually apply configuration for test target
target_link_libraries ( ${ TARGET_PREFIX } ${ META_PROJECT_NAME } ${ TARGET_SUFFIX } _tests
P U B L I C $ { A C T U A L _ A D D I T I O N A L _ L I N K _ F L A G S } " $ { P U B L I C _ L I B R A R I E S } "
P R I V A T E " $ { T E S T _ L I B R A R I E S } " " $ { P R I V A T E _ L I B R A R I E S } "
)
target_include_directories ( ${ TARGET_PREFIX } ${ META_PROJECT_NAME } ${ TARGET_SUFFIX } _tests
P U B L I C
$ < B U I L D _ I N T E R F A C E : $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } >
$ < I N S T A L L _ I N T E R F A C E : $ { H E A D E R _ I N S T A L L _ D E S T I N A T I O N } >
$ { P U B L I C _ S H A R E D _ I N C L U D E _ D I R S }
P R I V A T E
$ { T E S T _ I N C L U D E _ D I R S }
" $ { P R I V A T E _ S H A R E D _ I N C L U D E _ D I R S } "
)
target_compile_definitions ( ${ TARGET_PREFIX } ${ META_PROJECT_NAME } ${ TARGET_SUFFIX } _tests
P U B L I C " $ { M E T A _ P U B L I C _ S H A R E D _ L I B _ C O M P I L E _ D E F I N I T I O N S } "
P R I V A T E " $ { M E T A _ P R I V A T E _ S H A R E D _ L I B _ C O M P I L E _ D E F I N I T I O N S } "
)
target_compile_options ( ${ TARGET_PREFIX } ${ META_PROJECT_NAME } ${ TARGET_SUFFIX } _tests
P U B L I C " $ { M E T A _ P U B L I C _ S H A R E D _ L I B _ C O M P I L E _ O P T I O N S } "
P R I V A T E " $ { M E T A _ P R I V A T E _ S H A R E D _ L I B _ C O M P I L E _ O P T I O N S } "
)
set_target_properties ( ${ TARGET_PREFIX } ${ META_PROJECT_NAME } ${ TARGET_SUFFIX } _tests PROPERTIES
C X X _ S T A N D A R D " $ { M E T A _ C X X _ S T A N D A R D } "
L I N K _ S E A R C H _ S T A R T _ S T A T I C $ { S T A T I C _ L I N K A G E }
L I N K _ S E A R C H _ E N D _ S T A T I C $ { S T A T I C _ L I N K A G E }
)
# make the test recognized by ctest
unset ( RUN_TESTS_APPLICATION_ARG )
if ( META_PROJECT_TYPE STREQUAL "application" )
set ( RUN_TESTS_APPLICATION_ARGS -a "$<TARGET_FILE:${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}>" )
endif ( )
if ( NOT META_TEST_TARGET_IS_MANUAL )
add_test ( NAME ${ META_PROJECT_NAME } _run_tests COMMAND
$ { T A R G E T _ P R E F I X } $ { M E T A _ P R O J E C T _ N A M E } $ { T A R G E T _ S U F F I X } _ t e s t s
- p " $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / t e s t f i l e s "
- w " $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / t e s t w o r k i n g d i r "
$ { R U N _ T E S T S _ A P P L I C A T I O N _ A R G S }
2016-09-20 19:46:35 +02:00
)
2019-01-13 22:01:52 +01:00
endif ( )
2017-06-18 16:17:44 +02:00
2019-01-13 22:01:52 +01:00
# enable source code based coverage analysis using clang
if ( CLANG_SOURCE_BASED_COVERAGE_AVAILABLE )
# define path of raw profile data
set ( LLVM_PROFILE_RAW_FILE "${CMAKE_CURRENT_BINARY_DIR}/${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests.profraw" )
# define path of list with additional raw profile data from fork processes spawned during tests
set ( LLVM_PROFILE_RAW_LIST_FILE "${CMAKE_CURRENT_BINARY_DIR}/${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests.profraw.list" )
# define path of merged profile data generated from raw profiling data
set ( LLVM_PROFILE_DATA_FILE "${CMAKE_CURRENT_BINARY_DIR}/${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests.profdata" )
# define paths of output files
set ( COVERAGE_REPORT_FILE "${CMAKE_CURRENT_BINARY_DIR}/${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests_coverage.txt" )
set ( COVERAGE_PER_FILE_REPORT_FILE "${CMAKE_CURRENT_BINARY_DIR}/${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests_coverage_per_file.txt" )
set ( COVERAGE_OVERALL_REPORT_FILE "${CMAKE_CURRENT_BINARY_DIR}/${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests_coverage_overall.txt" )
set ( COVERAGE_HTML_REPORT_FILE "${CMAKE_CURRENT_BINARY_DIR}/${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests_coverage.html" )
set ( COVERAGE_REPORT_FILES "${COVERAGE_REPORT_FILE}" )
# specify where to store raw clang profiling data via environment variable
2018-01-27 23:56:18 +01:00
if ( NOT META_TEST_TARGET_IS_MANUAL )
2019-01-13 22:01:52 +01:00
set_tests_properties ( ${ META_PROJECT_NAME } _run_tests
P R O P E R T I E S E N V I R O N M E N T
" L L V M _ P R O F I L E _ F I L E = $ { L L V M _ P R O F I L E _ R A W _ F I L E } ; L L V M _ P R O F I L E _ L I S T _ F I L E = $ { L L V M _ P R O F I L E _ R A W _ L I S T _ F I L E } "
2018-01-27 23:56:18 +01:00
)
endif ( )
2019-01-13 22:01:52 +01:00
add_custom_command (
O U T P U T " $ { L L V M _ P R O F I L E _ R A W _ F I L E } "
" $ { L L V M _ P R O F I L E _ R A W _ L I S T _ F I L E } "
C O M M A N D " $ { C M A K E _ C O M M A N D } "
- E e n v
" L L V M _ P R O F I L E _ F I L E = $ { L L V M _ P R O F I L E _ R A W _ F I L E } "
" L L V M _ P R O F I L E _ L I S T _ F I L E = $ { L L V M _ P R O F I L E _ R A W _ L I S T _ F I L E } "
$ < T A R G E T _ F I L E : $ { T A R G E T _ P R E F I X } $ { M E T A _ P R O J E C T _ N A M E } $ { T A R G E T _ S U F F I X } _ t e s t s >
- p " $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / t e s t f i l e s "
- w " $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / t e s t w o r k i n g d i r "
$ { R U N _ T E S T S _ A P P L I C A T I O N _ A R G S }
C O M M E N T " E x e c u t i n g $ { T A R G E T _ P R E F I X } $ { M E T A _ P R O J E C T _ N A M E } $ { T A R G E T _ S U F F I X } _ t e s t s t o g e n e r a t e r a w p r o f i l i n g d a t a f o r s o u r c e - b a s e d c o v e r a g e r e p o r t "
D E P E N D S " $ { T A R G E T _ P R E F I X } $ { M E T A _ P R O J E C T _ N A M E } $ { T A R G E T _ S U F F I X } _ t e s t s "
)
find_program ( LLVM_PROFDATA_BIN llvm-profdata )
find_program ( LLVM_COV_BIN llvm-cov )
if ( LLVM_PROFDATA_BIN AND LLVM_COV_BIN )
# merge profiling data
add_custom_command (
O U T P U T " $ { L L V M _ P R O F I L E _ D A T A _ F I L E } "
C O M M A N D c a t " $ { L L V M _ P R O F I L E _ R A W _ L I S T _ F I L E } " | x a r g s
" $ { L L V M _ P R O F D A T A _ B I N } " m e r g e
- o " $ { L L V M _ P R O F I L E _ D A T A _ F I L E } "
- s p a r s e
" $ { L L V M _ P R O F I L E _ R A W _ F I L E } "
C O M M E N T " G e n e r a t i n g p r o f i l i n g d a t a f o r s o u r c e - b a s e d c o v e r a g e r e p o r t "
D E P E N D S " $ { L L V M _ P R O F I L E _ R A W _ F I L E } "
" $ { L L V M _ P R O F I L E _ R A W _ L I S T _ F I L E } "
)
# determine llvm-cov version
execute_process (
C O M M A N D " $ { L L V M _ C O V _ B I N } " - v e r s i o n
O U T P U T _ V A R I A B L E L L V M _ C O V _ V E R S I O N
)
string ( REGEX MATCH "LLVM version ([0-9](.[0-9])*)" LLVM_COV_VERSION "${LLVM_COV_VERSION}" )
if ( CMAKE_MATCH_1 )
set ( LLVM_COV_VERSION "${CMAKE_MATCH_1}" )
else ( )
message ( FATAL_ERROR "Unable to determine version of llvm-cov. Output of ${LLVM_COV_BIN} -version:\n${LLVM_COV_VERSION}" )
endif ( )
# determine the target file for llvm-cov
if ( NOT META_HEADER_ONLY_LIB )
set ( LLVM_COV_TARGET_FILE $< TARGET_FILE:${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX} > $< TARGET_FILE:${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests > )
else ( )
set ( LLVM_COV_TARGET_FILE $< TARGET_FILE:${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests > )
endif ( )
# generate coverage report with statistics per function
unset ( LLVM_COV_ADDITIONAL_OPTIONS )
if ( LLVM_COV_VERSION GREATER_EQUAL 5.0.0 )
# LLVM 5 introduced -show-functions; this is required to get the same behavior as previously (statistics on function-level)
list ( APPEND LLVM_COV_ADDITIONAL_OPTIONS -show-functions )
2018-01-27 23:56:18 +01:00
endif ( )
2017-06-18 16:17:44 +02:00
add_custom_command (
2019-01-13 22:01:52 +01:00
O U T P U T " $ { C O V E R A G E _ R E P O R T _ F I L E } "
C O M M A N D " $ { L L V M _ C O V _ B I N } " r e p o r t
- f o r m a t = t e x t
- s t a t s
- i n s t r - p r o f i l e " $ { L L V M _ P R O F I L E _ D A T A _ F I L E } "
$ { L L V M _ C O V _ A D D I T I O N A L _ O P T I O N S }
$ { L L V M _ C O V _ T A R G E T _ F I L E }
$ { H E A D E R _ F I L E S } $ { S R C _ F I L E S } $ { W I D G E T S _ H E A D E R _ F I L E S } $ { W I D G E T S _ S O U R C E _ F I L E S } $ { Q M L _ H E A D E R _ F I L E S } $ { Q M L _ S O U R C E _ F I L E S }
> " $ { C O V E R A G E _ R E P O R T _ F I L E } "
C O M M E N T " G e n e r a t i n g c o v e r a g e report ( statistics per function ) "
D E P E N D S " $ { L L V M _ P R O F I L E _ D A T A _ F I L E } "
W O R K I N G _ D I R E C T O R Y " $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } "
2017-06-18 16:17:44 +02:00
)
2019-01-13 22:01:52 +01:00
# generate coverage report with statistics per file (only possible with LLVM 5 if source files are specified)
if ( LLVM_COV_VERSION GREATER_EQUAL 5.0.0 )
2017-06-18 16:17:44 +02:00
add_custom_command (
2019-01-13 22:01:52 +01:00
O U T P U T " $ { C O V E R A G E _ P E R _ F I L E _ R E P O R T _ F I L E } "
2017-06-18 16:17:44 +02:00
C O M M A N D " $ { L L V M _ C O V _ B I N } " r e p o r t
- f o r m a t = t e x t
2017-07-09 23:38:11 +02:00
- s t a t s
- i n s t r - p r o f i l e " $ { L L V M _ P R O F I L E _ D A T A _ F I L E } "
2017-11-15 19:13:36 +01:00
$ { L L V M _ C O V _ T A R G E T _ F I L E }
2017-07-09 23:38:11 +02:00
$ { H E A D E R _ F I L E S } $ { S R C _ F I L E S } $ { W I D G E T S _ H E A D E R _ F I L E S } $ { W I D G E T S _ S O U R C E _ F I L E S } $ { Q M L _ H E A D E R _ F I L E S } $ { Q M L _ S O U R C E _ F I L E S }
2019-01-13 22:01:52 +01:00
> " $ { C O V E R A G E _ P E R _ F I L E _ R E P O R T _ F I L E } "
C O M M E N T " G e n e r a t i n g c o v e r a g e report ( statistics per file ) "
2017-06-20 23:19:49 +02:00
D E P E N D S " $ { L L V M _ P R O F I L E _ D A T A _ F I L E } "
2017-07-09 23:38:11 +02:00
W O R K I N G _ D I R E C T O R Y " $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } "
2017-06-18 16:17:44 +02:00
)
2019-01-13 22:01:52 +01:00
list ( APPEND COVERAGE_REPORT_FILES "${COVERAGE_PER_FILE_REPORT_FILE}" )
2017-06-18 16:17:44 +02:00
endif ( )
2019-01-13 22:01:52 +01:00
# add target for the coverage reports
add_custom_target ( "${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests_coverage_summary"
D E P E N D S $ { C O V E R A G E _ R E P O R T _ F I L E S }
)
# generate coverage overall report (total region/line coverage)
# NOTE: added before release of LLVM 5 where coverage report with statistics per file could not be generated
set ( OVERALL_COVERAGE_AKW_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/tests/calculateoverallcoverage.awk" )
if ( CPP_UTILITIES_SOURCE_DIR AND NOT EXISTS "${OVERALL_COVERAGE_AKW_SCRIPT}" )
set ( OVERALL_COVERAGE_AKW_SCRIPT "${CPP_UTILITIES_SOURCE_DIR}/tests/calculateoverallcoverage.awk" )
endif ( )
if ( NOT EXISTS "${OVERALL_COVERAGE_AKW_SCRIPT}" )
set ( OVERALL_COVERAGE_AKW_SCRIPT "${CPP_UTILITIES_CONFIG_DIRS}/tests/calculateoverallcoverage.awk" )
endif ( )
add_custom_command (
O U T P U T " $ { C O V E R A G E _ O V E R A L L _ R E P O R T _ F I L E } "
C O M M A N D a w k
- f " $ { O V E R A L L _ C O V E R A G E _ A K W _ S C R I P T } " " $ { C O V E R A G E _ R E P O R T _ F I L E } "
> " $ { C O V E R A G E _ O V E R A L L _ R E P O R T _ F I L E } "
C O M M E N T " G e n e r a t i n g c o v e r a g e report ( overall figures ) "
D E P E N D S " $ { O V E R A L L _ C O V E R A G E _ A K W _ S C R I P T } " " $ { C O V E R A G E _ R E P O R T _ F I L E } "
)
add_custom_target ( "${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests_coverage_overall_summary"
D E P E N D S " $ { C O V E R A G E _ O V E R A L L _ R E P O R T _ F I L E } "
)
# generate HTML document showing covered/uncovered code
add_custom_command (
O U T P U T " $ { C O V E R A G E _ H T M L _ R E P O R T _ F I L E } "
C O M M A N D " $ { L L V M _ C O V _ B I N } " s h o w
- p r o j e c t - t i t l e = " $ { M E T A _ A P P _ N A M E } "
- f o r m a t = h t m l
- i n s t r - p r o f i l e " $ { L L V M _ P R O F I L E _ D A T A _ F I L E } "
$ { L L V M _ C O V _ T A R G E T _ F I L E }
$ { H E A D E R _ F I L E S } $ { S R C _ F I L E S } $ { W I D G E T S _ F I L E S } $ { Q M L _ F I L E S }
> " $ { C O V E R A G E _ H T M L _ R E P O R T _ F I L E } "
C O M M E N T " G e n e r a t i n g H T M L d o c u m e n t s h o w i n g c o v e r e d / u n c o v e r e d c o d e "
D E P E N D S " $ { L L V M _ P R O F I L E _ D A T A _ F I L E } "
W O R K I N G _ D I R E C T O R Y " $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } "
)
add_custom_target ( "${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests_coverage_html"
D E P E N D S " $ { C O V E R A G E _ H T M L _ R E P O R T _ F I L E } "
)
# create target for all coverage docs
add_custom_target ( "${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests_coverage"
D E P E N D S $ { C O V E R A G E _ R E P O R T _ F I L E S }
D E P E N D S " $ { C O V E R A G E _ O V E R A L L _ R E P O R T _ F I L E } "
D E P E N D S " $ { C O V E R A G E _ H T M L _ R E P O R T _ F I L E } "
)
# add targets to global coverage target
if ( NOT TARGET coverage )
add_custom_target ( coverage )
endif ( )
add_dependencies ( coverage "${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests_coverage" )
else ( )
message ( FATAL_ERROR "Unable to generate target for coverage report because llvm-profdata and llvm-cov are not available." )
2017-06-18 16:17:44 +02:00
endif ( )
2019-01-13 22:01:52 +01:00
endif ( )
2017-06-18 16:17:44 +02:00
2019-01-13 22:01:52 +01:00
# add the test executable to the dependencies of the check target
if ( NOT META_TEST_TARGET_IS_MANUAL )
add_dependencies ( check ${ TARGET_PREFIX } ${ META_PROJECT_NAME } ${ TARGET_SUFFIX } _tests )
2016-07-16 23:04:22 +02:00
endif ( )
2017-02-11 02:30:46 +01:00
2019-01-13 22:01:52 +01:00
set ( META_HAVE_TESTS YES )
2017-02-11 02:30:46 +01:00
set ( TEST_CONFIG_DONE YES )