2013-12-06 2 views
0

У меня есть пользовательская команда в моем сценарии cmake, которая генерирует много выходных данных. Я бы хотел использовать CMAKE_VERBOSE_MAKEFILE, чтобы я мог решить, хочу ли я видеть этот вывод или нет.Пользовательская команда молчания в зависимости от CMAKE_VERBOSE_MAKEFILE

Есть ли общий способ для этого?

Единственный способ, с помощью которого я вижу, - перенаправить вывод на/dev/null в зависимости от этого флага cmake, но как насчет Windows и других ОС?

Есть ли переносной или рекомендуемый способ? Как насчет правил по умолчанию для компиляции команд c/C++?

ответ

2

Технически говоря, CMAKE_VERBOSE_MAKEFILE существует для скрытия и отображения команд, а не вывода команд.

Если бы мне пришлось это сделать, я бы использовал пользовательскую переменную.

Но главной темой, вот как вы должны сделать:

if (COMMAND_VERBOSE) 
    execute_process(COMMAND "mycustom_command") 
else (COMMAND_VERBOSE) 
    execute_process(COMMAND "mycustom_command" OUTPUT_QUIET) 
endif (COMMAND_VERBOSE) 

Это самый портативный способ сделать это.

Существует также флаг ERROR_QUIET, однако это плохая идея отключить сообщения об ошибках, иначе пользователь не сможет понять, почему команда не удалась, если она не удалась.

Если вы используете add_custom_command или add_custom_target, то такого флага не существует. Вам необходимо предоставить ручное перенаправление на /dev/null (Unix) или NUL (Windows).

0

Как указал SirDarius, execute_process() имеет возможность отключать вывод инструмента, в то время как add_custom_command()/add_custom_target() нет.

Но есть способ обойти эту проблему: Поставив фактический вызов вашего инструмента в отдельном сценарии оболочки CMake, используя execute_process() с OUTPUT_QUIET включена или отключена в зависимости от переключателя:

# mycustom_command.cmake 
if (OUTPUT) 
    execute_process(COMMAND mycustom_command) 
else() 
    execute_process(COMMAND mycustom_command OUTPUT_QUIET) 
endif() 

Тогда, используйте add_custom_command() и режим обработки сценария CMake (-P), чтобы вызвать этот скрипт из основного CMakeLists.txt, при этом переключатель сценария включается/отключается любой переменной, используемой для этой цели в вашем CMakeLists.txt.

add_custom_command(OUTPUT outfile 
        COMMAND ${CMAKE_COMMAND} -P mycustom_command.cmake -DOUTPUT=${OUTPUT_DESIRED} 
       ) 

Это полностью портативный. Если ваш mycustom_command построен из вашего проекта в качестве цели, просто добавьте его как DEPENDENCY в ваш add_custom_command(), чтобы он успел построить вызов сценария.

Смежные вопросы