#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}"