##====================================================================================================================== ## ROTGEN - Runtime Overlay for Eigen ## Copyright : CODE RECKONS ## SPDX-License-Identifier: BSL-1.0 ##====================================================================================================================== function(ROTGEN_SETUP_TEST_TARGETS) string(TOLOWER ${PROJECT_NAME} NAME) set(PROJECT_TEST_TARGET "${NAME}-test") if(NOT TARGET ${PROJECT_TEST_TARGET}) add_custom_target(${PROJECT_TEST_TARGET}) set(PROJECT_TEST_TARGET "${PROJECT_TEST_TARGET}" PARENT_SCOPE) endif() endfunction() ##====================================================================================================================== ## For any target of the form XXX.YYY.ZZZ, generates all the intermediate XX and XXX.YY targets that include ## allt he ones under them. ##====================================================================================================================== function(ROTGEN_ADD_TARGET_PARENT target) string(REGEX REPLACE "[^.]+\\.([^.]+)$" "\\1" parent_target ${target}) string(REGEX REPLACE "^.*\\.([^.]+)$" "\\1" suffix ${parent_target}) if(NOT TARGET ${target}) add_custom_target(${target}) set_property(TARGET ${target} PROPERTY FOLDER ${suffix}) endif() if(NOT parent_target STREQUAL ${target}) rotgen_add_target_parent(${parent_target}) add_dependencies(${parent_target} ${target}) endif() endfunction() ##====================================================================================================================== ## Turn a filename to a dot-separated target name ##====================================================================================================================== function(ROTGEN_SOURCE_TO_TARGET extension filename testname) string(REPLACE ".cpp" ".${extension}" base ${filename}) string(REPLACE "/" "." base ${base}) string(REPLACE "\\" "." base ${base}) set(${testname} "${base}" PARENT_SCOPE) endfunction() ##====================================================================================================================== ## Select a test target build location ##====================================================================================================================== function(ROTGEN_SETUP_TEST test location) set_property ( TARGET ${test} PROPERTY RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${location}" ) if(DEFINED CMAKE_CROSSCOMPILING_CMD) add_test( NAME ${test} WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/${location}" COMMAND "${CMAKE_CROSSCOMPILING_CMD}" $ ) else() add_test( NAME ${test} WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/unit" COMMAND $ ) endif() endfunction() ##====================================================================================================================== ## Process a list of source files to generate corresponding test target ##====================================================================================================================== function(ROTGEN_MAKE_UNIT) set(options QUIET) set(oneValueArgs INTERFACE EXTENSION ROOT DESTINATION PCH IMPLICIT) set(multiValueArgs DEPENDENCIES FILES) cmake_parse_arguments(OPT "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} ) if(NOT ${OPT_QUIET}) list(LENGTH OPT_FILES NB_TARGETS) message(STATUS "[${PROJECT_NAME}] - ${NB_TARGETS} targets generated for ${OPT_ROOT}") endif() foreach(file ${OPT_FILES}) rotgen_source_to_target( "${OPT_EXTENSION}" "${file}" test) add_executable(${test} ${file}) rotgen_add_target_parent(${test}) add_dependencies(${PROJECT_TEST_TARGET} ${test}) if(DEFINED OPT_DEPENDENCIES) add_dependencies(${test} ${OPT_DEPENDENCIES}) endif() rotgen_setup_test( ${test} "${OPT_DESTINATION}") target_link_libraries(${test} PUBLIC ${OPT_INTERFACE}) if(DEFINED OPT_PCH) target_precompile_headers(${test} REUSE_FROM ${OPT_PCH}) add_dependencies(${test} ${OPT_PCH}) endif() if(NOT ${OPT_IMPLICIT}) set_target_properties ( ${test} PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD TRUE EXCLUDE_FROM_ALL TRUE ${MAKE_UNIT_TARGET_PROPERTIES} ) endif() endforeach() endfunction() ##================================================================================================== ## Generate tests from a GLOB ##================================================================================================== function(ROTGEN_GLOB_UNIT) set(options QUIET IMPLICIT) set(oneValueArgs RELATIVE PATTERN INTERFACE PCH EXTENSION DESTINATION) set(multiValueArgs DEPENDENCIES) cmake_parse_arguments(OPT "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} ) if(NOT DEFINED OPT_INTERFACE) set(OPT_INTERFACE "") endif() if(NOT DEFINED OPT_PCH) set(OPT_PCH "") endif() if(NOT DEFINED OPT_DESTINATION) set(OPT_DESTINATION "unit") endif() if(NOT DEFINED OPT_EXTENSION) set(OPT_EXTENSION "exe") endif() if(NOT DEFINED OPT_RELATIVE) set(OPT_RELATIVE "${CMAKE_SOURCE_DIR}/test") endif() if(NOT DEFINED OPT_PATTERN) set(OPT_PATTERN "*.cpp") endif() if(${OPT_IMPLICIT}) set(MAKE_IMPLICIT 1) else() set(MAKE_IMPLICIT 0) endif() file(GLOB FOUND_FILES CONFIGURE_DEPENDS RELATIVE ${OPT_RELATIVE} ${OPT_PATTERN}) if(${OPT_QUIET}) rotgen_make_unit( INTERFACE "${OPT_INTERFACE}" EXTENSION "${OPT_EXTENSION}" DESTINATION "${OPT_DESTINATION}" DEPENDENCIES "${OPT_DEPENDENCIES}" PCH "${OPT_PCH}" FILES "${FOUND_FILES}" ROOT "${OPT_PATTERN}" IMPLICIT "${MAKE_IMPLICIT}" QUIET ) else() rotgen_make_unit( INTERFACE "${OPT_INTERFACE}" EXTENSION "${OPT_EXTENSION}" DESTINATION "${OPT_DESTINATION}" DEPENDENCIES "${OPT_DEPENDENCIES}" PCH "${OPT_PCH}" FILES "${FOUND_FILES}" ROOT "${OPT_PATTERN}" IMPLICIT "${MAKE_IMPLICIT}" ) endif() endfunction() ##====================================================================================================================== ## Process a list of source files to generate a single test target ##====================================================================================================================== function(ROTGEN_MAKE_SINGLE_UNIT) set(oneValueArgs NAME INTERFACE EXTENSION ROOT DESTINATION PCH) set(multiValueArgs DEPENDENCIES FILES) cmake_parse_arguments(OPT "" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} ) if(NOT DEFINED OPT_EXTENSION) set(OPT_EXTENSION "exe") endif() if(NOT DEFINED OPT_DESTINATION) set(OPT_DESTINATION "unit") endif() rotgen_source_to_target( "${OPT_EXTENSION}" "${OPT_NAME}" test) add_executable(${test} ${OPT_FILES}) rotgen_add_target_parent(${test}) add_dependencies(${PROJECT_TEST_TARGET} ${test}) if(DEFINED OPT_DEPENDENCIES) add_dependencies(${test} ${OPT_DEPENDENCIES}) endif() rotgen_setup_test( ${test} "${OPT_DESTINATION}") target_link_libraries(${test} PUBLIC ${OPT_INTERFACE}) if( DEFINED OPT_PCH) target_precompile_headers(${test} REUSE_FROM ${OPT_PCH}) add_dependencies(${test} ${OPT_PCH}) endif() endfunction()