Глобальная настраиваемая цель в CMake

Я хотел написать небольшую систему модульного тестирования с CMake, которую я мог бы легко копировать и вставлять во все мои проекты, поэтому я придумал это:

include(CMakeParseArguments)
set(UNIT_TEST "unit_tests")
add_custom_target(${UNIT_TEST} ALL VERBATIM)

function(add_unit_test dependency)
    cmake_parse_arguments(UT_ "" "NAME" "" ${ARGN})
    if(NOT ${UT_NAME})
        set(${UT_NAME} ${ARG0})
    endif()

    add_test(${ARGN})
    add_dependencies(${UNIT_TEST} ${dependency})
    add_custom_command(TARGET ${UNIT_TEST}
                   COMMENT "Run tests"
                   POST_BUILD COMMAND ctest
                   ARGS -R ${UT_NAME} --output-on-failures
                   WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
                   VERBATIM)
endfunction(add_unit_test)

Я надеялся, что он будет работать нормально и запустить все модульные тесты, которые я добавлю в свой проект, вызвавadd_unit_test(dep ...) с зависимостью для компиляции до, а затем те же аргументы, что и дляadd_test(...), На самом деле эта ошибка проявляется:

CMake Warning (dev) at cmake/testing.cmake:13 (add_custom_command):
  Policy CMP0040 is not set: The target in the TARGET signature of
  add_custom_command() must exist.  Run "cmake --help-policy CMP0040" for
  policy details.  Use the cmake_policy command to set the policy and
  suppress this warning.

  The target name "unit_tests" is unknown in this context.
Call Stack (most recent call first):
  source/test/CMakeLists.txt:10 (add_unit_test)
This warning is for project developers.  Use -Wno-dev to suppress it.

Почему в данный момент цель неизвестна?include(cmake/testing.cmake) это первое, что я звоню послеcmake_minimum_required в моем сценарии сборки проекта, так что это не может быть, потому чтоadd_custom_target(${UNIT_TEST} ALL VERBATIM) еще не был вызван.

Есть ли способ добавить пользовательскую команду в цель UNIT_TEST?

Ответы на вопрос(1)

Ваш ответ на вопрос