Как заставить CMake печатать * все * команды, а не только команды сборки?

#cmake

#cmake

Вопрос:

Таким образом, вы можете использовать опцию VERBOSE, чтобы заставить CMake выводить все командные строки компилятора на консоль по мере сборки, но это, похоже, не оказывает никакого влияния на другие команды, которые не являются командами компилятора, например, на эту execute_process команду:

   execute_process(
    COMMAND ${_TEST_EXECUTOR} "${_TEST_EXECUTABLE}" --gtest_list_tests
    WORKING_DIRECTORY "${_TEST_WORKING_DIR}"
    TIMEOUT ${_TEST_DISCOVERY_TIMEOUT}
    OUTPUT_VARIABLE output
    RESULT_VARIABLE result
  )
  

На самом деле это часть модуля Google test в CMake. У меня возникла проблема, когда мне нужно было отслеживать точную командную строку, которая выполнялась. Я смог, но только путем ручного взлома файлов. Если бы я просто мог выдавать все команды, которые выполнял CMake, это было бы намного, намного быстрее.

Есть ли какой-нибудь способ сделать это в CMake?

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

1. Вам нужен подробный вывод _TEST_EXECUTOR ? Это зависит от того, что COMMAND выполняется, и вам придется вручную вставить параметр verbose для этой конкретной команды для каждой команды.

2. Да, я хочу видеть, что выполняется фактический процесс execute_process командной строки. Я не могу добавить сюда опцию verbose, поскольку это не мой код, он находится в модуле Google Test CMake, мне на самом деле пришлось скопировать этот файл, отредактировать его, а затем взломать мой файл, чтобы использовать локальную копию (и это было после того, как я потратил целую вечность на отслеживание команды execute_process, которая запускала мой тест). это сэкономило бы кучу времени, если бы я мог просто видеть все команды, которые выполнял CMake.

Ответ №1:

Чтобы получить команды в execute_process распечатанном виде, вы можете указать, где вы хотите, чтобы они печатались по отдельности, в каждой execute_process команде, используя COMMAND_ECHO :

 execute_process(
    COMMAND ${_TEST_EXECUTOR} "${_TEST_EXECUTABLE}" --gtest_list_tests
    WORKING_DIRECTORY "${_TEST_WORKING_DIR}"
    TIMEOUT ${_TEST_DISCOVERY_TIMEOUT}
    OUTPUT_VARIABLE output
    RESULT_VARIABLE result
    COMMAND_ECHO STDOUT
  )
  

или универсально для всех execute_process команд в вашем проекте CMake, установив эту переменную в вашем файле CMake верхнего уровня:

 set(CMAKE_EXECUTE_PROCESS_COMMAND_ECHO STDOUT)
  

Эти функции доступны в версиях CMake 3.15 и выше.


Как бы то ни было, вы также можете получить полную распечатку каждой выполняемой CMake команды (с расширенными переменными CMake), используя cmake параметр командной строки:

 cmake --trace-expand ..
  

но это может быть гораздо более подробным, чем вы ожидаете.