Как передать ${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
,