CMake构建系统(build system)是从C/C++源代码生成用户可以使用的目标(targets)的常用自动化工具,是作为C/C++ developer必须了解的工具之一。本文以实际的工程为例梳理常用的CMake指令,并尝试建立一个简单的基于CMake构建系统的C/C++工程框架,以为实际的C/C++工程开发提供基础模板。
基础的C/C++工程主要包含动态库,静态库,可执行文件,测试,文档这几部分内容。因此,基础的工程目录结构按如下方式组织
─ project-workspace
├── CMakeLists.txt
├── COPYRIGHT
├── build
├── docs
│ └── README.md
├── libs
│ ├── CMakeLists.txt
│ ├── add.cpp
│ └── add.h
├── src
│ ├── CMakeLists.txt
│ └── main.cpp
└── test
├── CMakeLists.txt
└── UTTest.cpp
CMake自动化工具虽然最终仍然生成Makefile文件,但通过CMake语言定义源代码的构建方式以简化Makefile编写工作。
CMake自动化工具的核心是CMakeLists.txt文件,该文件定义了动态库,静态库,可执行文件等所有目标的生成规则。
按照如上的目录结果我们可以看出每个目录包含一个CMakeLists.txt文件(逻辑上也存在父子关系)。
根目录(project-workspace)下的CMakeLists.txt可以看做是整个工程的入口定义了工程基本内容,如下所示:
project-workspace/CMakeLists.txt
# set the minimum version for cmake
CMAKE_MINIMUM_REQUIRED(VERSION 3.11)
# set the project name
PROJECT(workspace)
# directive to print detail build log
SET(
CMAKE_VERBOSE_MAKEFILE
ON)
# set the install prefix for make install
SET(
CMAKE_INSTALL_PREFIX
${PROJECT_BINARY_DIR}/out
CACHE
PATH
"" FORCE)
# set the output directory for bin during building(make)
SET(