2011-11-16 154 views
14

基本上我想要實現這個工作流程:從windows系統庫如何以跨平臺的方式自動下載C++依賴關係+ CMake?

  1. 結帳(或與此有關的任何平臺)。

  2. 運行一些工具,得到的依賴關係,既包括和庫,並把他們在適當的位置(像 「\ Program Files文件\微軟的Visual Studio 10.0 \ VC \ Lib文件和\包括」 在Windows上)

  3. 運行CMake(在win上創建MSVS項目)

  4. 打開MSVS項目並編譯它。

我想在大多數平臺上都有這個工作流程。

我不想有下載的依賴手工

如何做到這一點沒有在庫中存儲的依賴? 達成此目的的最佳方法是什麼?

+1

你是否發現了任何解決方案給你的問題呢?我一直在尋找類似npm的東西來構建具有依賴關係的C/C++程序。 –

+0

@hg。據我所知,C++沒有跨平臺的包管理器。 – JBeurer

回答

19

在CMake的你可以使用file(DOWNLOAD URL PATH)download a file,與定製相結合這個命令下載並解壓縮:

set(MY_URL "http://...") 
set(MY_DOWNLOAD_PATH "path/to/download/to") 
set(MY_EXTRACTED_FILE "path/to/extracted/file") 

if (NOT EXISTS "${MY_DOWNLOAD_PATH}") 
    file(DOWNLOAD "${MY_URL}" "${MY_DOWNLOAD_PATH}") 
endif() 

add_custom_command(
    OUTPUT "${MY_EXTRACTED_FILE}" 
    COMMAND command to unpack 
    DEPENDS "${MY_DOWNLOAD_PATH}") 

你的目標應該依賴於從自定義命令的輸出,那麼當你運行C進行文件將被下載,當你建立,提取和使用。

這可以全部封裝在一個宏中,以方便使用。

你也可以看看使用CMake模塊ExternalProject,它可以做你想做的。

+0

但是,這不是一種跨平臺的方式來設置和安裝依賴關係,從公共存儲庫下載的依賴關係也不是。 – JBeurer

+0

使用CMake'文件(DOWNLOAD ...)或ExternalProject是跨平臺的。如果依賴包是包,那麼在Windows上,您需要使用'msiexec'來安裝MSI包;在Linux上,它依賴於分發:在Red Hat衍生產品'yum'或'rpm'上使用RPM軟件包,在Debian衍生產品'apt'或'dpkg'上使用DEB軟件包。 –

+0

是的,下載命令是跨平臺的,但這不是安裝依賴關係的跨平臺方式。每個平臺通常具有不同的文件和軟件包(因此下載鏈接)具有相同的依賴關係。你可以說我正在尋找類似Maven的C++依賴關係,以便與CMake很好地結合在一起。 – JBeurer

-24

達到此目的的最佳方法是消除您的依賴關係。

依賴是邪惡的。

消除它們而不是依賴它們。

說真的。

你不想手動下載它們,你不想將它們存儲在你的存儲庫中,你的客戶端不想爲你下載它們。事實上,你的編譯器甚至不想編譯它們。

不想切換到Java還加入了C++庫的依賴......

在此期間,建議檢查出的ExternalProject模塊的CMake的是你會得到一個存儲的非存儲庫,最接近自動依賴性下載配置構建和安裝隨時基於CMake的構建。

+6

不能,不能。切換到Java?No. No. No.請神NOOOOOOO! – JBeurer

+5

我認爲這是一個有趣的點,但是,它的措辭像火焰誘餌,並沒有考慮到用戶的需求 – pope

+1

我猜一個人的幽默是另一個人的「火焰誘餌」......我認爲對ExternalProject的引用,無論是在我的回答還是在其他更高級的答案中,都是最接近用戶需求的東西,這裏沒有神祕的銀色子彈,沒有C++的maven如果http://ryppl.org項目它會超越ExternalProject,現在,這是我得到的最好的指針 – DLRdave

3

Hunter是一個基於CMake 3的依賴管理系統。它工作得很好,但還沒有很多軟件包。如果你需要的軟件包還不是系統的一部分,那麼可以相當簡單地添加它們,假設它們也基於CMake。

-2

達到此目的的最佳方法是消除您的依賴關係。

依賴是邪惡的。

消除它們而不是依賴它們。

認真地