Сообщение CMake не печатается в правильном порядке

#cmake

#cmake

Вопрос:

Я знаю, что философия сборки CMake основана на «зависимости» и не обязательно в порядке записи задач в списке CMake.

Но когда дело доходит до message(STATUS ...) мне нужно, чтобы они отображались по порядку, иначе они не имеют смысла.

Могу ли я как-то сказать CMake, чтобы он запускал это последовательно?

Пример:

   message(STATUS "[LOG] COMPILER_PREFIX         =${COMPILER_PREFIX}")
  message(STATUS "[LOG] CMAKE_SOURCE_DIR        =${CMAKE_SOURCE_DIR}")
  message(STATUS "[LOG] CMAKE_C_COMPILER        =${CMAKE_C_COMPILER}")
  message(STATUS "[LOG] CMAKE_C_FLAGS           =${CMAKE_C_FLAGS}")
  message(STATUS "[LOG] CMAKE_C_LINK_EXECUTABLE =${CMAKE_C_LINK_EXECUTABLE}")
  message(STATUS "[LOG] CMAKE_EXE_LINKER_FLAGS  =${CMAKE_EXE_LINKER_FLAGS}")
  message(STATUS "[LOG] CMAKE_AR                =${CMAKE_AR}")

  message(STATUS "[LOG] Definitions: ")
  get_directory_property(defs DIRECTORY ${CMAKE_SOURCE_DIR} COMPILE_DEFINITIONS)
  foreach (def ${defs})
    message([STATUS] "  -D${def}")
  endforeach ()

  get_property(dirs TARGET ${PROJECT_NAME} PROPERTY INCLUDE_DIRECTORIES)
  message(STATUS "[LOG] Includes: ")
  foreach (dir ${dirs})
    message([STATUS] "  ${dir}")
  endforeach ()

  get_property(libs TARGET ${PROJECT_NAME} PROPERTY LINK_LIBRARIES)
  message(STATUS "[LOG] Libraries:")
  foreach (libs ${libs})
    message([STATUS] "  ${libs}")
  endforeach ()
  

Выводится следующим образом:

 [STATUS]  -DDUMMY
[STATUS]  -D__SL__
[STATUS]  -DMCU
-- [LOG] COMPILER_PREFIX         =
-- [LOG] CMAKE_SOURCE_DIR        = /home/dummy/workspace/project
-- [LOG] CMAKE_C_COMPILER        = gcc
[STATUS]  /home/dummy/workspace/project/inc
-- [LOG] CMAKE_C_FLAGS           =-std=gnu11 -Wextra -Wall -Wno-unused-parameter
[STATUS]  -lgcc
[STATUS]  -lc
[STATUS]  -lgcc
[STATUS]  -lc
....
  

Ответ №1:

Это смешивает выходные данные stdout и stderr и не будет печатать «по порядку».

Из документации CMake для версии v3.25:

Средство командной строки CMake отображает СТАТУС для ОТСЛЕЖИВАНИЯ сообщений в стандартном выводе с сообщением, которому предшествуют два дефиса и пробел. Все другие типы сообщений отправляются в stderr и не имеют префикса дефиса.

Поэтому при использовании message([<mode>] "message text" ...) выбирайте одиночный режим вместо их смешивания.

Ответ №2:

могу ли я как-то сказать cmake, чтобы он запускал это последовательно?

Либо установите cmake для буферизации строк в обоих стандартных потоках с помощью stdbuf .

Или используйте STATUS для всех сообщений или не используйте STATUS для всех сообщений из cmake. В вашем случае использования вы могли бы просто message("-- [LOG] something something") .