创建conan包-入门指南_conan2.0 创建-程序员宅基地

技术标签: 创建conan包-入门指南  创建conan包  conan  

本文是基于对conan官方文档Creating packages - Getting started翻译而来, 更详细的信息可以去查阅conan官方文档。

1 Getting started

This section introduces how to create your own Conan packages, explain conanfile.py recipes and the commands to build packages from sources in your computer.
本节将介绍如何创建自己的conan软件包,解释 conanfile.py recipes和从计算机源代码构建软件包的命令。

1.1 Important

This is a tutorial section. You are encouraged to execute these commands. For this concrete example, you will need CMake installed in your path. It is not strictly required by Conan to create packages, you can use other build systems (as VS, Meson, Autotools and even your own) to do that, without any dependency to CMake.
这是tutorial部分。我们鼓励你执行这些命令。在此具体示例中,您需要在路径中安装 CMake。conan并不严格要求使用 CMake 创建软件包,您可以使用其他构建系统(如 VS、Meson、Autotools 甚至您自己的系统)来创建软件包,而无需依赖 CMake。

Some of the features used in this section are still under development, like CMakeToolchain or cmake_layout(), while they are recommended and usable and we will try not to break them in future releases, some breaking changes might still happen if necessary to prepare for the Conan 2.0 release.
本节中使用的一些功能仍在开发中,如 CMakeToolchaincmake_layout(),虽然它们是推荐和可用的,而且我们会尽量避免在未来的版本中破坏它们,但如果有必要,为了准备柯南 2.0 的发布,一些破坏性的更改仍可能发生。

1.2 conan new

Using the conan new command will create a “Hello World” C++ library example project for us:
使用 conan new 命令将为我们创建一个 "Hello World "C++ 库示例项目:

$ mkdir hellopkg && cd hellopkg
$ conan new hello/0.1 --template=cmake_lib
File saved: conanfile.py
File saved: CMakeLists.txt
File saved: src/hello.cpp
File saved: src/hello.h
File saved: test_package/conanfile.py
File saved: test_package/CMakeLists.txt
File saved: test_package/src/example.cpp

The generated files are:

  • conanfile.py: On the root folder, there is a conanfile.py which is the main recipe file, responsible for defining how the package is built and consumed.
  • conanfile.py: 在根文件夹中有一个 conanfile.py,它是主要的recipe文件,负责定义软件包的构建和使用方式。
  • CMakeLists.txt: A simple generic CMakeLists.txt, with nothing specific about Conan in it.
  • CMakeLists.txt: 一个简单的通用 CMakeLists.txt,其中没有任何关于柯南的特定内容。
  • src folder: the src folder that contains the simple C++ “hello” library.
  • src 文件夹:包含简单 C++"hello "库的 src 文件夹。
  • (optional) test_package folder: contains an example application that will require and link with the created package. It is not mandatory, but it is useful to check that our package is correctly created.
  • (可选)test_package 文件夹:包含一个示例应用程序,该应用程序将需要并链接已创建的软件包。这不是必须的,但对于检查我们是否正确创建了软件包很有用。

1.3 分析conanfile.py

Let’s have a look at the package recipe conanfile.py:
让我们来看看软件包recipe conanfile.py:

from conan import ConanFile
from conan.tools.cmake import CMakeToolchain, CMake, cmake_layout


class HelloConan(ConanFile):
    name = "hello"
    version = "0.2"

    # Optional metadata
    license = "<Put the package license here>"
    author = "<Put your name here> <And your email here>"
    url = "<Package recipe repository url here, for issues about the package>"
    description = "<Description of Hello here>"
    topics = ("<Put some tag here>", "<here>", "<and here>")

    # Binary configuration
    settings = "os", "compiler", "build_type", "arch"
    options = {
    "shared": [True, False], "fPIC": [True, False]}
    default_options = {
    "shared": False, "fPIC": True}

    # Sources are located in the same place as this recipe, copy them to the recipe
    exports_sources = "CMakeLists.txt", "src/*", "include/*"

    def config_options(self):
        if self.settings.os == "Windows":
            del self.options.fPIC

    def layout(self):
        cmake_layout(self)

    def generate(self):
        tc = CMakeToolchain(self)
        tc.generate()

    def build(self):
        cmake = CMake(self)
        cmake.configure()
        cmake.build()

    def package(self):
        cmake = CMake(self)
        cmake.install()

    def package_info(self):
        self.cpp_info.libs = ["hello"]

Let’s explain a little bit about this recipe:
让我们来解释一下这个recipe:

  • The binary configuration is composed by settings and options. See more in this section. When something changes in the configuration, the resulting binary built and packaged will be different:
  • 二进制配置由设置和选项组成。请参阅本节的更多内容。当配置发生变化时,生成和打包的二进制文件也会不同:
    • settings are project wide configuration, that cannot be defaulted in recipes, like the OS or the architecture.
    • 设置是项目范围内的配置,不能在recipes中默认,如操作系统或架构。
    • options are package specific configuration and can be defaulted in recipes, in this case we have the option of creating the package as a shared or static library, being static the default.
    • 在本例中,我们可以选择将软件包创建为共享库或静态库,默认为静态库。
  • The exports_sources attribute defines which sources are exported together with the recipe, these sources become part of the package recipe (there are other mechanisms that don’t do this, which will be explained later).
  • exports_sources 属性定义了哪些源会与配方一起导出,这些源会成为软件包配方的一部分(还有其他机制不这样做,稍后解释)。
  • The config_options() method (together with configure()) allows to fine tune the binary configuration model. For example, in Windows there is no fPIC option, so it can be removed.
  • config_options()方法(与configure()一起)可以对二进制配置模型进行微调。例如,在 Windows 中没有 fPIC 选项,因此可以将其删除。
  • The generate() method prepares the build of the package from source. In this case, it could be simplified to an attribute generators = “CMakeToolchain”, but it is left to show this important method. In this case, the execution of CMakeToolchain generate() method will create a conan_toolchain.cmake file that maps the Conan settings and options to CMake syntax.
  • generate() 方法准备从源代码构建软件包。在本例中,它可以简化为属性 generators = "CMakeToolchain",但为了显示这个重要的方法,我们还是把它留了下来。在这种情况下,执行 CMakeToolchain generate() 方法将创建一个 conan_toolchain.cmake 文件,将 Conan 设置和选项映射为 CMake 语法。
  • The build() method uses the CMake wrapper to call CMake commands. It is a thin layer that will manage to pass in this case the -DCMAKE_TOOLCHAIN_FILE= /conan_toolchain.cmake argument, plus other possible arguments, like -DCMAKE_BUILD_TYPE= if necessary. It will configure the project and build it from source. The actual arguments that will be used are obtained from a generated CMakePresets.json file.
  • build() 方法使用 CMake 封装器调用 CMake 命令。它是一个薄层,在本例中将传递 -DCMAKE_TOOLCHAIN_FILE=<path>/conan_toolchain.cmake 参数,以及其他可能的参数,如 -DCMAKE_BUILD_TYPE=<config> (如有必要)。它将配置项目并从源代码开始构建。实际使用的参数将从生成的 CMakePresets.json 文件中获取。
  • The package() method copies artifacts (headers, libs) from the build folder to the final package folder. It can be done with bare “copy” commands, but in this case it is leveraging the already existing CMake install functionality (if the CMakeLists.txt didn’t implement it, it is easy to write self.copy() commands in this package() method.
  • package() 方法会将构建文件夹中的工件(头文件、库文件)复制到最终的 package 文件夹中。这可以通过简单的 "复制 "命令来完成,但在本例中,它是在利用 CMake 已经存在的安装功能(如果 CMakeLists.txt 没有实现该功能,在此 package() 方法中编写 self.copy() 命令也很容易)。
  • Finally, the package_info() method defines that consumers must link with a “hello” library when using this package. Other information as include or lib paths can be defined as well. This information is used for files created by generators (as CMakeDeps) to be used by consumers. Although this method implies some potential duplication with the build system output (CMake could generate xxx-config.cmake files), it is important to define this, as Conan packages can be consumed by any other build system, not only CMake.
  • 最后,package_info() 方法定义了用户在使用该软件包时必须与 "hello "库链接。还可以定义其他信息,如 include 或 lib 路径。这些信息用于生成器(如 CMakeDeps)创建的文件,以便用户使用。虽然这种方法可能会与联编系统的输出重复(CMake 可能会生成 xxx-config.cmake 文件),但定义这一点非常重要,因为conan软件包可以被任何其他联编系统使用,而不仅仅是 CMake

1.4 test_package

The contents of the test_package folder is not critical now for understanding how packages are created, the important bits are:
现在,test_package 文件夹的内容对于了解软件包的创建过程并不重要,重要的是这些内容:

  • test_package folder is different from unit or integration tests. These tests are “package” tests, and validate that the package is properly created, and that the package consumers will be able to link against it and reuse it.
  • test_package 文件夹与单元测试或集成测试不同。这些测试是 "package"测试,用于验证软件包是否已正确创建,以及软件包用户是否能链接并重用软件包。
  • It is a small Conan project itself, it contains its own conanfile.py, and its source code including build scripts, that depends on the package being created, and builds and execute a small application that requires the library in the package.
  • 它本身是一个小型 Conan 项目,包含自己的 conanfile.py、源代码(包括构建脚本),依赖于正在创建的软件包,并构建和执行一个需要软件包中库的小型应用程序。
  • It doesn’t belong to the package. It only exist in the source repository, not in the package.
  • 它不属于软件包。它只存在于源代码库中,而不在软件包中。

Let’s build the package from sources with the current default configuration (default profile), and then let the test_package folder test the package:
让我们使用当前的默认配置(默认配置文件)从源代码构建软件包,然后让 test_package 文件夹测试软件包:

1.5 conan create

$ conan create . demo/testing
...
hello/0.1: Hello World Release!
  hello/0.1: _M_X64 defined
  ...

If “Hello world Release!” is displayed, it worked. This is what has happened:
如果显示 “Hello world Release!”,就说明成功了。情况就是这样:

  • The conanfile.py together with the contents of the src folder have been copied (exported in Conan terms) to the local Conan cache.
  • conanfile.pysrc 文件夹中的内容已被复制(用 Conan 术语来说就是导出)到本地 Conan 缓存中。
  • A new build from source for the hello/0.1@demo/testing package starts, calling the generate(), build() and package() methods. This creates the binary package in the Conan cache.
  • 开始从源代码构建 hello/0.1@demo/testing 软件包,调用 generate()build()package() 方法。这将在 Conan 缓存中创建二进制包。
  • Moves to the test_package folder and executes a conan install + conan build + test() method, to check if the package was correctly created. This happens automatically whenever a test_package folder is supplied next to the conanfile.py being processed.
  • 移动到 test_package 文件夹,执行 conan install + conan build + test() 方法,检查是否正确创建了软件包。只要在正在处理的 conanfile.py 旁边提供 test_package 文件夹,就会自动执行此操作。

1.6 验证conan包

We can now validate that the recipe and the package binary are in the cache:
现在我们可以验证缓存中是否有recipe和软件包二进制文件:

$ conan search
Existing package recipes:

hello/0.1@demo/testing

$ conan search hello/0.1@demo/testing
Existing packages for recipe hello/0.1@demo/testing:

Package_ID: 3fb49604f9c2f729b85ba3115852006824e72cab
    [options]
        shared: False
    [settings]
        arch: x86_64
        build_type: Release
        ...

The conan create command receives the same command line parameters as conan install so you can pass to it the same settings and options. If we execute the following lines, we will create new package binaries for those configurations:
conan create 命令接收与 conan install 相同的命令行参数,因此可以向其传递相同的设置和选项。如果我们执行以下命令行,就会为这些配置创建新的软件包二进制文件:

$ conan create . demo/testing -s build_type=Debug
...
hello/0.1: Hello World Debug!

$ conan create . demo/testing -o hello:shared=True
...
hello/0.1: Hello World Release!

These new package binaries will be also stored in the Conan cache, ready to be used by any project in this computer, we can see them with:
这些新的软件包二进制文件也将存储在conan缓存中,随时可供这台计算机中的任何项目使用,我们可以通过以下方式查看它们:

$ conan search hello/0.1@demo/testing
Existing packages for recipe hello/0.1@demo/testing:

    Package_ID: 127af201a4cdf8111e2e08540525c245c9b3b99e
        [options]
            shared: True
        [settings]
            arch: x86_64
            build_type: Release
            ...
    Package_ID: 3fb49604f9c2f729b85ba3115852006824e72cab
        [options]
            shared: False
        [settings]
            arch: x86_64
            build_type: Release
            ...

    Package_ID: d057732059ea44a47760900cb5e4855d2bea8714
        [options]
            shared: False
        [settings]
            arch: x86_64
            build_type: Debug
            ...
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u014100559/article/details/134701427

智能推荐

在浏览器地址栏输入URL并按下回车后,发生了什么?DNS?UDP?TCP?_浏览器向dns服务器发出域名解析请求并获得结果②在浏览器中输入url并按下回车键-程序员宅基地

文章浏览阅读655次。例如:在浏览器地址栏输入www.taobao.com,按下回车,发生了什么?1. 浏览器会进行DNS域名解析,拿到域名对应的服务器ip地址,再用该ip去访问web服务器DNS域名解析的过程:1.将待解析的域名放入DNS请求报文,以UDP报文段方式发给本地域名服务器2.若本地域名服务器有查找到域名映射的信息,则把对应的IP地址放在响应报文中返回3.若本地域名服务器没有查找到映射的信息,则会..._浏览器向dns服务器发出域名解析请求并获得结果②在浏览器中输入url并按下回车键

Shell_[root@hadoop1 ~]里面为啥不是shell-程序员宅基地

文章浏览阅读106次。大数据程序员为什么要学习Shell呢?(脚本开发)1)需要看懂运维人员编写的Shell程序。2)偶尔会编写一些简单Shell程序来管理集群、提高开发效率。第2章 Shell解析器(1)Linux提供的Shell解析器有:[shell@hadoop101 ~]$ cat /etc/shells/bin/sh/bin/bash(常用解析器)/sbin/nologin/bin/dash..._[root@hadoop1 ~]里面为啥不是shell

dcs world f15c教学_新概念英语 | 第二册(Lesson 93)教学视频/课文音频/精讲笔记...-程序员宅基地

文章浏览阅读227次。点击 上 方蓝 字关注 我 们教学视频?Lesson 93A noble gift崇高的礼物First listen and then answer the question.听录音,然后回答以下问题。Where was the Statue of Liberty made?One of the most famous monuments in the world, the St..._the great monument has been a symbol of liberty for the municipal court

浏览器工作原理及页面加载的优化建议_b端加载页-程序员宅基地

文章浏览阅读1.4k次。B/S架构,B端的大部分载体是浏览器,浏览器的主要功能是把用户请求的web资源呈现出来,它请求服务器资源,并将其显示在浏览器窗口,资源的格式通常有HTML,PDF,及其他格式。浏览器的主要构成High Level Structure浏览器的主要组件包括:1. 用户界面- 包括地址栏、后退/前进按钮、书签目录等,也就是你所看到的除了用来显示你所请求页面的主窗口之外的其他部分2_b端加载页

他破解了iPhone和PS3 引发了黑客战争-程序员宅基地

文章浏览阅读188次。2007年夏季,世界上的第一台iPhone闪亮登场。但在它问世没多久后,就被天才小子——乔治·霍兹(George Hotz)破解了。苹果公司在发布iPhone的时候,是以AT&T合约机的形式发布的,也就是说iPhone的用户只能使用AT&T公司的网络服务,而霍兹是T-mobile的用户,他想对手上的iPhone进行改装,让其也能够在T-mobile的网络下使用。没有什么能够难倒我们...

金三银四,想拿高薪?你该如何制作一份令人满意的简历?-程序员宅基地

文章浏览阅读83次。经历过秋招的同学一定知道竞争有多激烈,春招的竞争激烈程度并不亚于秋招。因为国考、考研失利的部分同学会成为竞争者中的一员,已经拿到offer的同学也会因为想得到更好的机会而参加。除了竞争人数多以外,作为补招,职位也没有秋招丰富,难免出现僧多粥少的局面。说了这么多,如何才能在春招里突出重围呢?今天乐字节fafa给大家支招,从工作的敲门砖——简历入手,教大家如何制作出一份令人满意的简历。1.简历定位简历定位就是要按照与以上岗位要求相关的内容来开始给自己画一个像,做个定位,履历内容紧贴定位。面试人力资源,就

随便推点

图像处理和计算机视觉中的经典论文(部分)_论文阅读 图像处理csdn-程序员宅基地

文章浏览阅读1.3k次。本文转载自:xdyang的图像视觉小屋http://blog.csdn.net/dcraw/article/details/7367990,非常感谢!!自己视野狭小,不敢说全部,只是把自己熟悉的方向中的部分经典文章列出来了。经典的论文,读得怎么透都不过分。有人说关于配准的文章太多了,其实我也不太关注这方面,不过由于它们引用率都比较高,就都列出来了,不过在zip包里一篇都没有。不_论文阅读 图像处理csdn

LeNet、AlexNet、GoogLeNet、VGG、ResNetInception-ResNet-v2、FractalNet、DenseNet_伯克利大学evan shelhamer等人利用已有深度学习模型(alexnet、vgg、google-程序员宅基地

文章浏览阅读1.8w次,点赞3次,收藏37次。2006年Hinton他们的Science Paper再次引起人工神经网络的热潮,当时提到,2006年虽然Deep Learning的概念被提出来了,但是学术界的大家还是表示不服。当时有流传的段子是Hinton的学生在台上讲paper时,台下的机器学习大牛们不屑一顾,质问你们的东西有理论推导吗?有数学基础吗?搞得过SVM之类吗?回头来看,就算是真的,大牛们也确实不算无理取闹,是骡子是马拉出来遛遛,_伯克利大学evan shelhamer等人利用已有深度学习模型(alexnet、vgg、googlenet),通

javascript函数柯里化及应用-程序员宅基地

文章浏览阅读95次。柯里化是把接受多个参数的函数变换成接受一个单一参数的函数,并且返回一个新函数,这个新函数能够接受原函数的参数。下面可以通过例子来帮助理解。function adder(num) { return function(x) { return num + x; }}var add5 = adder(5);var add6 = adder(6);print(add5(1...

前端部署实战(阿里云服务器+nginx)_阿里云 nginx-程序员宅基地

文章浏览阅读1.8k次,点赞2次,收藏14次。获得自己的服务器后,打开云服务器ECS控制台,在实例中找到自己服务器,点击远程连接,选择通过WorkBench远程连接。开始之间需要安装xshell用于连接服务器,安装xftp用于上传文件,安装完毕后打开xshell,新建一个会话,主机填服务器的公网地址,可在阿里云实例页面查看,填好后点击确定。qiankundemo的主应用和子应用均部署在同一个服务器上,主应用中子应用的配置如下,entry设置为环境变量,开发和部署时分别指向不同的入口,打开服务器公网地址,出现以下页面,说明nginx启动成功。_阿里云 nginx

Python DataFrame时间序列数据(Pandas篇-22)-程序员宅基地

文章浏览阅读1.1k次,点赞33次,收藏18次。Python Pandas 时间序列数据。

篇章结构类型、层次及分析模式研究-程序员宅基地

文章浏览阅读1w次,点赞4次,收藏6次。这篇是何继红、张德禄一篇发表在《外语与外语教学》上的一篇论文,本文是其个人读后感和一些想法。1. 摘要这篇文章中,主要针对的是语篇结构和类型、层级性和分析模式的研究,着重对于语篇的结构类型进行了相关的探讨。我也主要是注重其语篇的结构方面进行相关的思考。2. 语篇、话语与篇章语篇(text)和话语(discourse)、篇章(discourse)之间有着一定的联系。在系统功能语言学中,语篇和话语没有什_篇章结构

推荐文章

热门文章

相关标签