message

記錄訊息。

概要

General messages
  message([<mode>] "message text" ...)

Reporting checks
  message(<checkState> "message text" ...)

Configure Log
  message(CONFIGURE_LOG <text>...)

一般訊息

message([<mode>] "message text" ...)

在日誌中記錄指定的訊息文字。如果給定多個訊息字串,它們將被串連成單一訊息,字串之間沒有分隔符號。

可選的 <mode> 關鍵字決定訊息的類型,這會影響訊息的處理方式

FATAL_ERROR

CMake 錯誤,停止處理和產生。

cmake(1) 執行檔將傳回非零的退出代碼

SEND_ERROR

CMake 錯誤,繼續處理,但跳過產生。

WARNING

CMake 警告,繼續處理。

AUTHOR_WARNING

CMake 警告 (開發者),繼續處理。

DEPRECATION

如果啟用變數 CMAKE_ERROR_DEPRECATEDCMAKE_WARN_DEPRECATED,則為 CMake 棄用錯誤或警告,否則不顯示訊息。

(無) 或 NOTICE

重要的訊息列印到 stderr 以引起使用者注意。

STATUS

專案使用者可能感興趣的主要訊息。理想情況下,這些訊息應該簡潔,不超過一行,但仍需提供足夠的資訊。

VERBOSE

針對專案使用者的詳細資訊性訊息。這些訊息應提供額外的細節,這些細節在大多數情況下不會引起注意,但對於希望深入了解專案建置過程的使用者可能很有用。

DEBUG

針對開發專案本身的開發人員而非只想建置專案的使用者的詳細資訊性訊息。這些訊息通常不會引起其他建置專案的使用者的興趣,並且通常與內部實作細節密切相關。

TRACE

具有非常低階實作細節的細粒度訊息。使用此日誌等級的訊息通常只是暫時性的,並且預期在發布專案、打包檔案等之前被移除。

3.15 版本新增: 新增了 NOTICEVERBOSEDEBUGTRACE 等級。

CMake 命令列工具將 STATUSTRACE 訊息顯示在 stdout 上,訊息前面加上兩個連字號和一個空格。所有其他訊息類型都發送到 stderr,並且沒有連字號前綴。CMake GUI 將所有訊息顯示在其日誌區域中。curses 介面 在狀態列上一次顯示一條 STATUSTRACE 訊息,並在互動式彈出框中顯示其他訊息。--log-level 這些工具的命令列選項可用於控制將顯示哪些訊息。

3.17 版本新增: 為了使日誌等級在 CMake 執行之間保持持久,可以改為設定 CMAKE_MESSAGE_LOG_LEVEL 變數。請注意,命令列選項優先於快取變數。

3.16 版本新增: 日誌等級為 NOTICE 及以下的訊息,每行前面都會加上 CMAKE_MESSAGE_INDENT 變數的內容(透過串連其列表項目轉換為單一字串)。對於 STATUSTRACE 訊息,此縮排內容將插入在連字號之後。

3.17 版本新增: 日誌等級為 NOTICE 及以下的訊息,每行前面也可以加上 [some.context.example] 形式的上下文。方括號之間的內容是透過將 CMAKE_MESSAGE_CONTEXT 列表變數轉換為點分隔的字串而獲得。訊息上下文將始終出現在任何縮排內容之前,但在任何自動新增的前導連字號之後。預設情況下,訊息上下文不顯示,必須透過給定 cmake --log-context 命令列選項或將 CMAKE_MESSAGE_CONTEXT_SHOW 變數設定為 true 來顯式啟用。有關使用範例,請參閱 CMAKE_MESSAGE_CONTEXT 文件。

CMake 警告和錯誤訊息文字顯示使用簡單的標記語言。非縮排文字以換行分隔的段落格式化為自動換行。縮排文字被視為預先格式化。

報告檢查

3.17 版本新增。

CMake 輸出中常見的模式是顯示某種類型檢查開始的訊息,然後是另一個報告該檢查結果的訊息。例如

message(STATUS "Looking for someheader.h")
#... do the checks, set checkSuccess with the result
if(checkSuccess)
  message(STATUS "Looking for someheader.h - found")
else()
  message(STATUS "Looking for someheader.h - not found")
endif()

可以使用 message() 命令的 CHECK_... 關鍵字形式更穩健和方便地表達此訊息

message(<checkState> "message" ...)

其中 <checkState> 必須是以下其中之一

CHECK_START

記錄有關即將執行的檢查的簡潔訊息。

CHECK_PASS

記錄檢查的成功結果。

CHECK_FAIL

記錄檢查的失敗結果。

當記錄檢查結果時,命令會重複顯示最近開始的檢查的訊息,該檢查尚未報告結果,然後是一些分隔符號,然後是 CHECK_PASSCHECK_FAIL 關鍵字後提供的訊息文字。檢查訊息始終以 STATUS 日誌等級報告。

檢查可以是巢狀的,每個 CHECK_START 都應該恰好有一個匹配的 CHECK_PASSCHECK_FAILCMAKE_MESSAGE_INDENT 變數也可用於在需要時為巢狀檢查新增縮排。例如

message(CHECK_START "Finding my things")
list(APPEND CMAKE_MESSAGE_INDENT "  ")
unset(missingComponents)

message(CHECK_START "Finding partA")
# ... do check, assume we find A
message(CHECK_PASS "found")

message(CHECK_START "Finding partB")
# ... do check, assume we don't find B
list(APPEND missingComponents B)
message(CHECK_FAIL "not found")

list(POP_BACK CMAKE_MESSAGE_INDENT)
if(missingComponents)
  message(CHECK_FAIL "missing components: ${missingComponents}")
else()
  message(CHECK_PASS "all components found")
endif()

以上輸出的外觀如下

-- Finding my things
--   Finding partA
--   Finding partA - found
--   Finding partB
--   Finding partB - not found
-- Finding my things - missing components: B

設定日誌

3.26 版本新增。

message(CONFIGURE_LOG <text>...)

使用指定的 <text> 記錄 設定日誌訊息事件。依照慣例,如果文字包含多行,則第一行應該是事件的摘要。

此模式旨在記錄系統檢查或其他由快取條目保護的一次性操作的詳細資訊,但未使用 try_compile()try_run() 執行,它們會自動記錄其詳細資訊。專案應避免在每次 CMake 執行時都呼叫它。例如

if (NOT DEFINED MY_CHECK_RESULT)
  # Print check summary in configure output.
  message(CHECK_START "My Check")

  # ... perform system inspection, e.g., with execute_process ...

  # Cache the result so we do not run the check again.
  set(MY_CHECK_RESULT "${MY_CHECK_RESULT}" CACHE INTERNAL "My Check")

  # Record the check details in the cmake-configure-log.
  message(CONFIGURE_LOG
    "My Check Result: ${MY_CHECK_RESULT}\n"
    "${details}"
  )

  # Print check result in configure output.
  if(MY_CHECK_RESULT)
    message(CHECK_PASS "passed")
  else()
    message(CHECK_FAIL "failed")
  endif()
endif()

如果目前沒有正在設定的專案,例如在 cmake -P 腳本模式下,此命令不執行任何操作。

參見