日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CMake I add_custom_command命令详解(构建)

發布時間:2023/12/8 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CMake I add_custom_command命令详解(构建) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

一、add_custom_command

1.執行有輸出文件的自定義操作

2.執行沒有輸出的自定義操作

二、應用

1.執行有輸出文件的自定義操作

2.執行沒有輸出的自定義操作


????????CMake提供了三個選項來在構建時執行自定義命令,這三個選項強制執行特定的語義,并且不可互換:

  • 使用 add_custom_command 編譯目標,生成輸出文件。
  • add_custom_target 的執行沒有輸出。
  • 構建目標前后, add_custom_command 的執行可以沒有輸出。

? ? ? ? 本文注意講解add_custom_command命令,該命令有兩種使用方式。

一、add_custom_command

1.執行有輸出文件的自定義操作

????????add_custom_command 向目標添加規則,并通過執行命令生成輸出。

add_custom_command(OUTPUT output1 [output2 ...]COMMAND command1 [ARGS] [args1...][COMMAND command2 [ARGS] [args2...] ...][MAIN_DEPENDENCY depend][DEPENDS [depends...]][BYPRODUCTS [files...]][IMPLICIT_DEPENDS <lang1> depend1[<lang2> depend2] ...][WORKING_DIRECTORY dir][COMMENT comment][DEPFILE depfile][JOB_POOL job_pool][VERBATIM] [APPEND] [USES_TERMINAL][COMMAND_EXPAND_LISTS])
  • OUTPUT:指定命令預期生成的輸出文件。3.20版本以后,輸出參數可使用一組受限的生成器表達式。
  • COMMAND:指定生成時要執行的命令行。
  • MAIN_DEPENDENCY:指定命令的主輸入源文件。類似于DEPENDS。
  • DEPENDS:指定命令所依賴的文件。
  • BYPRODUCTS:指定命令預期生成的文件,但其修改時間可能比依賴項的新,也可能不比依賴項的新。
  • IMPLICIT_DEPENDS:請求掃描輸入文件的隱式依賴項。此選項不能與DEPFILE選項同時指定。
  • WORKING_DIRECTORY:指定在何處執行命令。
  • COMMENT:指定在生成時執行命令之前顯示的消息。
  • DEPFILE:指定保存自定義命令依賴項的depfile。它通常由自定義命令本身發出。僅當生成器支持此關鍵字時,才能使用此關鍵字。
  • JOB_POOL:為Ninja生成器指定一個池。
  • VERBATIM:對于構建工具,命令的所有參數都將被正確轉義,以便被調用的命令接收到的每個參數不變。請注意,在add_custom_command甚至看到參數之前,CMake語言處理器仍然使用一級轉義。建議使用VERBATIM,因為它可以保證正確的行為。如果不指定VERBATIM,則行為是依賴于平臺的,因為CMake沒有針對于特定工具中特殊字符的保護措施。
  • APPEND:將COMMAND和DEPENDS?附加到第一個指定輸出的自定義命令。
  • USES_TERMINAL:如果可能,該命令將被授予直接訪問終端的權限。
  • COMMAND_EXPAND_LISTS:命令參數中的列表將展開,包括使用生成器表達式創建的列表。

????????add_custom_command 有兩個限制:

  • 只有在相同的 CMakeLists.txt 中,指定了所有依賴于其輸出的目標時才有效。
  • 對于不同的獨立目標,使用 add_custom_command 的輸出可以重新執行定制命令。這可能會導致沖突,應該避免這種情況的發生。

????????第二個限制,可以使用 add_dependencies 來避免。不過,規避這兩個限制的正確方法是使 用 add_custom_target 命令。

2.執行沒有輸出的自定義操作

????????向目標(如庫或可執行文件)添加自定義命令。這對于在構建目標之前或之后執行操作非常有用。該命令成為目標的一部分,僅在構建目標本身時執行。如果目標已生成,則不會執行該命令。

add_custom_command(TARGET <target>PRE_BUILD | PRE_LINK | POST_BUILDCOMMAND command1 [ARGS] [args1...][COMMAND command2 [ARGS] [args2...] ...][BYPRODUCTS [files...]][WORKING_DIRECTORY dir][COMMENT comment][VERBATIM] [USES_TERMINAL][COMMAND_EXPAND_LISTS])
  • TARGET:由?add_executable?或?add_library?生成的目標文件名稱;
  • PRE_BUILD | PRE_LINK | POST_BUILD:分別表示編譯之前執行命令,鏈接之前執行命令,生成目標文件后執行命令;
  • COMMAND:需要執行的命令;
  • BYPRODUCTS:指定命令預期生成的文件,但其修改時間可能比依賴項的新,也可能不比依賴項的新。
  • WORKING_DIRECTORY:指定在何處執行命令。
  • COMMENT:指定在生成時執行命令之前顯示的消息。
  • VERBATIM:對于構建工具,命令的所有參數都將被正確轉義,以便被調用的命令接收到的每個參數不變。請注意,在add_custom_command甚至看到參數之前,CMake語言處理器仍然使用一級轉義。建議使用VERBATIM,因為它可以保證正確的行為。如果不指定VERBATIM,則行為是依賴于平臺的,因為CMake沒有針對于特定工具中特殊字符的保護措施。
  • USES_TERMINAL:如果可能,該命令將被授予直接訪問終端的權限。
  • COMMAND_EXPAND_LISTS:?命令參數中的列表將展開,包括使用生成器表達式創建的列表。

補充:

PRE_BUILD:在執行與目標相關的任何其他規則之前執行的命令。

PRE_LINK:使用此選項,命令在編譯目標之后,調用鏈接器或歸檔器之前執行。Visual Studio 7或更高版本之外的生成器中使用 PRE_BUILD 將被解釋為 PRE_LINK 。

POST_BUILD:如前所述,這些命令將在執行給定目標的所有規則之后運行。?

二、應用

1.執行有輸出文件的自定義操作

????????下面的例子實現的是:聲明自定義命令來提取wrap_BLAS_LAPACK.tar.gz壓縮包,并更新提取文件的時間戳。

#聲明一個變量 wrap_BLAS_LAPACK_sources來保存wrap_BLAS_LAPACK.tar.gz 壓縮包文件的名稱 set(wrap_BLAS_LAPACK_sources${CMAKE_CURRENT_BINARY_DIR}/wrap_BLAS_LAPACK/CxxBLAS.hpp${CMAKE_CURRENT_BINARY_DIR}/wrap_BLAS_LAPACK/CxxBLAS.cpp${CMAKE_CURRENT_BINARY_DIR}/wrap_BLAS_LAPACK/CxxLAPACK.hpp${CMAKE_CURRENT_BINARY_DIR}/wrap_BLAS_LAPACK/CxxLAPACK.cpp)#當目標wrap_BLAS_LAPACK_sources 被新生成時,執行COMMAND 后面的命令 add_custom_command(OUTPUT${wrap_BLAS_LAPACK_sources}COMMAND #在構建時提取打包文件${CMAKE_COMMAND} -E tar xzf ${CMAKE_CURRENT_SOURCE_DIR}/wrap_BLAS_LAPACK.tar.gzCOMMAND #更新提取文件的時間戳${CMAKE_COMMAND} -E touch ${wrap_BLAS_LAPACK_sources}WORKING_DIRECTORY #指定在何處執行命令${CMAKE_CURRENT_BINARY_DIR}DEPENDS #列出了自定義命令的依賴項${CMAKE_CURRENT_SOURCE_DIR}/wrap_BLAS_LAPACK.tar.gzCOMMENT #在構建時打印狀態消息"Unpacking C++ wrappers for BLAS/LAPACK"VERBATIM #告訴CMake為生成器和平臺生成正確的命令,從而確保完全獨立。)

2.執行沒有輸出的自定義操作

????????使用 add_custom_command 的第二種方式,在構建目標之前打印目標的鏈接:

add_executable(example "")target_sources(examplePRIVATEexample.f90)add_custom_command(TARGETexamplePRE_LINKCOMMAND${PYTHON_EXECUTABLE}${CMAKE_CURRENT_SOURCE_DIR}/echo-file.py${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/example.dir/link.txtCOMMENT"link line:"VERBATIM)

????????PRE_LINK 命令將 ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/example.dir/link.txt 的內容打印到屏幕上:

?link line:
?/usr/bin/f95 -O3 -DNDEBUG -O3 CMakeFiles/example.dir/example.f90.o -o example

總結

以上是生活随笔為你收集整理的CMake I add_custom_command命令详解(构建)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。