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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

CMake之add_custom_target

發布時間:2023/12/8 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CMake之add_custom_target 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文介紹了CMake中的add_custom_target命令。使用的CMake版本是3.22.1。
CMake中一切都是基于target的,如add_library會產生一個library的target,add_executable會產生一個exe的target…
本文的add_custom_target會根據命令的參數生成一個target,這個target相對的可以更定制化一點。

官方文檔:https://cmake.org/cmake/help/v3.22/command/add_custom_target.html?highlight=add_custom

target默認不在all target中

all target的意思是,在cmake之后,make會生成和執行all target內所有的target。
例如add_executable默認就會生成在all target中。但如果在add_exe命令中加入EXCLUDE_FROM_ALL,才會從all target中移除,即make不會默認生成。

而add_custom_target的target則是默認不在all target中。
如下面案例,定義了一個print-pwd的target,這個target執行pwd命令。

add_custom_target(print-pwdCOMMAND "pwd" )

在make之后,是沒有任何反應的,這證明了此target不是all target內:

對于這種target,需要make <target-name>才會執行:

以上打印了這個target的COMMAND信息,以及target build完成了。

ALL

在聲明target的時候,可以加上ALL,這個target就會加入all target中,默認進行執行了。

add_custom_target(print-pwdALLCOMMAND "pwd" )

DEPENDS

target之間可以有依賴關系,A依賴B(A depends on B),意味著A的build,需要基于B 已經build完成。
要實現A依賴B,則要在定義A的時候,加上DEPENDS B。具體如下案例:

add_custom_target(print-pwdCOMMAND "pwd" )add_custom_target(depend-print-pwdCOMMAND "echo" "depend pwd"DEPENDS print-pwd )

定義了兩個target,后者依賴前者,并且后者會打印"depend pwd"。
這里要注意一點,COMMAND中的命令和參數是分開的,如第二個target的COMMAND "echo" "depend pwd",而不能COMMAND "echo 'depend pwd'"。

同樣的,在make之后是沒有反應的。在make depend-print-pwd后:

能發現會先build print-pwd,再build depend-print-pwd。

這里也可以把命令內的DEPENDS改為:add_dependencies(depend-print-pwd print-pwd),作用是一樣的。

BYPRODUCTS

聲明這個target在執行時隨之生成的文件。
BYPRODUCTS需要和COMMAND配合使用,如果漏了COMMAND則會報錯:

add_custom_target(byproductBYPRODUCTS "aaa.txt" )


BYPRODUCTS不會校驗文件是否生成了,即使沒有生成文件,也不會報錯:

add_custom_target(byproductCOMMAND "echo" "aaa"BYPRODUCTS "aaa.txt" )

執行cmake .. ; make byproduct:

make clean會清理掉BYPRODUCTS指定的文件:

add_custom_target(byproductCOMMAND "touch" "aaa.txt"COMMAND "touch" "bbb.txt"BYPRODUCTS "aaa.txt" )

執行結果:

執行make clean:

WORKING_DIRECTORY

用于修改這個target執行COMMAND時所在的路徑,支持絕對路徑相對路徑
默認是在編譯路徑下所在的子目錄。

add_custom_target(work-dirCOMMAND "pwd" )

這個CMakeLists.txt是在源文件的src下的:

因此執行后打印的pwd就是在build內相應的子目錄下:


WORKING_DIRECTORY使用絕對路徑:

add_custom_target(work-dirCOMMAND "pwd"WORKING_DIRECTORY "/root/cmake_learning/src/test-add-custom-target/build/src2" )

執行mkdir src2 ; cmake .. ; make work-dir。
那么執行時的路徑就在配置的絕對路徑下:

同樣的,使用相對路徑:

add_custom_target(work-dirCOMMAND "pwd"WORKING_DIRECTORY "../src2" )

執行命令,也是一樣的效果。

那么在修改的執行路徑后,BYPRODUCTS還有沒有效果呢?

add_custom_target(work-dirCOMMAND "pwd"COMMAND "touch" "aaa.txt"WORKING_DIRECTORY "../src2"BYPRODUCTS "aaa.txt" )

可以看到文件生成成功了:

但是用了make clean之后,文件卻沒有被刪除。

這是因為WORKING_DIRECTORY的功能實際上是在執行每個COMMAND的命令前,先cd到指定路徑,在執行相應命令。
這是在調試過程中偶然發現的:

因此估計是BYPRODUCTS定位不到生成的文件,導致make clean失敗。
BYPRODUCTS設置為相對路徑的文件:

add_custom_target(work-dirCOMMAND "pwd"COMMAND "touch" "aaa.txt"WORKING_DIRECTORY "../src2"BYPRODUCTS "../src2/aaa.txt" )

make clean后刪除成功了。
設置為絕對路徑也成功了。

總結

以上是生活随笔為你收集整理的CMake之add_custom_target的全部內容,希望文章能夠幫你解決所遇到的問題。

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