本文档翻译自:https://docs.conan.io/en/latest/creating_packages/getting_started.html#creating-the-package-recipe

    首先,让我们为包配方创建一个文件夹,并使用将为我们创建工作包配方的 conan new 助手命令:

    1. $ mkdir mypkg && cd mypkg
    2. $ conan new hello/0.1 -t

    这将生成以下文件:

    1. conanfile.py
    2. test_package
    3. CMakeLists.txt
    4. conanfile.py
    5. example.cpp

    在根目录,有一个conanfile.py,它是主要的配方文件,负责定义我们的包。此外,还有一个test_package文件夹,其中包含一个简单的测试项目,该项目需要并与创建的包链接。用于测试包能够正常运行。

    让我们看一下包配方conanfile.py:

    1. from conans import ConanFile, CMake, tools
    2. class HelloConan(ConanFile):
    3. name = "hello"
    4. version = "0.1"
    5. license = "<Put the package license here>"
    6. url = "<Package recipe repository url here, for issues about the package>"
    7. description = "<Description of hello here>"
    8. settings = "os", "compiler", "build_type", "arch"
    9. options = {"shared": [True, False]}
    10. default_options = {"shared": False}
    11. generators = "cmake"
    12. def source(self):
    13. self.run("git clone https://github.com/conan-io/hello.git")
    14. # This small hack might be useful to guarantee proper /MT /MD linkage
    15. # in MSVC if the packaged project doesn't have variables to set it
    16. # properly
    17. tools.replace_in_file("hello/CMakeLists.txt", "PROJECT(MyHello)",
    18. '''PROJECT(MyHello)
    19. include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
    20. conan_basic_setup()''')
    21. def build(self):
    22. cmake = CMake(self)
    23. cmake.configure(source_folder="hello")
    24. cmake.build()
    25. # Explicit way:
    26. # self.run('cmake %s/hello %s'
    27. # % (self.source_folder, cmake.command_line))
    28. # self.run("cmake --build . %s" % cmake.build_config)
    29. def package(self):
    30. self.copy("*.h", dst="include", src="hello")
    31. self.copy("*hello.lib", dst="lib", keep_path=False)
    32. self.copy("*.dll", dst="bin", keep_path=False)
    33. self.copy("*.so", dst="lib", keep_path=False)
    34. self.copy("*.dylib", dst="lib", keep_path=False)
    35. self.copy("*.a", dst="lib", keep_path=False)
    36. def package_info(self):
    37. self.cpp_info.libs = ["hello"]

    这是一个完整的包装配方。无需详细说明,以下是基础知识:

    • settings** 字段定义不同二进制包的配置。在此示例中,我们定义了对 oscompilerbuild_type arch **的任何更改都将生成不同的二进制包。

    请注意,如果包正在 交叉编译 那么运行配方和正在构建的包所在的平台与运行代码的最终平台 (self.settings.osself.settings.arch) 是不同的。因此,如果您想在当前系统编译别的系统的库,您需要检查它:

    1. def build(self):
    2. if platform.system() == "Windows":
    3. cmake = CMake(self)
    4. cmake.configure(source_folder="hello")
    5. cmake.build()
    6. else:
    7. env_build = AutoToolsBuildEnvironment(self)
    8. env_build.configure()
    9. env_build.make()

    了解更多 交叉编译 部分信息,了解AutoToolsBuildEnvironment 类。

    • 此包配方还能够使用 shared 选项为静态和动态链接库创建不同的二进制包,该选项默认设置为 False (即默认情况下,它将使用静态链接)。
    • source() 方法执行 git clone 以从Github检索源。还提供其他来源,如下载压缩文件。如您所见,可以执行对代码的任何操作,例如签出任何分支或标签,或修补源代码。在此示例中,我们将在现有CMake代码中添加两行,以确保二进制兼容性。现在别担心,我们稍后再处理。
    • build() 配置项目,然后使用标准CMake命令进行构建。CMake对象仅有助于将Conan设置转换为CMake命令行参数。请注意,并非一定要是CMake。您还可以通过调用makeMSBuildSCons或任何其他构建系统直接构建包。 :::info See alse
      检查 现有的 Build help :::

    • package() 方法将 (头文件,libs) 从构建文件夹复制到最终的包文件夹。

    • 最后,package_info() 方法定义使用者在使用此包时必须与 “hello” 库链接。也可以定义包含或lib路径的其他信息。此信息用于由 generators 创建的文件,供人使用,如 conanbuildinfo.cmake。 :::info Note
      在编写自己的conanfile.py引用时,请记住应该遵循conanfile.py中的规则。 :::