From 00f7795dcd4daec110e5b1e1371534a3711df126 Mon Sep 17 00:00:00 2001 From: Martchus Date: Tue, 20 Sep 2016 19:46:35 +0200 Subject: [PATCH] Link test target against neccassary libraries In addition to previous libs, also link against - same libs as app/lib target - the app target itself if required --- CMakeLists.txt | 2 +- cmake/modules/AppTarget.cmake | 6 ++++++ cmake/modules/TestTarget.cmake | 37 ++++++++++++++++++++++++---------- 3 files changed, 33 insertions(+), 12 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 26a050f..0c215cf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -111,7 +111,7 @@ set(META_APP_AUTHOR "Martchus") set(META_APP_URL "https://github.com/${META_APP_AUTHOR}/${META_PROJECT_NAME}") set(META_APP_DESCRIPTION "Common C++ classes and routines used by my applications such as argument parser, IO and conversion utilities") set(META_VERSION_MAJOR 4) -set(META_VERSION_MINOR 0) +set(META_VERSION_MINOR 1) set(META_VERSION_PATCH 0) # find required 3rd party libraries diff --git a/cmake/modules/AppTarget.cmake b/cmake/modules/AppTarget.cmake index a8fa0c1..70c8e0f 100644 --- a/cmake/modules/AppTarget.cmake +++ b/cmake/modules/AppTarget.cmake @@ -29,6 +29,12 @@ set_target_properties(${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX} PROPE LINK_SEARCH_END_STATIC ${STATIC_LINKAGE} ) +if(MAKE_APP_TARGET_LINKABLE OR LINK_TESTS_AGAINST_APP_TARGET) + set_target_properties(${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX} PROPERTIES + ENABLE_EXPORTS ON + ) +endif() + # add install target for binary install(TARGETS ${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX} RUNTIME DESTINATION bin diff --git a/cmake/modules/TestTarget.cmake b/cmake/modules/TestTarget.cmake index bdb749b..2935f9e 100644 --- a/cmake/modules/TestTarget.cmake +++ b/cmake/modules/TestTarget.cmake @@ -14,27 +14,42 @@ if(CPP_UNIT_LIB) endif() # add test executable, but exclude it from the "all target" - add_executable(${META_PROJECT_NAME}_tests EXCLUDE_FROM_ALL ${TEST_HEADER_FILES} ${TEST_SRC_FILES}) + add_executable(${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests EXCLUDE_FROM_ALL ${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 # when testing a library, the test application always needs to link against it if(BUILD_SHARED_LIBS) - list(APPEND TEST_LIBRARIES ${META_PROJECT_NAME}) + 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 ${META_PROJECT_NAME}_static) + 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}") endif() - else() - # otherwise, the tests application needs the path of the application to be tested + endif() + if("${META_PROJECT_TYPE}" STREQUAL "application") + # the tests application might need the path of the application to be tested set(APPLICATION_PATH "-a ${CMAKE_CURRENT_BINARY_DIR}/${META_PROJECT_NAME}") + # linking tests against the application target might be required + # somehow this doesn't work when just specifying the applications target, so we need to specify the full path of the + # target executable + if(LINK_TESTS_AGAINST_APP_TARGET) + list(APPEND TEST_LIBRARIES "${CMAKE_CURRENT_BINARY_DIR}/${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}") + add_dependencies(${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests ${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}) + endif() endif() - target_link_libraries(${META_PROJECT_NAME}_tests ${TEST_LIBRARIES}) - set_target_properties(${META_PROJECT_NAME}_tests PROPERTIES CXX_STANDARD 11) - add_test(NAME ${META_PROJECT_NAME}_cppunit COMMAND ${META_PROJECT_NAME}_tests -p "${CMAKE_CURRENT_SOURCE_DIR}/testfiles" ${APPLICATION_PATH}) + target_link_libraries(${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests ${ACTUAL_ADDITIONAL_LINK_FLAGS} ${TEST_LIBRARIES} ${LIBRARIES}) + set_target_properties(${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests PROPERTIES + CXX_STANDARD 11 + COMPILE_DEFINITIONS "${ACTUAL_ADDITIONAL_COMPILE_DEFINITIONS}" + 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 the test executable to the dependencies of the check target - add_dependencies(check ${META_PROJECT_NAME}_tests) + add_dependencies(check ${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests) # 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 @@ -43,8 +58,8 @@ if(CPP_UNIT_LIB) if(CMAKE_FIND_ROOT_PATH) list(APPEND RUNTIME_LIBRARY_PATH "${CMAKE_FIND_ROOT_PATH}/bin") endif() - add_custom_target(${META_PROJECT_NAME}_run_tests COMMAND "${CPP_UTILITIES_SOURCE_DIR}/scripts/wine.sh" "${CMAKE_CURRENT_BINARY_DIR}/${META_PROJECT_NAME}_tests.${WINDOWS_EXT}" ${RUNTIME_LIBRARY_PATH}) - add_dependencies(${META_PROJECT_NAME}_run_tests ${META_PROJECT_NAME}_tests) + 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) endif() endif()