conan imports将包安装到本地项目或其他指定位置
在嵌入式平台开发中,我想将conan用作包管理器。例如,我想运行conan install
将依赖库安装在在本地项目目录中,最好是直接安装到嵌入式平台供应商提供的SDK框架中,这样就可以直接利用SDK现成的编译架构完成最终程序编译生成镜像。所以我不希望从 ~/.conan
目录引用头文件和库。否则每次编译后都要手工复制库文件到SDK的文件夹中或要创建软连接,这都太麻烦了。
imports
可以实现这个要求。imports
将文件从 ~/.conan
目录复制到指定位置。因此,通过简单的两行代码,就可以将所有依赖项(头文件、库)复制到当前项目也可以复制到你指定的其他位置。只需将其添加到项目的conanfile.txt或 conanfile.py ,示例如下:
conanfile.txt
代码语言:javascript复制[requires]
cjson/1.7.13
[imports]
include, * -> ./deps/include
lib, * -> ./deps/lib
include
,lib
为复制文件的源文件夹,必须是个相对路径,即为所有依赖库在本地仓库的相对文件夹
*
为指定要复制文件的通配符,如*.h
,*.a
./deps/include
,./deps/lib
为文件复制的目标文件夹,可以是个绝对路径,如果不是绝对路径,那么视为相对于当前项目文件夹的相对路径
上面的例子,将项目的所有依赖库(cjson)的include
,lib
下所有文件分别复制到项目文件夹的deps/include
,deps/lib
下
下面是个更灵活的例子,将所有依赖库(.a,.h
)文件复制到环境变量DK_PREFIX
定义的SDK 安装位置
conanfile.py
代码语言:javascript复制import os,re ## 用于读取环境变量和正则表达式判断变量的布尔值
from conans import ConanFile, CMake
class YourProjectConan(ConanFile):
####################################
# 定义imports方法实现依赖库导入到指定位置
def imports(self):
# 环境变量IMPORT_TO_SDK如果设置为True
# 复制依赖库所有.a,.h文件到环境变量SDK_PREFIX定义的SDK 位置的子文件夹Third-party下
if re.match(r'^(?:true|on|1|y(es))?$',os.getenv("IMPORT_TO_SDK","False"),re.I):
self.copy("*.[ah]", dst=os.path.join(os.getenv("SDK_PREFIX"),"Third-party",self.name "-deps"), src="")
参考资料
《Installing packages to local project #137》
《imports()》
《[imports]》
《conan_check_compiler()》
《CONAN_DISABLE_CHECK_COMPILER》