Доступ к переменной кеша CMake из сценария CTest

Мой проект связан со сторонней библиотекой, которая поставляется с файлом подавления valgrind, а также скриптом CMake. Сценарий сохраняет расположение файла подавления в переменной кэша CMake.

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


person Arek' Fu    schedule 24.08.2012    source источник


Ответы (2)


Вы не можете напрямую получить доступ к переменным кеша CMake из сценария ctest -S.

Однако вы могли бы:

  1. включить сторонний сценарий CMake в сценарий ctest -S с помощью "include" (после шага обновления, чтобы дерево исходных текстов было в актуальном состоянии)
  2. прочтите файл CMakeCache.txt после шага настройки, чтобы извлечь интересующую переменную кеша
  3. добавьте код в файл CMakeLists.txt, чтобы написать мини-скрипт, содержащий только ту информацию, которую вы ищете.

Для (1) код будет примерно таким:

include(${CTEST_SOURCE_DIRECTORY}/path/to/3rdParty/script.cmake)

Это было бы реально возможно только в том случае, если бы скрипт делал только простые вещи, такие как установка значений переменных, на которые вы затем можете ссылаться. Если он выполняет какие-либо действия CMake-configure-time, такие как find_library или add_executable, вам не следует этого делать.

Для (2):

file(STRINGS ${CTEST_BINARY_DIRECTORY}/CMakeCache.txt result
  REGEX "^CURSES_LIBRARY:FILEPATH=(.*)$")
message("result='${result}'")
string(REGEX REPLACE "^CURSES_LIBRARY:FILEPATH=(.*)$" "\\1"
  filename "${result}")
message("filename='${filename}'")

Для (3):

В файле CMakeLists.txt:

file(WRITE "${CMAKE_BINARY_DIR}/mini-script.cmake" "
  set(supp_file \"${supp_file_location}\")
")

В вашем сценарии ctest -S после вызова ctest_configure:

include("${CTEST_BINARY_DIRECTORY}/mini-script.cmake")
message("supp_file='${supp_file}'")
# use supp_file as needed in the rest of your script
person DLRdave    schedule 24.08.2012
comment
Я думал о решении (1), но оно не выглядит надежным. Вы должны знать, что делает script.cmake, и предполагать, что это не изменится в будущих версиях. С другой стороны, решение (2) полагается на формат файла CMakeCache.txt, который CMake, вероятно, может свободно изменить в будущих выпусках. Я думаю, что я выберу решение для регулярных выражений грубой силы, хотя ни один из них не выглядит действительно удовлетворительным. В любом случае спасибо за ваш ответ. - person Arek' Fu; 24.08.2012
comment
Мне нравится решение (3), оно выглядит более надежным. Еще раз спасибо. - person Arek' Fu; 24.08.2012
comment
В (2) CTEST_BINARY_DIRECTORY не определен, верно? Переменная, которую я на самом деле пытаюсь извлечь из кеша, - это просто CMAKE_BINARY_DIR, поэтому я могу установить для нее CTEST_BINARY_DIRECTORY. - person David Doria; 02.02.2016
comment
В (1), (2), и (3) контекст находится в сценарии ctest -S. В этом контексте CTEST_BINARY_DIRECTORY должен быть установлен либо непосредственно в скрипте, либо вызывающим с помощью -D в командной строке ctest. Местоположение файла CMakeCache.txt, который вы читаете, - это CTEST_BINARY_DIRECTORY. - person DLRdave; 02.02.2016

Тесты должны быть настроены в вашем CMakeLists.txt файле с помощью команды ADD_TEST(). Затем сценарий CTest просто вызывает ctest_test() для запуска всех настроенных тестов. Делая это таким образом, вы получаете доступ к переменным кеша, плюс вы можете просто запустить make test в любой момент для запуска тестов. Сохраните сценарий CTest для еженощного тестирования и / или отправки на панель инструментов.

person Peter    schedule 24.08.2012
comment
Вот почему я использую скрипт - я провожу непрерывное тестирование и отправку на панель инструментов. Я отредактировал вопрос, чтобы прояснить это. - person Arek' Fu; 24.08.2012