#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")
.