Fix issues in TestTarget.cmake
* Fix error message * Improve comments * Improve target names * Fix working directory for check target * Add info that calling enable_testing() on root level is required for check target to work * Create workingdir for tests under binary dir to prevent polluting source dir
This commit is contained in:
parent
7b100010c2
commit
daaedb7ba3
|
@ -1,5 +1,5 @@
|
||||||
if(NOT BASIC_PROJECT_CONFIG_DONE)
|
if(NOT BASIC_PROJECT_CONFIG_DONE)
|
||||||
message(FATAL_ERROR "Before including the AppTarget module, the BasicConfig module must be included.")
|
message(FATAL_ERROR "Before including the TestTarget module, the BasicConfig module must be included.")
|
||||||
endif()
|
endif()
|
||||||
if(TEST_CONFIG_DONE)
|
if(TEST_CONFIG_DONE)
|
||||||
message(FATAL_ERROR "Can not include TestTarget module when tests are already configured.")
|
message(FATAL_ERROR "Can not include TestTarget module when tests are already configured.")
|
||||||
|
@ -7,10 +7,11 @@ endif()
|
||||||
|
|
||||||
option(EXCLUDE_TESTS_FROM_ALL "specifies whether to exclude tests from the \"all\" target (enabled by default)" ON)
|
option(EXCLUDE_TESTS_FROM_ALL "specifies whether to exclude tests from the \"all\" target (enabled by default)" ON)
|
||||||
|
|
||||||
# always link test applications against c++utilities and cppunit
|
# find cppunit (I always use it for tests of my libs/applications but maybe this should be made optional in the future)
|
||||||
find_library(CPP_UNIT_LIB cppunit)
|
find_library(CPP_UNIT_LIB cppunit)
|
||||||
|
|
||||||
if(CPP_UNIT_LIB)
|
if(CPP_UNIT_LIB)
|
||||||
|
# always link test applications against c++utilities and cppunit
|
||||||
list(APPEND TEST_LIBRARIES ${CPP_UTILITIES_LIB} ${CPP_UNIT_LIB})
|
list(APPEND TEST_LIBRARIES ${CPP_UTILITIES_LIB} ${CPP_UNIT_LIB})
|
||||||
|
|
||||||
# set compile definitions
|
# set compile definitions
|
||||||
|
@ -21,14 +22,23 @@ if(CPP_UNIT_LIB)
|
||||||
set(META_PRIVATE_SHARED_LIB_COMPILE_DEFINITIONS ${META_PRIVATE_COMPILE_DEFINITIONS} ${META_ADDITIONAL_PRIVATE_SHARED_COMPILE_DEFINITIONS})
|
set(META_PRIVATE_SHARED_LIB_COMPILE_DEFINITIONS ${META_PRIVATE_COMPILE_DEFINITIONS} ${META_ADDITIONAL_PRIVATE_SHARED_COMPILE_DEFINITIONS})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# add autotools-style check target
|
# add autotools-style check target and enable testing
|
||||||
if(NOT TARGET check)
|
if(NOT TARGET check)
|
||||||
set(CMAKE_CTEST_COMMAND ctest -V)
|
set(CMAKE_CTEST_COMMAND ctest -V)
|
||||||
add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND})
|
add_custom_target(check
|
||||||
enable_testing()
|
COMMAND ${CMAKE_CTEST_COMMAND}
|
||||||
|
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
|
||||||
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# add test executable, but exclude it from the "all target"
|
# enable testing
|
||||||
|
enable_testing()
|
||||||
|
get_directory_property(HAS_PARENT PARENT_DIRECTORY)
|
||||||
|
if(HAS_PARENT)
|
||||||
|
message(STATUS "For the check target to work, it is required to call enable_testing() on the source directory root.")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# add target for test executable, but exclude it from the "all target" when EXCLUDE_TESTS_FROM_ALL is set
|
||||||
if(EXCLUDE_TESTS_FROM_ALL)
|
if(EXCLUDE_TESTS_FROM_ALL)
|
||||||
set(TESTS_EXCLUSION EXCLUDE_FROM_ALL)
|
set(TESTS_EXCLUSION EXCLUDE_FROM_ALL)
|
||||||
else()
|
else()
|
||||||
|
@ -36,8 +46,8 @@ if(CPP_UNIT_LIB)
|
||||||
endif()
|
endif()
|
||||||
add_executable(${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests ${TESTS_EXCLUSION} ${TEST_HEADER_FILES} ${TEST_SRC_FILES})
|
add_executable(${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests ${TESTS_EXCLUSION} ${TEST_HEADER_FILES} ${TEST_SRC_FILES})
|
||||||
|
|
||||||
# test applications of my projects always use c++utilities and cppunit
|
# handle testing a library (which is default project type)
|
||||||
if(NOT META_PROJECT_TYPE OR "${META_PROJECT_TYPE}" STREQUAL "library") # default project type is library
|
if(NOT META_PROJECT_TYPE OR "${META_PROJECT_TYPE}" STREQUAL "library")
|
||||||
# when testing a library, the test application always needs to link against it
|
# when testing a library, the test application always needs to link against it
|
||||||
if(BUILD_SHARED_LIBS)
|
if(BUILD_SHARED_LIBS)
|
||||||
list(APPEND TEST_LIBRARIES ${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX})
|
list(APPEND TEST_LIBRARIES ${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX})
|
||||||
|
@ -47,12 +57,15 @@ if(CPP_UNIT_LIB)
|
||||||
message(STATUS "Linking test target statically against ${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}")
|
message(STATUS "Linking test target statically against ${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}")
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# handle testing an application
|
||||||
if("${META_PROJECT_TYPE}" STREQUAL "application")
|
if("${META_PROJECT_TYPE}" STREQUAL "application")
|
||||||
# the test application might need the path of the application to be tested
|
# the test application might need the path of the application to be tested
|
||||||
set(APPLICATION_PATH "-a ${CMAKE_CURRENT_BINARY_DIR}/${META_PROJECT_NAME}")
|
set(APPLICATION_PATH "-a ${CMAKE_CURRENT_BINARY_DIR}/${META_PROJECT_NAME}")
|
||||||
|
|
||||||
# using functions directly from the tests might be required -> also create a 'testlib' and link tests against it
|
# using functions directly from the tests might be required -> also create a 'testlib' and link tests against it
|
||||||
if(LINK_TESTS_AGAINST_APP_TARGET)
|
if(LINK_TESTS_AGAINST_APP_TARGET)
|
||||||
# create target for 'testlib'
|
# create target for the 'testlib'
|
||||||
set(TESTLIB_FILES ${HEADER_FILES} ${SRC_FILES} ${WIDGETS_FILES} ${QML_FILES} ${RES_FILES} ${QM_FILES})
|
set(TESTLIB_FILES ${HEADER_FILES} ${SRC_FILES} ${WIDGETS_FILES} ${QML_FILES} ${RES_FILES} ${QM_FILES})
|
||||||
list(REMOVE_ITEM TESTLIB_FILES main.h main.cpp)
|
list(REMOVE_ITEM TESTLIB_FILES main.h main.cpp)
|
||||||
add_library(${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_testlib SHARED ${TESTLIB_FILES})
|
add_library(${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_testlib SHARED ${TESTLIB_FILES})
|
||||||
|
@ -76,6 +89,8 @@ if(CPP_UNIT_LIB)
|
||||||
set_target_properties(${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_testlib PROPERTIES CXX_VISIBILITY_PRESET default)
|
set_target_properties(${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_testlib PROPERTIES CXX_VISIBILITY_PRESET default)
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# actually apply configuration for test target
|
||||||
target_link_libraries(${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests
|
target_link_libraries(${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests
|
||||||
PUBLIC ${ACTUAL_ADDITIONAL_LINK_FLAGS} "${PUBLIC_LIBRARIES}"
|
PUBLIC ${ACTUAL_ADDITIONAL_LINK_FLAGS} "${PUBLIC_LIBRARIES}"
|
||||||
PRIVATE "${TEST_LIBRARIES}" "${PRIVATE_LIBRARIES}"
|
PRIVATE "${TEST_LIBRARIES}" "${PRIVATE_LIBRARIES}"
|
||||||
|
@ -89,7 +104,12 @@ if(CPP_UNIT_LIB)
|
||||||
LINK_SEARCH_START_STATIC ${STATIC_LINKAGE}
|
LINK_SEARCH_START_STATIC ${STATIC_LINKAGE}
|
||||||
LINK_SEARCH_END_STATIC ${STATIC_LINKAGE}
|
LINK_SEARCH_END_STATIC ${STATIC_LINKAGE}
|
||||||
)
|
)
|
||||||
add_test(NAME ${META_PROJECT_NAME}_cppunit COMMAND ${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests -p "${CMAKE_CURRENT_SOURCE_DIR}/testfiles" ${APPLICATION_PATH})
|
add_test(NAME ${META_PROJECT_NAME}_run_tests COMMAND
|
||||||
|
${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests
|
||||||
|
-p "${CMAKE_CURRENT_SOURCE_DIR}/testfiles"
|
||||||
|
-w "${CMAKE_CURRENT_BINARY_DIR}/testworkingdir"
|
||||||
|
${APPLICATION_PATH}
|
||||||
|
)
|
||||||
|
|
||||||
# add the test executable to the dependencies of the check target
|
# add the test executable to the dependencies of the check target
|
||||||
add_dependencies(check ${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests)
|
add_dependencies(check ${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests)
|
||||||
|
@ -97,12 +117,12 @@ if(CPP_UNIT_LIB)
|
||||||
# add target for launching tests with wine ensuring the WINEPATH is set correctly so wine is able to find all required *.dll files
|
# 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
|
# requires script from c++utilities, hence the sources of c++utilities must be present
|
||||||
if(MINGW AND CMAKE_CROSSCOMPILING AND CPP_UTILITIES_SOURCE_DIR)
|
if(MINGW AND CMAKE_CROSSCOMPILING AND CPP_UTILITIES_SOURCE_DIR)
|
||||||
if(NOT TARGET ${META_PROJECT_NAME}_run_tests)
|
if(NOT TARGET ${META_PROJECT_NAME}_run_tests_with_wine)
|
||||||
if(CMAKE_FIND_ROOT_PATH)
|
if(CMAKE_FIND_ROOT_PATH)
|
||||||
list(APPEND RUNTIME_LIBRARY_PATH "${CMAKE_FIND_ROOT_PATH}/bin")
|
list(APPEND RUNTIME_LIBRARY_PATH "${CMAKE_FIND_ROOT_PATH}/bin")
|
||||||
endif()
|
endif()
|
||||||
add_custom_target(${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_run_tests 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_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 ${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests)
|
add_dependencies(${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_run_tests_with_wine ${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests)
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue