2024年12月3日 星期二

說明add_custom_target的參數

add_custom_target 參數解析

add_custom_target 是 CMake 中的一個命令,用來創建自定義的構建目標,這個目標不是直接構建檔案(如源代碼編譯生成執行檔),而是用來執行其他操作(例如執行腳本、設置環境變數、運行測試、執行外部命令等)。

add_custom_target 的基本語法如下:

add_custom_target(<target-name> [<source>...] [<COMMAND> <args>...]
[WORKING_DIRECTORY <dir>] [DEPENDS <depend-target>...] [COMMENT <comment>] [VERBATIM] [USES_TERMINAL])

參數解釋:

  1. <target-name>

    • 這是你要創建的目標名稱。你可以用它來引用這個目標,比如後續的 make runcmake --build 會執行此目標。
  2. [<source>...](可選):

    • 這部分允許你指定與目標相關的源文件(雖然在 add_custom_target 中通常不需要,因為這通常是一些外部操作)。
  3. [COMMAND <command> <args>...]

    • 用來指定執行的命令。這部分可以指定你要運行的外部命令(例如執行某個可執行文件、執行某個腳本等)。
    • 這部分是 add_custom_target 中最重要的參數之一。
  4. [WORKING_DIRECTORY <dir>](可選):

    • 指定目標執行命令時的工作目錄。如果未指定,則使用 CMake 預設的工作目錄。
  5. [DEPENDS <depend-target>...](可選):

    • 用來指定此目標的依賴。也就是說,在執行此目標之前,會先構建其他指定的目標。如果你的目標依賴於其他文件(例如構建後需要先運行的生成操作),你可以在這裡指定。
  6. [COMMENT <comment>](可選):

    • 為這個目標添加一條說明性文字,這樣在執行 make 或 CMake 構建時會顯示該文字來說明正在執行的操作。
  7. [VERBATIM](可選):

    • 指定命令的參數是否應該以原樣形式傳遞給命令。這會確保命令參數中的特殊字符不會被處理(例如空格不會被轉義)。通常當命令包含空格或特殊字符時會使用這個參數。
  8. [USES_TERMINAL](可選):

    • 如果你需要在終端中執行命令(如交互式命令),則指定這個選項。在某些情況下,這會強制 CMake 在終端中啟動命令,而不是在 CMake 中的圖形界面中執行。

範例中的 add_custom_target

add_custom_target(run_app
COMMAND ${CMAKE_COMMAND} -E env QT_QML_PLUGIN_PATH="C:/Qt/6.6.0/mingw_64/qml" ${CMAKE_BINARY_DIR}/bin/MyQtApp DEPENDS MyQtApp )

在這個範例中:

  1. run_app

    • 是你創建的自定義目標名稱。執行 cmake --build <build-dir> --target run_appmake run_app 時,將會執行這個目標。
  2. COMMAND ${CMAKE_COMMAND} -E env QT_QML_PLUGIN_PATH="C:/Qt/6.6.0/mingw_64/qml" ${CMAKE_BINARY_DIR}/bin/MyQtApp

    • 這裡的 COMMAND 指定了要執行的命令。首先,它執行 cmake-E env 命令來設置環境變數 QT_QML_PLUGIN_PATH,然後運行位於 ${CMAKE_BINARY_DIR}/bin/MyQtApp 的可執行文件(即你的應用程序)。
    • ${CMAKE_BINARY_DIR} 是指 CMake 的構建目錄,bin/MyQtApp 是構建過程中生成的可執行文件的路徑。這個命令確保在運行應用程式之前正確設置 QT_QML_PLUGIN_PATH
  3. DEPENDS MyQtApp

    • 表示在執行 run_app 目標之前,必須先構建 MyQtApp 目標。這保證了 MyQtApp 可執行文件在運行之前已經被編譯完成。

MyQtApp 是目錄還是執行檔名稱?

MyQtApp 在這裡是可執行文件的名稱,而不是目錄名稱。

  • 可執行文件MyQtApp 是指你最終要運行的可執行文件的名稱(例如 MyQtApp.exe,這取決於你的操作系統)。在構建過程中,這個可執行文件會被放置在 CMake 构建目錄中的 bin/ 子目錄下(取決於 CMake 的設置)。
  • 目錄MyQtApp 在這裡不是一個目錄,而是最終生成的可執行檔案的名稱。如果你有其他的輸出目錄設置,它將被放在 ${CMAKE_BINARY_DIR}/bin/ 路徑下。

總結

  • add_custom_target 用來定義一個自定義的構建目標,它不會生成任何實際的檔案,而是執行某些命令或操作。
  • 參數 COMMAND 用來指定執行的命令,DEPENDS 用來確保某個目標在執行前先被構建完成。
  • 在範例中,MyQtApp 是可執行檔案的名稱,而不是目錄。

如果你執行 cmake --build <build-dir> --target run_app,CMake 會先構建 MyQtApp,然後運行 run_app 目標,設置必要的環境變數並啟動應用程序。

沒有留言:

張貼留言