Conan 的基本使用

工作流水记录,有误之处敬请原谅

客户端安装

MacOS

服务器端安装

Linux (Centos 7)

包创建流程

package_create_flow

创建 Conan 包

conanfile.py 文件

Conan 项目的编译需要conanfile.py文件,该文件中包含了项目的配置信息、编译信息、打包信息等

一个 Conan 项目的 conanfile.py文件示例:

from conans import ConanFile, AutoToolsBuildEnvironment, tools

class libx264Conan(ConanFile):
    name = "libx264"
    version = "3.0.1"
    url = "http://url"
    description = "Conan libx264"
    license = "L"
    settings = "os", "build_type", "arch"
    options = {"shared": [True, False]}
    default_options = "shared=False"
    generators = "gcc"
    exports_sources = "x264/*"

    def build(self):
        env_build = AutoToolsBuildEnvironment(self)
        with tools.environment_append(env_build.vars), tools.chdir("./x264"):
            self.run("./configure %s %s %s %s %s %s %s %s %s" % (
                "--prefix=" + str(self.env["prefix"]),
                "--exec-prefix=" + str(self.env["exec_prefix"]),
                "--libdir=" + str(self.env["lib_dir"]),
                "--disable-asm", 
                "--enable-pic", 
                "--disable-cli",
                "--host=" + str(self.env["host"]),
                "--enable-shared" if ('True' == self.options.shared) else "--enable-static",
                "--cross-prefix=" + str(self.env["cross_prefix"])))
            self.run("make")
            self.run("make install")

    def package(self):
        self.copy("*.h", dst="include", src="x264/build/" + str(self.settings.arch) + "/include")
        if ('True' == self.options.shared):
            self.copy("*.so", dst="lib", src="x264/build/" + str(self.settings.arch) + "/lib", keep_path=False)
        else:
            self.copy("*.a", dst="lib", src="x264/build/" + str(self.settings.arch) + "/lib", keep_path=False)

    def package_info(self):
        self.cpp_info.includedirs = ['include']
        self.cpp_info.libs = []
        self.cpp_info.libdirs = ['lib']

可以看到有一些变量,这些变量的值是从 conan profile文件中读取的。对conan profile文件中的每一块数据的读取方式是不尽相同的,比如对[env]中数据的读取是一个Map,建议直接查看 Conan 的源代码,便捷明了。

conan createconan install命令可以加入--profile参数,该参数的值为不同的配置文件名,这种方式便于同时编译针对不同架构、不同平台的库文件,比如:

conan install --profile arm_profiile
conan install --profile arm64_profile
conan install --profile x86_profile

Conan profile 文件

在需要创建 Conan 包的项目中创建conan_build_profie文件,在该文件中可以写入关于项目编译配置信息,可针对不同架构、不同平台等差异创建多个 profile 文件,一个 Conan Profile 文件示例:

[settings]
os=Android
arch=arm64
compiler=gcc
build_type=Release

[env]
CFLAGS=--sysroot=/Users/user/android-ndk/platforms/android-21/arch-arm64
LDFLAGS= --sysroot=/Users/user/android-ndk/platforms/android-21/arch-arm64
prefix=build/arm64
exec_prefix=build/arm64/bin
lib_dir=build/arm64/lib
host=aarch64-linux
cross_prefix=/Users/user/android-ndk/toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64/bin/aarch64-linux-android-

[options]
shared=False

[build_requires]

建议将所有固定的编译参数放入[env]段中。[options]中的项一般是可以通过conanfile.txt中实时设置的,比如shared这个值可以在下面章节中描述的conanfile.txt文件中设置:

[requires]
libx264/[email protected]/release
[options]
libx264:shared=False
[generators]
gcc

对这个值的具体处理逻辑在conanfile.py中,并且可以设置默认值,从上面conanfile.py中可以看到 "--enable-shared" if ('True' == self.options.shared) else "--enable-static"这行语句。

[setting]段中可设置的值是受~/.conan/settings.yml文件的配置限制的,具体语法建议查阅文档,一个示例:

os: [Linux, Android, iOS]
arch: [x86, x86_64, arm, arm64, armv7, armv7s, armv8]
compiler: [gcc, xcode]
build_type: [None, Debug, Release

#使用 Conan 包

在项目工程中创建conanfile.txt文件,所有关于项目依赖库的信息都需要写入该文件,如下是一个简单的例子

常用命令

关于更多 Conan 命令的使用,请关注本站 WiKi 页面中的 Conan 部分,请持续更新