2011-11-16 32 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

达到此目的的最佳方法是消除您的依赖关系。

依赖是邪恶的。

消除它们而不是依赖它们。

认真地