使用cmake安装nuget
目前在vs上c++项目对第三方库的引用通过nuge来引用。但是一些跨平台项目使用cmake构建,cmake生成脚本中没有提供nuget的支持。
使用nuget本质就是导入了一个从服务器上下载的targets文件,cmake3.8支持了向项目中添加targets文件。所以可以借助这一特性间接的使得cmake脚本支持nuget。
本文章所述内容必须要使用cmake3.8及以上才有效
思路
使用nuget本质就是在项目配置里导入了一个从服务器上下载的包中的targets文件,那么只要使用CMAKE脚本完成这些步骤就行。
首先nuget.exe命令行程序是可以下载指定的包的,那么只要在cmake脚本中调用nuget下载包后把包中的targets文件导入项目就行。
cmake脚本中执行其他程序需要使用
execute_process
命令
cmake中导入targets文件需要使用
target_link_libraries
命令
实现
为方便现将安装nuget的功能整理封装成一个cmake宏,可单独存放在一个cmake文件中在其他脚本中用
include
命令包含方便调用。
cmake_minimum_required(VERSION )
macro(INSTALL_NUGET target id version)
if (CMAKE_GENERATOR MATCHES "Visual Studio.*")
unset(nuget_cmd)
list(APPEND nuget_cmd install ${id} -Prerelease -Version ${version} -OutputDirectory ${CMAKE_BINARY_DIR}/packages)
message("excute nuget install:${nuget_cmd}")
execute_process(COMMAND nuget ${nuget_cmd} ENCODING AUTO)
target_link_libraries(${target} ${CMAKE_BINARY_DIR}/packages/${id}.${version}/build/native/${id}.targets)
else()
message(FATAL_ERROR "INSTALL_NUGET noly use in Visual Studio")
endif()
endmacro()
宏的名字是INSTALL_NUGET ,接收三个参数,第一个是需要安装nuget的目标,第二个是包的id,第三个是包的版本。
逻辑:
- 声明cmake最低版本
- 判断是否是vs平台,否则给提示结束
- 根据参数拼接出nuget的命令行参数。
- 下载nuget包到cmake运行目录下的packages目录。
- 将下载的包中的targets文件导入项目
使用示例:
ADD_LIBRARY(Framework STATIC ${SRC_FILES})
INSTALL_NUGET(Framework boost.native.static.v140.md -beta)
注意
使用此方法管理nuget后,所有对nuget的管理都只能在cmake脚本中改动。不能使用vs中的nuget插件来管理nuget。