如何建立自己的PackageConfig.cmake

How to create a PackageConfig.cmke?

查找已有库arrow-up-right中简单介绍了find_package指令的原理,其中提到其搜包的的两种方式,对于Config模式其需要一个<package_name>Config.cmake<lower-case-package-name>-config.cmake配置文件,这篇文章为官方例子arrow-up-right的翻译和修改,它将教你如何为自己的包创建一个<package_name>Config.cmake,但阅读这篇文章之前,你需要对find_package指令有一个详细的了解。

例子已经上传到我的GitHub仓库:How to create a PackageConfig.cmakearrow-up-right,欢迎交流。

概述

假设项目packageConfig包含一个简单的动态库iniparser和一个调用这个库的测试用例test

.
├── iniparser
│   ├── CMakeLists.txt                      # 构建iniparser库
│   ├── inc
│   │   ├── dictionary.h
│   │   ├── ini_conf.h
│   │   └── iniparser.h
│   ├── iniparserConfig.cmake
│   ├── iniparserConfigVersion.cmake
│   ├── LICENSE
│   ├── README.md
│   └── src
│       ├── dictionary.c
│       ├── ini_conf.c
│       └── iniparser.c
├── LICENSE
├── README.md
└── test                                    # 测试用例
    ├── CMakeLists.txt                      # find_package(iniparser REQUIRED)
    ├── main.c
    └── test.ini

事实上开发者并不需要关注iniparser这个库和测试用例的细节,在实际使用中可以替换成自己开发的库。

iniparser/CMakeLists.txt

  • 构建的核心在于install(TARGETS ${PROJECT_NAME} EXPORT iniparserpackage …)install EXPORT iniparserpackage FILE iniparserTargets.cmake DESTINATION lib/cmake/)

  • 在不考虑库和头文件等的安装的情况下,只从构建树的角度来看,这两条命令等价于export(TARGETS iniparser FILE iniparserTargets.cmake)

  • 通常来说会考虑生成两个<package_name>Config.cmake,一个用于构建树,一个用于安装,上例中只有安装并且生成在${PROJECT_SOURCE_DIR}目录下,生成的位置并不重要,自行设置即可。

export命令

export命令的功能是从构建树中导出目标供外部项目使用。

export(EXPORT <export-name> [NAMESPACE <namespace>] [FILE <filename>])

从当前的构建树中生成一个可以被外部项目导入目标的文件。

  • NAMESPACE:用于指定作用域。

  • 要安装导出目标需要使用install(EXPORT <export-name>)命令。

  • 生成的文件是针对当前构建树而言的,所以不能被安装,假如要安装导出目标的信息,需要从安装树中生成导出目标再安装,如上文例子所示。

export(TARGETS [target1 [target2 [...]]] [NAMESPACE <namespace>] [APPEND] FILE <filename> [EXPORT_LINK_INTERFACE_LIBRARIES])

此命令类似于EXPORT选项,但目标是显式列出的,而不是指定为export-name

circle-info

export的导出行为都是针对构建树而言的。

iniparserConfig.cmake

iniparserConfigVersion.cmake

Last updated