Как передать ${CTEST_CONFIGURATION_TYPE}, используя add_test в cmake

Кажется, я не могу понять, как передать ${CTEST_CONFIGURATION_TYPE}, используя add_test в cmake, без добавления CMake дополнительных экранирующих символов.

В настоящее время я использую cmake для генерации файлов проекта VS и установки RUNTIME_OUTPUT_DIRECTORY, и мне нужно использовать этот каталог + конфигурация в качестве рабочего каталога для нескольких тестов, поскольку они зависят от других встроенных исполняемых файлов.

Я пытался использовать

add_test(NAME test 
     WORKING_DIRECTORY "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/\${CTEST_CONFIGURATION_TYPE}"
     COMMAND test ${TEST_ARGS})

Это правильно находит мой тестовый исполняемый файл, однако сгенерированный файл CTestTestfile.cmake содержит

WORKING_DIRECTORY "<CORRECT_RUNTIME_PATH>/\${CTEST_CONFIGURATION_TYPE}"

В любом случае, я могу заставить это работать или мне просто придется каждый раз передавать правильный каталог в тест через командную строку?

2 ответа

В настоящее время это невозможно в общем случае. В следующей версии CMake вы сможете использовать функцию этого коммита для использования выражений генератора в ваших свойствах теста.

Обновить:

Как указал @mathstuf в своем собственном ответе, начиная с версии 2.8.12, CMake поддерживает выражения генератора внутри WORKING_DIRECTORY аргумент add_test, Это делает остальную часть моего ответа применимой только к CMake v2.8.11 и ниже.


Насколько я знаю, на самом деле невозможно передать "$" через ADD_TEST без этого в конечном итоге сбежал в CTestTestfile.cmake,

Действительно, "CMake" способ справиться с этой ситуацией, вероятно, состоит в том, чтобы передать зависимые exe-файлы в тестовый exe-файл в качестве параметра командной строки, что потребовало бы изменения тестового кода. Если все зависимые исполняемые файлы являются целями CMake, на них можно ссылаться в ADD_TEST команда с помощью "$<TARGET_FILE:tgt>" где tgt это имя цели CMake.

Однако есть большой грязный хак, который вы можете использовать, чтобы обойти это. Замените свой ADD_TEST команда с:

ADD_TEST(NAME test WORKING_DIRECTORY "@WORKING_DIR@" COMMAND test ${TEST_ARGS})
FILE(WRITE ${CMAKE_BINARY_DIR}/CTestCustom.cmake
     "SET(WORKING_DIR \"${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/\\\${CTEST_CONFIGURATION_TYPE}\")\n")
FILE(APPEND ${CMAKE_BINARY_DIR}/CTestCustom.cmake
     "CONFIGURE_FILE(${CMAKE_BINARY_DIR}/CTestTestfile.cmake ${CMAKE_BINARY_DIR}/CTestTestfile.cmake @ONLY)\n")

Это (ab) использование поведения CTest путем создания CTestCustom.cmake файл, который вызывается до CTestTestfile.cmake, После запуска CMake, CTestTestfile.cmake имеет линию

SET_TESTS_PROPERTIES(test PROPERTIES  WORKING_DIRECTORY "@WORKING_DIR@")

Запустив CTest и вызвав CTestCustom.cmake, "@WORKING_DIR@" заменяется на правильное значение.

Это действительно взломать; беспорядок с автоматически сгенерированными файлами CMake вызывает проблемы, но это может происходить до тех пор, пока у вас не будет времени на рефакторинг ваших тестов или пока CMake не сможет лучше поддерживать конфигурацию для каждой конфигурации WORKING_DIRECTORY,

Другие вопросы по тегам