上次 說了第三方依賴管理,提到了咱們團隊在使用 ExternalProject
來管理依賴,此次來講說具體實踐,以及一個基於 CMake 的開源依賴管理工具 vcpkg。git
來看看它長什麼樣:github
ExternalProject_Add(<name> [<option>...]) ExternalProject_Add_Step(<name> <step> [<option>...]) ExternalProject_Get_Property ExternalProject_Add_StepTargets(<name> [NO_DEPENDS] <step1> [<step2>...])
是否是很簡單,顯然不是,文檔裏寫成這樣是由於參數太多了,驚不驚喜?json
其實大部分參數用不到,我就挑選一些經常使用的參數來講說,從步驟來講,它主要分如下幾步:bootstrap
目錄配置緩存
下載bash
GIT_SHALLOW
,減小克隆項目的體積;更新網絡
配置工具
./configure --prefix=${CMAKE_INSTALL_PREFIX}
,另外須要配置 BUILD_IN_SOURCE true
;-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}
;編譯測試
測試ui
TEST_COMMAND ""
;安裝
make install
命令,若是不是這個安裝命令,能夠修改;其它
在配置的時候,正如你看到的,我會經過設置 prefix
爲 ${CMAKE_INSTALL_PREFIX}
將全部的第三方依賴安裝在一個可配置的統一目錄,這樣就很方便一塊兒打包。另外,這樣有另外一個好處,若是有依賴關係,大部分狀況就能自動解決。
至於 ExternalProject_Add_Step
跟其它兩個就略過了,不怎麼用到,可是你想要編譯文檔的話,仍是能夠用的。而 ExternalProject_Get_Property
對於在你將 ExternalProject
做爲主項目編譯步驟時使用有些用處,只是考慮到它不是在配置時下載編譯,畢竟如 target_link_libraies
這類方法須要求你已經有編譯產物了,所以不怎麼會用到。
當你編譯完成後,能夠將全部的編譯產物打包上傳至公共存儲空間,而後再在主目錄下的 CMakeLists.txt
中寫個下載步驟便可,這樣,你的全部團隊成員們均可以省去第三方代碼的編譯時間了。
具體代碼當作課後做業了,提示以下:
file(DOWNLOAD <url> <file> [...]) file(UPLOAD <file> <url> [...])
或許你會以爲,這麼作着實有點鬧騰,不怕,接下來就介紹一個很方便的工具。
這裏必須狠狠誇誇微軟,今年來給開源界貢獻了很是多的產品以及工具,vcpkg 就是其中的一個。
簡單來講,它就是基於 CMake 的一個包管理工具,在安裝完成後,一條命令就能安裝絕大多數的依賴,也有愈來愈多的第三方包也開始接受並提供 vcpkg 的支持。雖然尚未囊括全部的第三方包,交叉編譯也存在必定的問題,可是我相信若是接下來能有包管理工具統一 C/C++ 的話,vcpkg 就是候選之一。
它的安裝很簡單:
git clone https://github.com/Microsoft/vcpkg.git cd vcpkg ./bootstrap-vcpkg.sh
若是須要安裝包:
vcpkg install opencv
而後在你的項目中,使用 find_package
便可:
find_package(OpenCV REQUIRED) target_link_libraries(target ${OpenCV_LIBS})
最後,在 CMake 配置階段:
cmake .. -DCMAKE_TOOLCHAIN_FILE=path/to/vcpkg/scripts/buildsystems/vcpkg.cmake
就能夠了,對於 OpenCV 這類有着系統支持的包,或許沒有提高太多的效率,可是對於一些沒有多少系統支持的包,好比 GoogleTest、nlohmann-json、prometheus-cpp 等,不再須要費勁去本身下載編譯了。
以後,爲了方便隨時運行 vcpkg,能夠將它加到系統 PATH:
export PATH="path/to/vcpkg/:$PATH"
是否是很簡單?只是,目前它仍是不完善,我之因此不在現有的團隊項目中使用它,就是由於交叉編譯的問題沒解決,它目前支持的交叉編譯很少,好比面對 Android 還有 iOS 的交叉編譯,它就基本上成了廢物通常,打算等往後它完善了再用。
另外,它相對於我上面的方案來講,編譯時間仍是不能省去的。
感謝閱讀,本文首發於 Github issues: https://github.com/xizhibei/b... (Star 以及 Watch 強烈暗示 🙈);另外這篇文章也能在本人博客內閱讀:https://blog.xizhibei.me/2020... 。
本文采用 署名-非商業性使用-相同方式共享(BY-NC-SA)進行許可。