CMake что-то делать при сбое команды

#cmake

#cmake

Вопрос:

Я использую CMake. Пользовательский шаг сборки сохраняет вывод ошибок при сбое.

 FIND_PROGRAM (BASH bash HINTS /bin)

SET (BASH_CMD "my-script input.file >output.file 2>error.file")

ADD_CUSTOM_COMMAND (
   OUTPUT output.file
   COMMAND ${CMAKE_COMMAND} -E env ${BASH} -c "${BASH_CMD}"
   ...)
 

Это работает. Если my-script сбой для данного input.file , то stderr сохраняется error.file , однако, когда я запускаю make и цель не удается построить, обычный вывод не делает местоположение error.file очевидным. (Фактический путь к этому файлу генерируется запутанным образом.)

Я не хочу, чтобы шумный stderr отображался в терминале во make время. Я хотел бы сделать что-то вроде

 MESSAGE ("input.file failed, see error.file")
 

(в идеале окрашенный в красный цвет или что-то в этом роде), который будет выполняться при output.file сбое команды.

Могу ли я выразить это поведение в CMakeLists.txt рецепты?

Комментарии:

1. Что не так в добавлении || (echo "..." amp;amp; /bin/false) в конце вашей команды? Например. my-script input.file >output.file 2>error.file || (echo "input.file failed, see error.file" amp;amp; /bin/false) . В качестве альтернативы вы можете создать автономный сценарий-оболочку, который перенаправляет вывод исходного сценария в файл и печатает сообщение, если исходный сценарий завершается с ошибкой.

Ответ №1:

Не уверен насчет выделения, но вы можете создать файл сценария cmake, выполняющий команду через execute_process , проверить его код ошибки и распечатать пользовательское сообщение на случай возникновения проблемы. Следующий пример выполняется в Windows, а не в Linux, но этого должно быть достаточно для демонстрации.

Некоторая команда, которая завершается с ошибкой: script.bat

 echo "some long message" 1>amp;2
exit 1
 

Сценарий CMake: execute_script_bat.cmake

 execute_process(COMMAND script.bat RESULT_VARIBALE _EXIT_CODE ERROR_FILE error.log)

if (NOT _EXIT_CODE EQUAL 0)
    message(FATAL_ERROR "command failed; output see ${CMAKE_SOURCE_DIR}/error.log")
endif()
 

CMakeLists.txt

 add_custom_command(
   OUTPUT output.file
   COMMAND "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_SOURCE_DIR}/execute_script_bat.cmake")
 

Дополнительная информация может быть передана путем добавления -D "SOME_VARIABLE=some value" аргументов после "${CMAKE_COMMAND}"