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-05-23 00:49:45 +02:00
if ( NOT META_REQUIRED_CPP_UNIT_VERSION )
set ( META_REQUIRED_CPP_UNIT_VERSION 1.13.0 )
endif ( )
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}" )
link_directories ( ${ CPP_UNIT_CONFIG_${META_PROJECT_NAME } _LIBRARY_DIRS} )
elseif ( NOT CPP_UNIT_LIB )
find_library ( CPP_UNIT_LIB cppunit )
endif ( )
2017-05-23 00:10:27 +02:00
if ( CPP_UNIT_LIB )
list ( APPEND TEST_LIBRARIES ${ CPP_UNIT_LIB } )
2017-05-23 00:49:45 +02:00
if ( NOT CPP_UNIT_CONFIG_ ${ META_PROJECT_NAME } _FOUND )
message ( WARNING "Unable to find cppunit via pkg-config so the version couldn't be checked. Required version for ${META_PROJECT_NAME} is ${META_REQUIRED_CPP_UNIT_VERSION}." )
endif ( )
2017-05-23 00:10:27 +02:00
endif ( )
endif ( )
2016-04-16 00:50:16 +02:00
2017-05-23 00:10:27 +02:00
if ( CPP_UNIT_LIB OR META_NO_CPP_UNIT )
# always link test applications against c++utilities
list ( APPEND TEST_LIBRARIES ${ CPP_UTILITIES_LIB } )
2016-07-30 22:34:31 +02:00
2016-11-26 13:06:27 +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 ( )
2017-03-27 22:12:20 +02:00
# add target for test executable, but exclude it from the "all target" when EXCLUDE_TESTS_FROM_ALL is set
2017-03-23 20:31:57 +01:00
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
2017-03-27 22:12:20 +02:00
# handle testing a library (which is default project type)
if ( NOT META_PROJECT_TYPE OR "${META_PROJECT_TYPE}" STREQUAL "library" )
2016-09-11 20:32:59 +02:00
# when testing a library, the test application always needs to link against it
if ( BUILD_SHARED_LIBS )
2016-09-20 19:46:35 +02:00
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}" )
2016-09-11 20:32:59 +02:00
else ( )
2016-09-20 19:46:35 +02:00
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-11 20:32:59 +02:00
endif ( )
2016-09-20 19:46:35 +02:00
endif ( )
2017-03-27 22:12:20 +02:00
# handle testing an application
2016-09-20 19:46:35 +02:00
if ( "${META_PROJECT_TYPE}" STREQUAL "application" )
2016-11-26 13:06:27 +01:00
# the test application might need the path of the application to be tested
2016-09-11 20:32:59 +02:00
set ( APPLICATION_PATH "-a ${CMAKE_CURRENT_BINARY_DIR}/${META_PROJECT_NAME}" )
2017-03-27 22:12:20 +02:00
2017-03-27 11:15:14 +02:00
# using functions directly from the tests might be required -> also create a 'testlib' and link tests against it
2016-09-20 19:46:35 +02:00
if ( LINK_TESTS_AGAINST_APP_TARGET )
2017-03-27 22:12:20 +02:00
# create target for the 'testlib'
2017-03-27 11:15:14 +02:00
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_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 } "
)
2017-06-18 16:14:45 +02:00
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 } "
)
2017-03-27 11:15:14 +02:00
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 } "
)
2017-05-23 00:49:45 +02:00
if ( CPP_UNIT_CONFIG_ ${ META_PROJECT_NAME } _FOUND )
target_include_directories ( ${ TARGET_PREFIX } ${ META_PROJECT_NAME } ${ TARGET_SUFFIX } _testlib
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 } "
)
target_compile_options ( ${ TARGET_PREFIX } ${ META_PROJECT_NAME } ${ TARGET_SUFFIX } _testlib
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 } "
)
endif ( )
2017-03-27 11:15:14 +02: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-09-20 19:46:35 +02:00
endif ( )
2016-08-19 16:13:41 +02:00
endif ( )
2017-03-27 22:12:20 +02:00
# actually apply configuration for test target
2016-11-26 13:06:27 +01:00
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_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 } "
)
2017-06-18 16:14:45 +02:00
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 } "
)
2016-09-20 19:46:35 +02:00
set_target_properties ( ${ TARGET_PREFIX } ${ META_PROJECT_NAME } ${ TARGET_SUFFIX } _tests PROPERTIES
2017-02-04 17:44:46 +01:00
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 } "
2016-09-20 19:46:35 +02:00
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 }
)
2017-03-27 22:12:20 +02:00
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 "
$ { A P P L I C A T I O N _ P A T H }
)
2016-04-16 00:50:16 +02:00
2016-09-11 20:32:59 +02:00
# add the test executable to the dependencies of the check target
2016-09-20 19:46:35 +02:00
add_dependencies ( check ${ TARGET_PREFIX } ${ META_PROJECT_NAME } ${ TARGET_SUFFIX } _tests )
2016-07-16 23:04:22 +02:00
2016-09-11 20:32:59 +02:00
# add target for launching tests with wine ensuring the WINEPATH is set correctly so wine is able to find all required *.dll files
# requires script from c++utilities, hence the sources of c++utilities must be present
if ( MINGW AND CMAKE_CROSSCOMPILING AND CPP_UTILITIES_SOURCE_DIR )
2017-03-27 22:12:20 +02:00
if ( NOT TARGET ${ META_PROJECT_NAME } _run_tests_with_wine )
2016-09-11 20:32:59 +02:00
if ( CMAKE_FIND_ROOT_PATH )
list ( APPEND RUNTIME_LIBRARY_PATH "${CMAKE_FIND_ROOT_PATH}/bin" )
endif ( )
2017-03-27 22:12:20 +02:00
add_custom_target ( ${ TARGET_PREFIX } ${ META_PROJECT_NAME } ${ TARGET_SUFFIX } _run_tests_with_wine COMMAND "${CPP_UTILITIES_SOURCE_DIR}/scripts/wine.sh" "${CMAKE_CURRENT_BINARY_DIR}/${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests.${WINDOWS_EXT}" ${ RUNTIME_LIBRARY_PATH } )
add_dependencies ( ${ TARGET_PREFIX } ${ META_PROJECT_NAME } ${ TARGET_SUFFIX } _run_tests_with_wine ${ TARGET_PREFIX } ${ META_PROJECT_NAME } ${ TARGET_SUFFIX } _tests )
2016-07-16 23:04:22 +02:00
endif ( )
endif ( )
2016-09-11 20:32:59 +02:00
2017-05-23 00:10:27 +02:00
set ( META_HAVE_TESTS YES )
2016-09-11 20:32:59 +02:00
else ( )
message ( WARNING "Unable to add test target because cppunit could not be located." )
2017-05-23 00:10:27 +02:00
set ( META_HAVE_TESTS NO )
2016-07-16 23:04:22 +02:00
endif ( )
2017-02-11 02:30:46 +01:00
set ( TEST_CONFIG_DONE YES )