我们有几个针对嵌入式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版本。
可能的解决方案:
尽管我为不同的平台进行构建,但我在代码库和一个conanfile.py上定义了程序包。使用--profile选项,我交叉编译了不同的体系结构。我想保持这种方式。
我尝试将googletest软件包的版本指定为[> = 1.8.0],希望它对于gcc 4.4.3配置文件采用1.8.0版本,因为它是该架构唯一具有二进制文件的版本。不幸的是,它找到了较新的版本,并抛出一个错误,即缺少该较新版本的预构建软件包。
如何使一个配置文件使用1.8.0版本的依赖关系,而另一个配置文件使用1.10.0版的依赖关系?
我要防止的一件事是根据conanfile.py中的配置文件设置进行检查,因为这会在文件之间创建依赖关系。这可能会导致我将来在添加或删除配置文件时更改conanfile.py。
答案 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 test和Conan 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,则跳过测试。