本文档翻译自: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.py
test_package
CMakeLists.txt
conanfile.py
example.cpp
在根目录,有一个conanfile.py,它是主要的配方文件,负责定义我们的包。此外,还有一个test_package文件夹,其中包含一个简单的测试项目,该项目需要并与创建的包链接。用于测试包能够正常运行。
让我们看一下包配方conanfile.py:
from conans import ConanFile, CMake, tools
class 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
# properly
tools.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中的规则。 :::