具有基于柯南配置文件的不同版本的依赖项
Having a different version of a dependency based on a conan profile
我们有几个针对嵌入式 Linux 环境的项目。我们正在切换到 Conan 来进行依赖管理。这些项目的共享库变成了 conan 包。这些包是为使用相同代码库的多个平台构建的。对于这些项目,我们使用 googletest 作为我们的单元测试框架。
对于这些嵌入式环境,我们依赖于供应商提供给我们的交叉编译器。我们绑定到 gcc 4.4.3 和 5.2.0 以交叉编译我们的代码,从而产生不同的行为构建包。当我们使用 googletest 时,我交叉编译了一个 googletest 版本并将其添加到我的 artifactory 中,以便解决依赖关系。我刚刚为 googletest 制作了一个简单的 conanfile.py 来构建它调用普通的 cmake,但不幸的是我无法使用 gcc 4.4.3 交叉编译器构建 1.8.1 和 1.10.0 版本。
可能的解决方案:
- 继续为每个项目使用 1.8.0 版的 googletest。可能,但缺点是无法使用新的 googletest 功能。
- 使用 gcc 4.4.2 配置文件时没有单元测试。可能,但由于我们定义了一个 test_package 它想要构建单元测试。我们可以解决的是在创建包时指定一个不存在的测试文件夹。但这意味着创建包的命令不同。
- 构建 gcc 4.4.3 配置文件时使用 1.8.0 版,其他配置文件使用更新版本。可能吗?
虽然为不同的平台构建,但我有代码库和一个 conanfile.py 来定义程序包。使用 --profile 选项,我可以针对不同的体系结构进行交叉编译。我想保持这种状态。
我尝试将 googletest 包的版本指定为 [>=1.8.0],希望 gcc 4.4.3 配置文件选择 1.8.0 版本,因为这是唯一带有二进制文件的版本那个架构。不幸的是,它找到了较新的版本并抛出一个错误,指出它缺少新版本的预构建包。
如何让一个配置文件使用 1.8.0 版的依赖项,并使另一个配置文件使用 1.10.0 版的依赖项?
我想防止的一件事是根据我 conanfile.py 中的配置文件设置进行检查,因为这会在文件之间产生依赖关系。这可能会导致我在以后添加或删除配置文件时更改 conanfile.py。
Use version 1.8.0 when building for the gcc 4.4.3 profile and use a newer version for other profiles. Possible?
是的,完全有可能。
但首先您需要了解 test_package 不适用于您的项目单元测试。创建测试包只是为了验证您的包。如果您想使用 Conan 测试您的项目,应该在构建步骤中完成:
class LibConan(ConanFile):
...
def build_requirements(self):
if self.settings.compiler == "gcc" and tools.Version(self.settings.compiler.version) < "5":
self.build_requires("gtest/1.8.1")
elif self.settings.compiler == "gcc":
self.build_requires("gtest/1.10.1")
def build(self):
cmake = CMake(self)
cmake.configure()
cmake.build()
if self.develop:
cmake.test()
您可以获得更多关于develop and unit test in Conan docs的信息。
关于这个例子,build_requirements
根据你的编译器版本和名称安装 GTest 包,在本例中,GCC < 5。除此之外,self.develop
仅在构建包时可用(柯南创建命令),因此单元测试仅在创建时运行,而不是在安装时运行。
您可以直接在配置文件中声明build_requires
,例如:
[settings]
compiler=gcc
compiler.version=4.4.3
[build_requires]
gtest/1.8.0
和
[settings]
compiler=gcc
compiler.version=5.2.0
[build_requires]
gtest/1.10.0
这些构建要求适用于所有需要构建的包,但您也可以定义它们适用于哪些包。您可以查看配方是否使用了此构建要求,如果您的配置文件未将 gtest 声明为构建要求,则跳过测试。
我们有几个针对嵌入式 Linux 环境的项目。我们正在切换到 Conan 来进行依赖管理。这些项目的共享库变成了 conan 包。这些包是为使用相同代码库的多个平台构建的。对于这些项目,我们使用 googletest 作为我们的单元测试框架。
对于这些嵌入式环境,我们依赖于供应商提供给我们的交叉编译器。我们绑定到 gcc 4.4.3 和 5.2.0 以交叉编译我们的代码,从而产生不同的行为构建包。当我们使用 googletest 时,我交叉编译了一个 googletest 版本并将其添加到我的 artifactory 中,以便解决依赖关系。我刚刚为 googletest 制作了一个简单的 conanfile.py 来构建它调用普通的 cmake,但不幸的是我无法使用 gcc 4.4.3 交叉编译器构建 1.8.1 和 1.10.0 版本。
可能的解决方案:
- 继续为每个项目使用 1.8.0 版的 googletest。可能,但缺点是无法使用新的 googletest 功能。
- 使用 gcc 4.4.2 配置文件时没有单元测试。可能,但由于我们定义了一个 test_package 它想要构建单元测试。我们可以解决的是在创建包时指定一个不存在的测试文件夹。但这意味着创建包的命令不同。
- 构建 gcc 4.4.3 配置文件时使用 1.8.0 版,其他配置文件使用更新版本。可能吗?
虽然为不同的平台构建,但我有代码库和一个 conanfile.py 来定义程序包。使用 --profile 选项,我可以针对不同的体系结构进行交叉编译。我想保持这种状态。
我尝试将 googletest 包的版本指定为 [>=1.8.0],希望 gcc 4.4.3 配置文件选择 1.8.0 版本,因为这是唯一带有二进制文件的版本那个架构。不幸的是,它找到了较新的版本并抛出一个错误,指出它缺少新版本的预构建包。
如何让一个配置文件使用 1.8.0 版的依赖项,并使另一个配置文件使用 1.10.0 版的依赖项?
我想防止的一件事是根据我 conanfile.py 中的配置文件设置进行检查,因为这会在文件之间产生依赖关系。这可能会导致我在以后添加或删除配置文件时更改 conanfile.py。
Use version 1.8.0 when building for the gcc 4.4.3 profile and use a newer version for other profiles. Possible?
是的,完全有可能。
但首先您需要了解 test_package 不适用于您的项目单元测试。创建测试包只是为了验证您的包。如果您想使用 Conan 测试您的项目,应该在构建步骤中完成:
class LibConan(ConanFile):
...
def build_requirements(self):
if self.settings.compiler == "gcc" and tools.Version(self.settings.compiler.version) < "5":
self.build_requires("gtest/1.8.1")
elif self.settings.compiler == "gcc":
self.build_requires("gtest/1.10.1")
def build(self):
cmake = CMake(self)
cmake.configure()
cmake.build()
if self.develop:
cmake.test()
您可以获得更多关于develop and unit test in Conan docs的信息。
关于这个例子,build_requirements
根据你的编译器版本和名称安装 GTest 包,在本例中,GCC < 5。除此之外,self.develop
仅在构建包时可用(柯南创建命令),因此单元测试仅在创建时运行,而不是在安装时运行。
您可以直接在配置文件中声明build_requires
,例如:
[settings]
compiler=gcc
compiler.version=4.4.3
[build_requires]
gtest/1.8.0
和
[settings]
compiler=gcc
compiler.version=5.2.0
[build_requires]
gtest/1.10.0
这些构建要求适用于所有需要构建的包,但您也可以定义它们适用于哪些包。您可以查看配方是否使用了此构建要求,如果您的配置文件未将 gtest 声明为构建要求,则跳过测试。