CMake消息未按正确顺序打印

z6psavjg  于 2022-11-11  发布在  其他
关注(0)|答案(2)|浏览(169)

我知道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
....
hgqdbh6s

hgqdbh6s1#

这是混合stdout和stderr输出,不会“按顺序”打印。
从v3.25的CMake文档中:
CMake命令行工具在stdout上显示STATUS到TRACE消息,该消息前面带有两个连字符和一个空格。所有其他消息类型都发送到stderr,并且不带有连字符前缀。
因此,使用message([<mode>] "message text" ...)时,请选择单一模式而不是混合模式。

1aaf6o9v

1aaf6o9v2#

我可以用某种方式告诉cmake按顺序运行这个程序吗?
使用stdbuf将cmake设置为在两个标准流上进行行缓冲
或者对所有消息都使用STATUS,或者不对来自cmake的所有消息都使用STATUS。对于您的用例,您可以只使用message("-- [LOG] something something")

相关问题