我知道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
....
2条答案
按热度按时间hgqdbh6s1#
这是混合stdout和stderr输出,不会“按顺序”打印。
从v3.25的CMake文档中:
CMake命令行工具在stdout上显示STATUS到TRACE消息,该消息前面带有两个连字符和一个空格。所有其他消息类型都发送到stderr,并且不带有连字符前缀。
因此,使用
message([<mode>] "message text" ...)
时,请选择单一模式而不是混合模式。1aaf6o9v2#
我可以用某种方式告诉cmake按顺序运行这个程序吗?
使用
stdbuf
将cmake设置为在两个标准流上进行行缓冲或者对所有消息都使用
STATUS
,或者不对来自cmake的所有消息都使用STATUS
。对于您的用例,您可以只使用message("-- [LOG] something something")
。