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命令。
在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。具體如下案例:
定義了兩個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則會報錯:
BYPRODUCTS不會校驗文件是否生成了,即使沒有生成文件,也不會報錯:
執行cmake .. ; make byproduct:
make clean會清理掉BYPRODUCTS指定的文件:
執行結果:
執行make clean:
WORKING_DIRECTORY
用于修改這個target執行COMMAND時所在的路徑,支持絕對路徑和相對路徑。
默認是在編譯路徑下所在的子目錄。
這個CMakeLists.txt是在源文件的src下的:
因此執行后打印的pwd就是在build內相應的子目錄下:
對WORKING_DIRECTORY使用絕對路徑:
執行mkdir src2 ; cmake .. ; make work-dir。
那么執行時的路徑就在配置的絕對路徑下:
同樣的,使用相對路徑:
執行命令,也是一樣的效果。
那么在修改的執行路徑后,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設置為相對路徑的文件:
make clean后刪除成功了。
設置為絕對路徑也成功了。
總結
以上是生活随笔為你收集整理的CMake之add_custom_target的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CMake命令之add_custom_c
- 下一篇: custom的短语_custom到底是什