Conan 的基本使用
06 Nov 2017工作流水记录,有误之处敬请原谅
客户端安装
MacOS
- 使用 Homebrew
brew update brew install conan
- 使用 pip
pip install conan
-
使用预编译包
https://www.conan.io/downloads
- 源码安装
git clone https://github.com/conan-io/conan.git cd conan pip install -r conans/requirements.txt
下载源码后,创建如下启动脚本:
#!/usr/bin/env python import sys conan_repo_path = "/home/your_user/conan" # ABSOLUTE PATH TO CONAN REPOSITORY FOLDER sys.path.append(conan_repo_path) from conans.client.command import main main(sys.argv[1:])
最后把启动脚本加入到你的
path
中
服务器端安装
Linux (Centos 7)
-
下载源码
git clone https://github.com/conan-io/conan.git cd conan git checkout master pip install -r conans/requirements.txt pip install -r conans/requirements_server.txt pip install gunicorn
-
启动服务
gunicorn -b 0.0.0.0:8081 -w 4 -t 300 conans.server.server_launcher:app
-
服务端配置 配置文件位于
$HOME/.conan_server/server.conf
,首次安装如果没有这个文件,可以执行一次上面的命令,即会自动生成这个配置文件。
包创建流程
创建 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 create
或conan 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 部分,请持续更新
-
查看远程服务器列表
conan remote list
-
添加远程服务器
conan remote add local http://ip:port
-
上传到服务器
conan upload Hello/[email protected]/testing --all -r=local
内置的测试账号和密码为
demo/demo
-
查询库信息
conan search Hello/[email protected]/testing -r=local
一个可能的输出:
Existing packages for recipe Hello/[email protected]/testing: Package_ID: 7fe67dff831b24bc4a8b5db678a51f1be5e44e7c [options] shared: False [settings] arch: x86_64 build_type: Release compiler: apple-clang compiler.libcxx: libc++ compiler.version: 9.0 os: Macos outdated from recipe: False
conan 甚至能够管理同一个库的不同架构、不同编译参数的版本:
Existing packages for recipe Hello/[email protected]/testing: Package_ID: 3cfade032d90e40671f831047a4b021865f8396f [options] shared: True [settings] arch: x86_64 build_type: Release compiler: apple-clang compiler.libcxx: libc++ compiler.version: 9.0 os: Macos outdated from recipe: False Package_ID: 7fe67dff831b24bc4a8b5db678a51f1be5e44e7c [options] shared: False [settings] arch: x86_64 build_type: Release compiler: apple-clang compiler.libcxx: libc++ compiler.version: 9.0 os: Macos outdated from recipe: False Package_ID: f331ba4cb4cf3b345ec2ebc265629b6ee1340312 [options] shared: False [settings] arch: x86_64 build_type: Debug compiler: apple-clang compiler.libcxx: libc++ compiler.version: 9.0 os: Macos outdated from recipe: False
-
删除本地库缓存
conan remove Hello/[email protected]/testing
删除之后可以使用
conan search
来做确认,一个可能的输出:Existing package recipes: OpenSSL/[email protected]/stable Poco/[email protected]/stable zlib/[email protected]/stable
-
查看远程仓库可用包列表
conan -r [repo_name]
-r
参数为需要查询的仓库地址,可以通过conan remote list
得到上述命令一个可能的输出:
Existing package recipes: Hello/[email protected]/testing
-
参看远程库的配置文件
conan get Hello/[email protected]/testing -r local
本命令输出的为
conanfile.py
中的内容 -
查看当前各远程仓库的登陆用户名
conan user
可能的输出:
Current 'conan-center' user: None (anonymous) Current 'conan-transit' user: None (anonymous) Current 'local' user: demo
- 切换用户名
conan user othername -r [reponame]
上面的命令将对应
reponame
远程仓库的用户名修改为othername
一个可能的输出:Change 'local' user from demo to wangsijie
- 查看当前项目的依赖
conan info
输出提示当前项目依赖了
Hello/[email protected]/testing
PROJECT ID: 9f3be35e404b0966b8f9fa1f7525247a9dc8204d BuildID: None Requires: Hello/[email protected]/testing Hello/[email protected]/testing ID: 7fe67dff831b24bc4a8b5db678a51f1be5e44e7c BuildID: None Remote: xlncz=http://127.0.0.1:8081 URL: <Package recipe repository url here, for issues about the package> License: <Put the package license here> Updates: Version not checked Creation date: 2017-11-08 15:25:50 Required by: PROJECT