From daaedb7ba393b5aa51f6c795c6bbc50c6520e9cd Mon Sep 17 00:00:00 2001 From: Martchus Date: Mon, 27 Mar 2017 22:12:20 +0200 Subject: [PATCH] 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 --- cmake/modules/TestTarget.cmake | 46 ++++++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 13 deletions(-) diff --git a/cmake/modules/TestTarget.cmake b/cmake/modules/TestTarget.cmake index ea61c67..8aa9854 100644 --- a/cmake/modules/TestTarget.cmake +++ b/cmake/modules/TestTarget.cmake @@ -1,5 +1,5 @@ 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() if(TEST_CONFIG_DONE) 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) -# 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) if(CPP_UNIT_LIB) + # always link test applications against c++utilities and cppunit list(APPEND TEST_LIBRARIES ${CPP_UTILITIES_LIB} ${CPP_UNIT_LIB}) # 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}) endif() - # add autotools-style check target + # add autotools-style check target and enable testing if(NOT TARGET check) set(CMAKE_CTEST_COMMAND ctest -V) - add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND}) - enable_testing() + add_custom_target(check + COMMAND ${CMAKE_CTEST_COMMAND} + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + ) 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) set(TESTS_EXCLUSION EXCLUDE_FROM_ALL) else() @@ -36,8 +46,8 @@ if(CPP_UNIT_LIB) endif() 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 - if(NOT META_PROJECT_TYPE OR "${META_PROJECT_TYPE}" STREQUAL "library") # default project type is library + # 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}) @@ -47,12 +57,15 @@ if(CPP_UNIT_LIB) message(STATUS "Linking test target statically against ${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}") endif() endif() + + # handle testing an application if("${META_PROJECT_TYPE}" STREQUAL "application") # the test application might need the path of the application to be tested 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 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}) list(REMOVE_ITEM TESTLIB_FILES main.h main.cpp) 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) endif() endif() + + # actually apply configuration for test target target_link_libraries(${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests PUBLIC ${ACTUAL_ADDITIONAL_LINK_FLAGS} "${PUBLIC_LIBRARIES}" PRIVATE "${TEST_LIBRARIES}" "${PRIVATE_LIBRARIES}" @@ -89,7 +104,12 @@ if(CPP_UNIT_LIB) LINK_SEARCH_START_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_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 # 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(NOT TARGET ${META_PROJECT_NAME}_run_tests) + if(NOT TARGET ${META_PROJECT_NAME}_run_tests_with_wine) if(CMAKE_FIND_ROOT_PATH) list(APPEND RUNTIME_LIBRARY_PATH "${CMAKE_FIND_ROOT_PATH}/bin") 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_dependencies(${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_run_tests ${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests) + 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) endif() endif()