Достъп до 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