基于柯南配置文件具有不同版本的依赖项

时间:2020-03-18 10:43:23

标签: c++ gcc googletest conan

我们有几个针对嵌入式Linux环境的项目。我们正在切换到柯南进行依赖性管理。这些项目的共享库被转换为柯南包。这些软件包使用相同的代码库为多个平台构建。对于这些项目,我们使用googletest作为我们的单元测试框架。

对于这些嵌入式环境,我们与供应商提供给我们的交叉编译器紧密联系。我们与gcc 4.4.3和5.2.0捆绑在一起,以交叉编译我们的代码,从而生成不同的行为构建包。当我们使用googletest时,我交叉编译了一个版本的googletest并将其添加到我的工件中,以便可以解决依赖关系。我只是为googletest创建了一个简单的conanfile.py来调用正常的cmake进行构建,但不幸的是,我无法使用gcc 4.4.3交叉编译器来构建1.8.1和1.10.0版本。

可能的解决方案:

  1. 对于每个项目,请继续使用1.8.0版本的googletest。可能,但缺点是无法使用新的googletest功能。
  2. 使用gcc 4.4.2配置文件时没有任何单元测试。可能,但是由于事实上我们定义了一个test_package,因此它想要构建单元测试。我们可以解决的是在创建程序包时指定一个不存在的测试文件夹。但这意味着与创建包不同的命令。
  3. 在构建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。

2 个答案:

答案 0 :(得分:1)

在构建gcc 4.4.3配置文件时使用版本1.8.0,而在其他配置文件中使用更新的版本。可能吗?

是的,完全有可能。

但是首先您需要了解test_package不适用于您的项目单元测试。创建测试包仅用于验证您的包。如果要使用柯南测试项目,则应在构建步骤中完成:


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中获得有关unit testConan docs的更多信息。

关于本示例,现在build_requirements根据您的编译器版本及其名称(在本例中为GCC <5)安装GTest软件包。此外,self.develop仅在构建软件包时可用(conan create命令),因此单元测试仅在创建时运行,而不在安装时运行。

答案 1 :(得分:1)

您可以在配置文件中直接声明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

这些构建要求适用于所有需要构建的软件包,但是您也可以定义将它们应用于哪些软件包。您可以在配方中检查是否使用了该build-requires,如果您的个人资料未将gtest声明为build-requires,则跳过测试。

选中https://docs.conan.io/en/latest/reference/profiles.html

相关问题