对柯南架构的困惑

问题描述

我正在尝试掌握柯南的工作原理,并学习柯南的文档。
到目前为止,我从客户端得到的是,客户端编写了一个 conanfile.txt 文件,其中包含一个 [requirements] 部分,其中指定了项目的所有要求。
当客户端运行 conan install - Conan 从 ~/.conan/profiles/default 读取客户端的设置(或者也可以通过 Conan CLI 指定另一个配置文件)并从远程下载相关的二进制包(假设它不存在于本地缓存中)对应于配置文件(如操作系统、架构等)。

我的困惑始于生产者方面。这是我目前得到的:为了创建一个包,您需要编写一个 conanfile.py,它被称为 recipe。这个秘籍描述了二进制包的构建。

docs 表示 conan create 相当于:

$ conan export . demo/testing
$ conan install hello/0.1@demo/testing --build=hello
# package is created Now,use test to test it
$ conan test test_package hello/0.1@demo/testing

有些地方我不明白:

  1. 客户端为什么要下载配方?配方不是仅用于创建包吗?
  2. 为什么客户的个人资料包含 compiler 位?例如,我可以理解 osarch,因为 X86-Windows 客户端机器无法处理 Linux 包或 ARM 包,但是为什么编译器是指定的配置的一部分客户?
  3. 配方包含一行 settings = "os","compiler","build_type","arch" 文档说:

设置字段定义了不同二进制包的配置。在此示例中,我们定义了对操作系统、编译器、架构或构建类型的任何更改都将生成不同的二进制包。请注意,Conan 会为同一配方的不同引入配置(在本例中为设置)生成不同的二进制包。

在包创建过程中究竟要构建哪些配置?

  1. conan install 既用于包创建又用于包消费?

解决方法

这里有一些答案:

  1. 客户端为什么要下载配方?配方不是仅用于创建包吗?

是的,客户端会下载配方,因为如果所需的包 ID 没有二进制文件,则该配方将用于构建源代码。并非所有配置都在 conan-center 中可用。

此外,conan install 命令中的 build options 会影响其行为。下载配方比只下载包更方便。

这种行为不会改变,因为它是柯南 1.0 的一部分,会破坏许多使用柯南缓存中的食谱的用户。

  1. 为什么客户端的配置文件包含编译器位?例如,我可以理解 os 和 arch,因为 X86-Windows 客户端机器无法处理 Linux 包或 ARM 包,但为什么编译器是客户端指定的配置的一部分?

不同的编译器提供不同的二进制文件。在 Windows 上,您可以使用来自 mingw 或 MSVC 的 gcc。在 Linux 上,您可以使用 clang 或 gcc,它们在大多数情况下是兼容的,但会生成不同的二进制文件,包括优化级别。此外,还有与每个编译器相关的其他重要标志,例如 libcxx(libstdc++、libc++、libstdc++11)或 MSVC 运行时(MT、MD)。部分编译器版本仅支持 C++11(GCC 4.9),因此在构建项目时必须确保编译器兼容性。基本上,它会影响 ABI compatibility

在包创建过程中具体在哪里指定要构建哪些配置?

包生成已记录,请阅读:

  1. conan install 既用于包创建又用于包消费?

如果您想开发一个新的简单配方,请在您的机器上构建并使用它,因此 conan create 是一种方法。创建新配方时,您将在 90% 的情况下使用 conan create。您可以阅读 Development flow with Conan Create 部分了解更多信息。

另一方面,conan install 主要用于包消费,但它也可以用于包创建。什么时候?

  • Development flow
  • 当您想要安装软件包,但又想从源代码构建它时。

背后的原因是因为 conan install 先出现,它用于两个提议,但我们需要更直接的东西来创建包,所以引入了 conan create。但是,由于我们无法删除功能,由于向后兼容规则,conan install 仍然可以用作包创建者。