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命令详解(构建)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CMake笔记:add_custom_c
- 下一篇: 用Custom Element来实现UI