CMakeメッセージが正しい順序で印刷されない

Aug 24 2020

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
....

回答

4 fdk1342 Aug 24 2020 at 21:12

これはstdoutとstderrの出力を混合しており、「順番に」印刷されません。

CMakeのドキュメントから:

CMakeコマンドラインツールは、2つのハイフンとスペースが前に付いたメッセージを使用して、標準出力にSTATUS toTRACEメッセージを表示します。他のすべてのメッセージタイプはstderrに送信され、接頭辞はハイフンではありません。

したがって、使用message([<mode>] "message text" ...)する場合は、それらを混合するのではなく、単一のモードを選択してください。

1 KamilCuk Aug 24 2020 at 21:16

どういうわけかcmakeにこれを順番に実行するように指示できますか?

のいずれかを使用して、両方の標準ストリームでラインバッファリングされるようにcmakeを設定しstdbufます。

またはSTATUS、すべてのメッセージに使用するかSTATUS、cmakeからのすべてのメッセージに使用しないでください。あなたのユースケースでは、あなたはただmessage("-- [LOG] something something")