在之前的博客《conan入门(四):conan 引用第三方库示例》中我们以cJSON为例说明了如何在项目中引用一个conan 包。
在这篇博客中我们为了引用cjson/1.7.13库,创建了一个conanfile.txt文件用于指定json_test.c程序的依赖库cjson
[requires]
cjson/1.7.13
[generators]
cmake
关于conanfile.txt的详细说明参见Conan官方文档《conanfile.txt》和《Installing dependencies》
conanafile.txt还有一些别的字段:options,imports。。。
可以理解这个conanfile.txt的作用就是定义当前项目的conan配置。conan 的install,create,export,export-pkg,upload...
等命令都会用依据这个配置文件来执行。
在《conan入门(三):上传预编译的库(artifact)》中,我们用到了create new
创建一个新的包:
使用conan new
命令创建基本配置:
$ cd cjson.build/release/
$ conan new cjson/1.7.15 --bare
File saved: conanfile.py
conan new
会在当前文件夹下生成conanfile.py
,
from conans import ConanFile
from conan.tools.cmake import CMakeToolchain, CMake, cmake_layout
class HelloConan(ConanFile):
name = "hello"
version = "0.1"
# Optional metadata
license = ""
author = " "
url = ""
description = ""
topics = ("" , "" , "" )
# Binary configuration
settings = "os", "compiler", "build_type", "arch"
options = {"shared": [True, False], "fPIC": [True, False]}
default_options = {"shared": False, "fPIC": True}
# Sources are located in the same place as this recipe, copy them to the recipe
exports_sources = "CMakeLists.txt", "src/*"
def config_options(self):
if self.settings.os == "Windows":
del self.options.fPIC
def layout(self):
cmake_layout(self)
def generate(self):
tc = CMakeToolchain(self)
tc.generate()
def build(self):
cmake = CMake(self)
cmake.configure()
cmake.build()
def package(self):
cmake = CMake(self)
cmake.install()
def package_info(self):
self.cpp_info.libs = ["hello"]
这个conanfile.py
也是用于定义当前项目的conan配置,它以python 类的方式定义了一个conan包的所有配置,显然相对于conanfile.txt ,这个python脚本的内容要丰富许多,灵活许多(因为可以使用方法定义逻辑)。
都是用于conan配置,conanfile.txt和conanfile.py有何区别?为何要设计两种配置定义方式?如果一个项目中存在两个定义文件文件会怎么样?
这些问题把刚conan入门的我搞糊涂了。
谷歌上搜索了一下,发现有人与我有同样的问题问了conan官方:《Mix conanfile.py and conanfile.txt in the same project #307》
conanfile.txt是一种简单的conan配置定义方式,并不是每个程序员都懂python脚本(我就不懂),对于开发人员如果只是作为一个消费者角色(consumer),想使用conan简化第三方库的引用方式,在大多数情况下,一般只要正确设置requires,generators
,conan就可以正常工作,那么首选使用conanfile.txt这种配置文件定义方式,因为它是更加直观易懂的。
如果开发人员要作为生产者角色(producer),把自己的项目也封装成conan包上传到conan服务器供第三方使用,conanfile.txt是不能满足要求的,必须使用全能的confile.py脚本来定义包的配置,事实上conan在分发包时就是基于python脚本的灵活性通过conanfile.py来定义包的全部配置的。所以当我们执行conan new
命令创建一个新的conan配置时,自动生成的是conanfile.py脚本。
所以一个项目中是不允许conanfile.txt和conanfile.py共存的(都来是包定义,到底听谁的呢),执行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将包安装到本地项目或其他指定位置》