Il messaggio CMake non viene stampato nell'ordine corretto
So che la filosofia di compilazione di CMake è basata sulla "dipendenza" e non necessariamente nell'ordine in cui le attività vengono annotate nell'elenco CMake.
Ma quando si tratta, message(STATUS ...)ho bisogno che vengano visualizzati in ordine, altrimenti non hanno senso.
Posso in qualche modo dire a CMake di eseguirlo in sequenza?
Esempio:
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 ()
Le stampe come segue:
[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
....
Risposte
Questo sta mescolando output di stdout e stderr e non stamperà "in ordine".
Dalla documentazione di CMake:
Lo strumento della riga di comando CMake visualizza i messaggi STATUS to TRACE su stdout con il messaggio preceduto da due trattini e uno spazio. Tutti gli altri tipi di messaggi vengono inviati a stderr e non sono preceduti da trattini.
Quindi, quando usi message([<mode>] "message text" ...)scegli una modalità singola invece di mescolarli.
posso in qualche modo dire a cmake di eseguirlo in sequenza?
Impostare cmake in modo che venga eseguito il buffer di riga su entrambi i flussi standard con stdbuf.
Oppure usa STATUSper tutti i messaggi o non usare STATUSper tutti i messaggi da cmake. Con il tuo caso d'uso potresti semplicemente message("-- [LOG] something something").