【问题标题】:Multiple conanfile.py management多个conanfile.py管理
【发布时间】:2020-03-20 13:15:16
【问题描述】:

假设我在一个项目中有 2 个不同的 conanfile.py,我调用 conan install 两次来安装它们的依赖项。我在将它们添加到 cmake 时遇到了麻烦。

如果我使用基本设置

include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup()

它只包括最新的。是否可以包含多个 conanbuildinfo.cmake 文件?

【问题讨论】:

  • 不,你不能。为什么需要 2 个 conanfiles? Conanfile.py 是一个python脚本,你可以根据需要自定义,一个recipe就足够了。
  • 我想为 2 个不同的模块保持独立的依赖关系。例如,我想为其他模块使用一个通用的 conanfile.py 和另一个 conanfile.py。保持这一点的唯一方法是使用模块中的要求更新通用 conanfile.py 如果模块存在,我猜?
  • other modules 是什么意思?是子模块吗?
  • 是子模块。
  • @uilianries 我要解决的问题是我的项目中有不同的子模块。我可以包括所有这些或其中一些或仅一个。假设我使用了所有模块并将所有依赖项放在一个 conanfile.py 中,这很好。但是如果我添加任何一个模块并使用相同的 conanfile.py,它将再次安装所有无效的依赖项。柯南有解决这种情况的办法吗?

标签: build cmake conan


【解决方案1】:

如果你有 2 个完全独立的项目,你可以有 2 个不同的 conanfiles 并将生成的文件放在不同的文件夹中:

$ conan install conanfile1.py --install-folder=folder1
$ conan install conanfile2.py --install-folder=folder2

然后在你的第一个项目中:

include(<...>/folder1/conanbuildinfo.cmake)
conan_basic_setup()

在你的第二个项目中:

include(<...>/folder2/conanbuildinfo.cmake)
conan_basic_setup()

您需要定义一些一致的约定来定位每个项目的生成文件。

但是请注意,如果打算将不同的模块一起使用,例如最近链接在一起,如果您不使用相同的依赖项和相同的版本,您可能会在全局应用程序中遇到链接或运行时错误。如果模块是相关的,并且您想使用相同版本的依赖项,那么您肯定只想使用 1 个包含所有依赖项的 conanfile。

请注意,即使您只使用 1 个 conanfile,也有不同的方法来定义您想要的特定依赖项:

  • 您可以使用cmake 生成器的目标:
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup(TARGETS)```

add_library(mylib1 ... <sources>)
target_link_libraries(mylib1 PUBLIC CONAN_PKG::Dep1 CONAN_PKG::Dep2)

add_library(mylib2 ... <sources>)
target_link_libraries(mylib2 PUBLIC CONAN_PKG::Dep3 CONAN_PKG::Dep4)
  • cmake_find_package 生成器还为依赖图中的每个包生成一个findXXXX.cmake 文件。您可以使用find_package(XXXX) 和以后的结果,指定不同的依赖项。推荐使用cmake_find_package_multi 生成器。

【讨论】:

  • 现在我会采纳你的第一个建议。它易于管理。一个 conanfile 的使用是无效的,因为我需要下载所有的包,即使我可能不使用它们。
猜你喜欢
  • 1970-01-01
  • 2017-01-09
  • 1970-01-01
  • 2011-11-06
  • 2015-05-04
  • 1970-01-01
  • 2022-11-17
  • 2019-06-17
  • 2016-03-23
相关资源
最近更新 更多