1 概述
- 本文基于前文环境
本节目标:复用cmake脚本文件
2 编写复用脚本
2.1 前言
- 多个项目之间,很多cmake设置大相径庭。比如修改输出路径、编写适用与自己的宏或者函数
- 没错,cmake也可以编写函数和宏。
- 个人使用习惯,笔者的每个项目都会指定关的文件(exe或者dll文件)的输出路径, cmake设置的脚本如下
# 64位
if (CMAKE_CL_64)
# 设置 可执行程序输出目录
set(publish_bin_debug ${CMAKE_CURRENT_SOURCE_DIR}/publish/x64/bin/debug64)
set(publish_bin_release ${CMAKE_CURRENT_SOURCE_DIR}/publish/x64/bin/release64)
# 设置库文件输出目录
set(publish_lib_debug ${CMAKE_CURRENT_SOURCE_DIR}/publish/x64/lib/debug64)
set(publish_lib_release ${CMAKE_CURRENT_SOURCE_DIR}/publish/x64/lib/release64)
# set(PROJECT_NAME ${PROJECT_NAME}64)
# 32
else()
# 设置 可执行程序输出目录
set(publish_bin_debug ${CMAKE_CURRENT_SOURCE_DIR}/publish/x86/bin/debug)
set(publish_bin_release ${CMAKE_CURRENT_SOURCE_DIR}/publish/x86/bin/release)
# 设置库文件输出目录
set(publish_lib_debug ${CMAKE_CURRENT_SOURCE_DIR}/publish/x86/lib/debug)
set(publish_lib_release ${CMAKE_CURRENT_SOURCE_DIR}/publish/x86/lib/release)
endif()
# 指定可执行程序输出目录
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${publish_bin_debug})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${publish_bin_release})
# 指定 库文件输出目录
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${publish_lib_debug})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RLEASE ${publish_lib_release})
有待完善--增加编译器名称到路径中。
2.2 编写复用脚本
- 手头项目一多,若每次都ctrl+c, ctrl+v, 挺麻烦的,而且也不利于后期维护。
- 于是自己将其拖动到一个名为 CommonOutput.cmake 的文件中。
- CommonOutput.cmake 文件内容如下
# 64位
if (CMAKE_CL_64)
# 设置 可执行程序输出目录
set(publish_bin_debug ${CMAKE_CURRENT_SOURCE_DIR}/publish/x64/bin/debug64)
set(publish_bin_release ${CMAKE_CURRENT_SOURCE_DIR}/publish/x64/bin/release64)
# 设置库文件输出目录
set(publish_lib_debug ${CMAKE_CURRENT_SOURCE_DIR}/publish/x64/lib/debug64)
set(publish_lib_release ${CMAKE_CURRENT_SOURCE_DIR}/publish/x64/lib/release64)
# set(PROJECT_NAME ${PROJECT_NAME}64)
# 32
else()
# 设置 可执行程序输出目录
set(publish_bin_debug ${CMAKE_CURRENT_SOURCE_DIR}/publish/x86/bin/debug)
set(publish_bin_release ${CMAKE_CURRENT_SOURCE_DIR}/publish/x86/bin/release)
# 设置库文件输出目录
set(publish_lib_debug ${CMAKE_CURRENT_SOURCE_DIR}/publish/x86/lib/debug)
set(publish_lib_release ${CMAKE_CURRENT_SOURCE_DIR}/publish/x86/lib/release)
endif()
# 指定可执行程序输出目录
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${publish_bin_debug})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${publish_bin_release})
# 指定 库文件输出目录
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${publish_lib_debug})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RLEASE ${publish_lib_release})
没错,就是吧上面的脚本放入了该文件。
2.3 文件夹结构
- CommonOutput.cmake 文件位于Common文件夹下
- 此时,文件夹结构
.
│ CMakeLists.txt
│
├─Common
│ CommonOutput.cmake
│
└─src
main.cc
下一章节介绍如何使用
3 复用脚本
- 关键代码:include
3.1 引入脚本
- 回到CMakeLists.txt脚本文件,此时文件内容如下
# 指定CMake脚本解析的最低版本,
cmake_minimum_required(VERSION 3.18)
# 指定项目
project(HelloCMake)
# 指定代码文件
set( src_files
${CMAKE_CURRENT_SOURCE_DIR}/src/main.cc
)
# 用于生成动态库
add_library(${PROJECT_NAME} SHARED ${src_files})
- CMakeLists.txt中 增加引入脚本代码, include的参数为: 脚本文件的全路径
include(${CMAKE_CURRENT_SOURCE_DIR}/Common/CommonOutput.cmake)
- 增加引用脚本后,此时 CMakeLists.txt 脚本文件完整内容为
# 指定CMake脚本解析的最低版本,
cmake_minimum_required(VERSION 3.18)
# 指定项目
project(HelloCMake)
# 引入脚本:参数为脚本文件的全路径
include(${CMAKE_CURRENT_SOURCE_DIR}/Common/CommonOutput.cmake)
# 指定代码文件
set( src_files
${CMAKE_CURRENT_SOURCE_DIR}/src/main.cc
)
# 用于生成动态库
add_library(${PROJECT_NAME} SHARED ${src_files})
这样,多个项目可以使用同一个脚本文件中的内容,而不用来回拷贝了
3.2 访问复用脚本中的变量
- CMakeLists.txt 引用了脚本,当然,可以访问脚本中定义的变量
- 下面演示,CMakeLists.txt中输出变量publish_lib_debug 和 publish_lib_release的值
message("publish_lib_debug=${publish_lib_debug}")
message("publish_lib_release=${publish_lib_release}")
- 结果
[cmake] publish_lib_debug=C:/A/publish/x64/lib/debug64
[cmake] publish_lib_release=C:/A/publish/x64/lib/release64
此时,CMakeLists.txt的完整代码为
# 指定CMake脚本解析的最低版本,
cmake_minimum_required(VERSION 3.18)
# 指定项目
project(HelloCMake)
# 引入脚本:参数为脚本文件的全路径
include(${CMAKE_CURRENT_SOURCE_DIR}/Common/CommonOutput.cmake)
# 指定代码文件
set( src_files
${CMAKE_CURRENT_SOURCE_DIR}/src/main.cc
)
# 用于生成动态库
add_library(${PROJECT_NAME} SHARED ${src_files})
# 访问脚本中的变量
message("publish_lib_debug=${publish_lib_debug}")
message("publish_lib_release=${publish_lib_release}")
5 编译自己的脚本
- cmake用的多了,会有一套自己的设置,可以考虑将其封装到cmake脚本文件中,放在一个固定的位置,
- 这样,既方便维护脚本内容,也利于多项目使用, 还有利于后期维护项目。
完