本文档翻译自:https://docs.conan.io/en/latest/creating_packages/getting_started.html#creating-the-package-recipe
首先,让我们为包配方创建一个文件夹,并使用将为我们创建工作包配方的 conan new 助手命令:
$ mkdir mypkg && cd mypkg$ conan new hello/0.1 -t
这将生成以下文件:
conanfile.pytest_packageCMakeLists.txtconanfile.pyexample.cpp
在根目录,有一个conanfile.py,它是主要的配方文件,负责定义我们的包。此外,还有一个test_package文件夹,其中包含一个简单的测试项目,该项目需要并与创建的包链接。用于测试包能够正常运行。
让我们看一下包配方conanfile.py:
from conans import ConanFile, CMake, toolsclass HelloConan(ConanFile):name = "hello"version = "0.1"license = "<Put the package license here>"url = "<Package recipe repository url here, for issues about the package>"description = "<Description of hello here>"settings = "os", "compiler", "build_type", "arch"options = {"shared": [True, False]}default_options = {"shared": False}generators = "cmake"def source(self):self.run("git clone https://github.com/conan-io/hello.git")# This small hack might be useful to guarantee proper /MT /MD linkage# in MSVC if the packaged project doesn't have variables to set it# properlytools.replace_in_file("hello/CMakeLists.txt", "PROJECT(MyHello)",'''PROJECT(MyHello)include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)conan_basic_setup()''')def build(self):cmake = CMake(self)cmake.configure(source_folder="hello")cmake.build()# Explicit way:# self.run('cmake %s/hello %s'# % (self.source_folder, cmake.command_line))# self.run("cmake --build . %s" % cmake.build_config)def package(self):self.copy("*.h", dst="include", src="hello")self.copy("*hello.lib", dst="lib", keep_path=False)self.copy("*.dll", dst="bin", keep_path=False)self.copy("*.so", dst="lib", keep_path=False)self.copy("*.dylib", dst="lib", keep_path=False)self.copy("*.a", dst="lib", keep_path=False)def package_info(self):self.cpp_info.libs = ["hello"]
这是一个完整的包装配方。无需详细说明,以下是基础知识:
settings** 字段定义不同二进制包的配置。在此示例中,我们定义了对 os、compiler、build_type 或 arch **的任何更改都将生成不同的二进制包。
请注意,如果包正在 交叉编译 那么运行配方和正在构建的包所在的平台与运行代码的最终平台 (self.settings.os 和 self.settings.arch) 是不同的。因此,如果您想在当前系统编译别的系统的库,您需要检查它:
def build(self):if platform.system() == "Windows":cmake = CMake(self)cmake.configure(source_folder="hello")cmake.build()else:env_build = AutoToolsBuildEnvironment(self)env_build.configure()env_build.make()
了解更多 交叉编译 部分信息,了解AutoToolsBuildEnvironment 类。
- 此包配方还能够使用
shared选项为静态和动态链接库创建不同的二进制包,该选项默认设置为False(即默认情况下,它将使用静态链接)。 source()方法执行git clone以从Github检索源。还提供其他来源,如下载压缩文件。如您所见,可以执行对代码的任何操作,例如签出任何分支或标签,或修补源代码。在此示例中,我们将在现有CMake代码中添加两行,以确保二进制兼容性。现在别担心,我们稍后再处理。build()配置项目,然后使用标准CMake命令进行构建。CMake对象仅有助于将Conan设置转换为CMake命令行参数。请注意,并非一定要是CMake。您还可以通过调用make、MSBuild、SCons或任何其他构建系统直接构建包。 :::info See alse
检查 现有的 Build help :::package()方法将 (头文件,libs) 从构建文件夹复制到最终的包文件夹。- 最后,
package_info()方法定义使用者在使用此包时必须与 “hello” 库链接。也可以定义包含或lib路径的其他信息。此信息用于由 generators 创建的文件,供人使用,如 conanbuildinfo.cmake。 :::info Note
在编写自己的conanfile.py引用时,请记住应该遵循conanfile.py中的规则。 :::
