【CMake 系列】(三)ExternalProject 實踐

上次 說了第三方依賴管理,提到了咱們團隊在使用 ExternalProject 來管理依賴,此次來講說具體實踐,以及一個基於 CMake 的開源依賴管理工具 vcpkggit

ExternalProject 實踐

來看看它長什麼樣:github

ExternalProject_Add(<name> [<option>...])
ExternalProject_Add_Step(<name> <step> [<option>...])
ExternalProject_Get_Property
ExternalProject_Add_StepTargets(<name> [NO_DEPENDS] <step1> [<step2>...])

是否是很簡單,顯然不是,文檔裏寫成這樣是由於參數太多了,驚不驚喜?json

其實大部分參數用不到,我就挑選一些經常使用的參數來講說,從步驟來講,它主要分如下幾步:bootstrap

  • 目錄配置緩存

    • PREFIX:目錄前綴,建議選個本身看得順眼的;
    • DOWNLOAD_DIR:這個重要了,建議選個編譯目錄同級的,這樣刪掉編譯目錄後,就至關於緩存目錄了,下次再編譯就能夠節約下載時間;
  • 下載bash

    • URL & URL_HASH:包的下載與校驗,建議即便有 Git 項目也使用,這樣能夠進一步減小下載時間(就國內的網絡克隆 GitHub 而言 T_T);
    • GIT_REPOSITORY & GIT_TAG:Git 項目克隆,建議加上 GIT_SHALLOW,減小克隆項目的體積;
  • 更新網絡

    • PATCH_COMMAND 這個能夠修改後的源文件,好比你能夠做爲臨時 BUG 的修改方案,畢竟項目的維護者不必定會及時改掉;
  • 配置工具

    • CONFIGURE_COMMAND:非 CMake 項目的配置參數,能夠執行配置命令,如 ./configure --prefix=${CMAKE_INSTALL_PREFIX},另外須要配置 BUILD_IN_SOURCE true
    • CMAKE_ARGS:CMake 項目的配置參數,如 -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}
  • 編譯測試

    • 多數狀況下可略過
  • 測試ui

    • TEST_COMMAND: 須要測試編譯機器執行狀況的能夠設置,多數狀況下可略過,留空便可:TEST_COMMAND ""
  • 安裝

    • INSTALL_COMMAND:多數狀況下也能夠略過,執行的標準 make install 命令,若是不是這個安裝命令,能夠修改;
  • 其它

    • DEPENDS:有其它依賴的,能夠配置這個選項,它會理清這些依賴的關係,而後依次編譯;

在配置的時候,正如你看到的,我會經過設置 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

這裏必須狠狠誇誇微軟,今年來給開源界貢獻了很是多的產品以及工具,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)進行許可。

相關文章
相關標籤/搜索