conan: 封装只包含头文件(header_only)的库示例

有的C/C++项目只包含头文件,不需要编译,对于这种情况如何封装为Conan的包呢?

Conan官方文档 《Package scaffolding for conan new command》给出了样例

我就有这样一个项目 common_source_cpp收集了工作中常用的代码,以C/C++头文件形式为主,本文就以common_source_cpp为例说明如何实现conanfile.py将它封装为一个不需要编译只有头文件的Conan包。

conanfile.py

conanfile.py 码云地址: https://gitee.com/l0km/common_source_cpp/blob/master/conanfile.py

from conans import ConanFile, toolsclass CommonSourceCppConan(ConanFile):name = "common_source_cpp"version = "0.0.0-DEV"settings = "os", "compiler", "build_type", "arch"description = "C/C++/C++11公用代码"url = "https://gitee.com/l0km/common_source_cpp"license = "BSD-2-Clause"author = "guyadong 10km0811@sohu.com"topics = ("C", "C++", "C++11", "common")settings = "os", "arch", "compiler", "build_type"exports_sources = "*.h", "*.cpp", "*.hpp", "*.hh", "*.c", "LICENSE"def package(self):self.copy("*.h", dst="include")self.copy("*.cpp", dst="include")self.copy("*.hpp", dst="include")self.copy("*.hh", dst="include")self.copy("*.c", dst="include")self.copy("LICENSE", dst="include")def package_id(self):# 重要:指定项目只有头文件self.info.header_only()def package_info(self):if self.settings.compiler == "Visual Studio":self.cpp_info.includedirs.append("include/dirent")

conanfile_master.py

如果需要项目的最新版本则实现如下

conanfile_master.py 码云地址: https://gitee.com/l0km/common_source_cpp/blob/master/conanfile_master.py

from conans import ConanFile, toolsclass CommonSourceCppConanConan(ConanFile):name = "common_source_cpp"version = "master"settings = "os", "compiler", "build_type", "arch"description = "C/C++/C++11公用代码"url = "https://gitee.com/l0km/common_source_cpp"license = "BSD-2-Clause"author = "guyadong 10km0811@sohu.com"topics = ("C", "C++", "C++11", "common")settings = "os", "arch", "compiler", "build_type"def export(self):self.copy("conanfile.py",src="conanfile_master.py")def source(self):# 从远端仓库下载指定分支代码self.run("git clone -b " + self.version + " " + self.url + ".git")# git = tools.Git(folder=self.name)# git.clone(self.url + ".git")# git.checkout(self.version)def package(self):# 确保当前仓库与远程仓库同步self.run("cd common_source_cpp && git checkout " + self.version + " && git pull")self.copy("*.h", dst="include", src="common_source_cpp")self.copy("*.cpp", dst="include", src="common_source_cpp")self.copy("*.hpp", dst="include", src="common_source_cpp")self.copy("*.hh", dst="include", src="common_source_cpp")self.copy("*.c", dst="include", src="common_source_cpp")self.copy("LICENSE", dst="include", src="common_source_cpp")def package_id(self):self.info.header_only()def package_info(self):if self.settings.compiler == "Visual Studio":self.cpp_info.includedirs.append("include/dirent")

conan create

有了上面的conanfile.py,就可以执行conan create 命令将cpp_redis生成到本地的conan仓库了

$ conan create .
Exporting package recipe
common_source_cpp/0.0.0-DEV exports_sources: Copied 43 '.h' files
common_source_cpp/0.0.0-DEV exports_sources: Copied 8 '.cpp' files
common_source_cpp/0.0.0-DEV exports_sources: Copied 11 '.hpp' files
common_source_cpp/0.0.0-DEV exports_sources: Copied 1 '.hh' file: uri.hh
common_source_cpp/0.0.0-DEV exports_sources: Copied 2 '.c' files: debug_printf.c, if_utilits_c.c
common_source_cpp/0.0.0-DEV exports_sources: Copied 1 file: LICENSE
common_source_cpp/0.0.0-DEV: The stored package has not changed
common_source_cpp/0.0.0-DEV: Exported revision: 50a7e6024f11c1e9b6bbab7e45c4253e
Configuration:
[settings]
arch=x86_64
arch_build=x86_64
build_type=Release
compiler=Visual Studio
compiler.runtime=MD
compiler.version=14
os=Windows
os_build=Windows
[options]
[build_requires]
[env]common_source_cpp/0.0.0-DEV: Forced build from source
Installing package: common_source_cpp/0.0.0-DEV
Requirementscommon_source_cpp/0.0.0-DEV from local cache - Cache
Packagescommon_source_cpp/0.0.0-DEV:5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9 - BuildInstalling (downloading, building) binaries...
common_source_cpp/0.0.0-DEV: Copying sources to build folder
。。。
common_source_cpp/0.0.0-DEV: Calling package()
common_source_cpp/0.0.0-DEV package(): Packaged 43 '.h' files
common_source_cpp/0.0.0-DEV package(): Packaged 11 '.hpp' files
common_source_cpp/0.0.0-DEV package(): Packaged 2 '.c' files: debug_printf.c, if_utilits_c.c
common_source_cpp/0.0.0-DEV package(): Packaged 8 '.cpp' files
common_source_cpp/0.0.0-DEV package(): Packaged 1 file: LICENSE
common_source_cpp/0.0.0-DEV package(): Packaged 1 '.hh' file: uri.hh
common_source_cpp/0.0.0-DEV: Package '5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9' created
common_source_cpp/0.0.0-DEV: Created package revision 6b32a82748a8366bb24b66daef5296df
common_source_cpp/0.0.0-DEV: WARN: This conanfile has no build step

conan create .根据配置文件 (同级文件夹下的conanfile.py) 构建二进制包
conan create 命令行用法参见Conan官方文档《conan create》

执行 conann create指定conanfile_master.py则会从远端仓库下载最新的maste分支代码

$ conan create conanfile_master.py
Exporting package recipe
common_source_cpp/master: Calling export()
common_source_cpp/master: The stored package has not changed
common_source_cpp/master: Exported revision: 4115d7716d69dce3edff00b6da3560ab
Configuration:
[settings]
arch=x86_64
arch_build=x86_64
build_type=Release
compiler=Visual Studio
compiler.runtime=MD
compiler.version=14
os=Windows
os_build=Windows
[options]
[build_requires]
[env]common_source_cpp/master: Forced build from source
Installing package: common_source_cpp/master
Requirementscommon_source_cpp/master from local cache - Cache
Packagescommon_source_cpp/master:5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9 - BuildInstalling (downloading, building) binaries...
common_source_cpp/master: Copying sources to build folder
common_source_cpp/master: Building your package in
。。。
common_source_cpp/master: Calling package()
Already on 'master'
Your branch is up to date with 'origin/master'.
Already up to date.
common_source_cpp/master package(): Packaged 43 '.h' files
common_source_cpp/master package(): Packaged 11 '.hpp' files
common_source_cpp/master package(): Packaged 2 '.c' files: debug_printf.c, if_utilits_c.c
common_source_cpp/master package(): Packaged 8 '.cpp' files
common_source_cpp/master package(): Packaged 1 file: LICENSE
common_source_cpp/master package(): Packaged 1 '.hh' file: uri.hh
common_source_cpp/master: Package '5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9' created
common_source_cpp/master: Created package revision 778c04901c633169b88ac94242cc152f
common_source_cpp/master: WARN: This conanfile has no build step

执行conan search会显示本地仓库二进制包的信息

$ conan search common_source_cpp/0.0.0-DEV@
Existing packages for recipe common_source_cpp/0.0.0-DEV:Package_ID: 5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9Outdated from recipe: False
$ conan search common_source_cpp/master@
Existing packages for recipe common_source_cpp/master:Package_ID: 5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9Outdated from recipe: False

conan upload

执行conan upload上传到私有制品库了:

conan upload common_source_cpp/0.0.0-DEV  -r ${repo} -all
# ${repo}为私有制品库的名字

–all 指定上传所有内容(配置文件conanfile.py,源码和打包的文件–package),如果不指定些选项,只上传除package之外的所有文件

执行conan upload上传到私有制品库了:

conan upload common_source_cpp/master  -r ${repo}
# ${repo}为私有制品库的名字

注意:因为我们需要common_source_cpp/master保持与远程端同步的最新代码,所以这里没有使用–all 指定上传所有内容(配置文件conanfile.py,源码和package),只上传了conanfile.py,引用该项目时执行conan install common_source_cpp/master@ --build common_source_cpp会自动从远程仓库克隆代码在本地仓库生成package

关于 conan upload命令的详细说明参见Conan官方文档:《conan upload》

参考资料

《Recipe and Sources in a Different Repo》

《conan create》

《package()》

《source()》

《self.info.header_only()》

conan系列文章

《conan入门(一):conan 及 JFrog Artifactory 安装》
《conan入门(二):conan 服务配置-密码管理及策略》
《conan入门(三):上传预编译的库(artifact)》
《conan入门(四):conan 引用第三方库示例》
《conan入门(五):conan 交叉编译引用第三方库示例》
《conan入门(六):conanfile.txt conanfile.py的区别》
《conan入门(七):将自己的项目生成conan包》
《conan入门(八):交叉编译自己的conan包项目》
《conan入门(九):NDK交叉编译自己的conan包项目塈profile的定义》
《conan入门(十):Windows下Android NDK交叉编译Boost》
《conan入门(十一):Linux下Android NDK交叉编译Boost》
《conan入门(十二):Windows NDK 编译 boost报错:CMake was unable to find a build program … MinGW Makefile》
《conan入门(十三):conan info 命令的基本用法》
《conan入门(十四):conan new 命令的新特性–模板功能(–template)》
《conan入门(十五):AttributeError: ‘CMake‘ object has no attribute ‘definitions‘》
《conan入门(十六):profile template功能实现不同平台下profile的统一》
《conan入门(十七):支持android NDK (armv7,armv8,x86,x86_64)交叉编译的统一profile jinja2模板》
《conan入门(十八):Cannot recognize the Windows subsystem, install MSYS2/cygwin or specify a build_require》
《conan入门(十九):封装第三方开源库cpp_redis示例》
《conan入门(二十):封装只包含头文件(header_only)的库示例》
《conan入门(二十一):解决MinGW编译Openssl的编译错误:crypto/dso/dso_win32.c》
《conan入门(二十二):编译 openssl要求python 3.7以上版本》
《conan入门(二十三):Windows下MinGW编译libcurl》
《conan入门(二十四):通过CONAN_DISABLE_CHECK_COMPILER禁用编译器检查》
《conan入门(二十五):imports将包安装到本地项目或其他指定位置》

conan入门(二十):封装只包含头文件(header_only)的库示例相关推荐

  1. conan入门(二):conan 服务配置-密码管理及策略

    conan 服务配置 密码管理及策略配置 第一次以管理员身份(admin)使用默认密码(password)WEB登录入JFrog Artifactory后台时,系统就提示要求我修改密码,因为现有密码太 ...

  2. C++包含头文件几种方式

    该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/105042381 包 ...

  3. ZT 头文件包含其实是一想很烦琐的工作 第一个原则应该是,如果可以不包含头文件...

    当出现访问类的函数或者需要确定类大小的时候,才需要用头文件(使用其类定义)    http://blog.csdn.net/clever101/article/details/4751717 看到这个 ...

  4. 【转】C++中#include包含头文件带 .h 和不带 .h 的区别

    C++中#include包含头文件带 .h 和不带 .h 的区别? 如 #include <iostream> 和 #include <iostream.h> 包含的东西有哪些 ...

  5. c语言使用位运算符包含头文件,C语言的运算符

    c语言中可以使用加减乘除(+,-,*,/)以及取余(%)这些操作符 注意点: a.0不能做除数,不能对0进行取余,0.0可以做除数,结果是无穷大. b.取余操作的两边必须是整数: c.两个整数相除,结 ...

  6. 四、Makefile包含 头文件和库文件

    一.Makefile规则 二.Makefile案例-多个文件生成一个目标文件 三.Makefile–生成多个目标文件 四.Makefile包含 头文件和库文件 此篇文章以三.Makefile–生成多个 ...

  7. c语言中关于不包含头文件string.h仍然可以使用strlen函数以及strlen函数计算数组时结果问题

    先说头文件string.h里的strlen函数 strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串 ...

  8. c语言 自动包含头文件,C语言不要重复包含.h头文件和.c文件

    http://blog.csdn.net/unix21/article/details/8450235 2012 1.不要重复包含头文件 --以上出自<C语言程序设计:现代方法(第2版)> ...

  9. error: invalid use of incomplete type 'XXXX' ;error: forward declaration of 'XXXX' 声明改为包含头文件

    error: invalid use of incomplete type 'XXXX' error: forward declaration of XXXX 声明改为包含头文件 class XXXX ...

最新文章

  1. 专访|黄铁军:人工智能不会以人为中心,但不要为此失落
  2. Vue中的Js动画与Velocity.js 的结合
  3. Hbase问题汇总与解答
  4. 如何踩中下一个技术节拍
  5. 微软云计算介绍与实践(实践之三十五)
  6. 分布式数据库进入实时时代,TiDB 5.0 带来了什么?
  7. ASP.Net Mvc 发布网站 (样式+图片问题)
  8. 透过 ASP.NET 和数据库读写图片
  9. 捷联惯导系统学习2.3(方向余弦阵微分方程)
  10. 抽样分布的形式与原有总体的分布和样本容量n的大小有关
  11. Java IO流读取中文文本文件乱码问题,完美解决
  12. mpeg怎么转换成mp4?
  13. UFS和eMMC简介与区别
  14. 虚拟服务器14001,免费秒赞主机空间
  15. 云函数能写php吗,FunctionCloud
  16. 使用NCL绘制安徽省的轮廓图
  17. 苹果手机如何用短信信息服务器,Iphone双卡双待如何发信息? 苹果双卡手机发短信的方法...
  18. Fedora 17下NVIDIA双显卡闭源驱动的安装
  19. alt与title的区别(img属性)
  20. VLC-你不知道的那些功能-播客

热门文章

  1. 华为u8860刷机方法比较+变砖补救+rom定制与签名
  2. Android录音amr实时转成MP3格式
  3. Eclipse 3.5.2配置J2ME环境和 WTK2.5.2下载(转)
  4. 嵌入式软件开发之程序编程规范(五)
  5. src、href区别
  6. (转) 从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn)
  7. Python GDAL学习笔记(一)
  8. Node.js中exports、module.exports、require之间的关系
  9. RecyclerView添加蒙板引导信息
  10. 清除浮动(高度塌陷)的方法及原理!