双笙子佯谬老师的【公开课】现代CMake高级教程课程笔记
为什么要学习现代 CMake?
- 现代 CMake 指的是 CMake 3.x。
- 古代 CMake 指的是 CMake 2.x。
- 通过互联网和学校课程,许多人认识的 CMake 都是古代 CMake。
- 现代 CMake 和古代 CMake 相比,使用更方便,功能更强大。
# 古代 CMake
mkdir -p build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j4
make install
cd ..
# 现代 CMake
cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build --parallel 4
cmake --build build --target install
# 古代 CMake:
cmake_minimum_required(VERSION 2.8)
project(MyProject)
list(APPEND CMAKE_MODULE_PATH "<path to FindTBB module>")
find_package(TBB COMPONENTS tbb tbbmalloc)
if (NOT TBB_FOUND)
message(FATAL_ERROR "TBB not found")
endif()
add_executable(myapp myapp)
target_include_directories(myapp ${TBB_INCLUDE_DIRS})
target_compile_definitions(myapp ${TBB_DEFINITIONS})
target_link_libraries(myapp ${TBB_LIBRARIES})
现代 CMake
cmake_minimum_required(VERSION 3.12)
project(MyProject LANGUAGES CXX)
find_package(TBB COMPONENTS tbb tbbmalloc REQUIRED)
add_executable(myapp myapp)
target_link_libraries(myapp TBB::tbb TBB::tbbmalloc)
第 0 章:命令行小技巧
传统的 CMake 软件构建/安装方式
| 命令 | 说明 |
|---|---|
| mkdir build | 需要先创建 build 目录 |
| cd build | 切换到 build 目录 |
| cmake … | 在 build 目录运行 cmake <源码目录> 生成 Makefile |
| make -j4 | 执行本地的构建系统 make 真正开始构建(4 进程并行) |
| sudo make install | 让本地的构建系统执行安装步骤 |
| cd … | 回到源码目录 |
现代 CMake 提供了更方便的 -B 和 --build 指令,不同平台,统一命令!
| 命令 | 说明 |
|---|---|
| cmake -B build | 在源码目录用 -B 直接创建 build 目录并生成 build/Makefile |
| cmake --build build -j4 | 自动调用本地的构建系统在 build 里构建,即:make -C build -j4 |
| sudo cmake --build build --target install | 调用本地的构建系统执行 install 这个目标,即安装 |
| cmake -B build | 免去了先创建 build 目录再切换进去再指定源码目录的麻烦。 |
| cmake --build build | 统一了不同平台(Linux 上会调用 make,Windows 上调用 devenv.exe) |
结论:从现在开始,如果在命令行操作 cmake,请使用更方便的 -B 和 --build 命令。
可见 CMake 项目的构建分为两步:
- 第一步是 cmake -B build,称为配置阶段(configure),这时只检测环境并生成构建规则,会在 build 目录下生成本地构建系统能识别的项目文件(Makefile 或是 .sln)
- 第二步是 cmake --build build,称为构建阶段(build),这时才实际调用编译器来编译代码。
-D 选项
-D:指定配置变量(又称缓存变量)
在配置阶段可以通过 -D 设置缓存变量。第二次配置时,之前的 -D 添加仍然会被保留。
例:
cmake -B build -DCMAKE_INSTALL_PREFIX=/opt/openvdb-8.0
设置安装路径为 /opt/openvdb-8.0(会安装到 /opt/openvdb-8.0/lib/libopenvdb.so)
cmake -B build -DCMAKE_BUILD_TYPE=Release
设置构建模式为发布模式(开启全部优化)
cmake -B build
第二次配置时没有 -D 参数,但是之前的 -D 设置的变量都会被保留(此时缓存里仍有你之前定义的 CMAKE_BUILD_TYPE 和 CMAKE_INSTALL_PREFIX)
-G 选项
-G 选项:指定要用的生成器
众所周知,CMake 是一个跨平台的构建系统,可以从 CMakeLists.txt 生成不同类型的构建系统(比如 Linux 的 make,Windows 的 MSBuild),从而让构建规则可以只写一份,跨平台使用。
过去的软件(例如 TBB)要跨平台,只好 Makefile 的构建规则写一份,MSBuild 也写一份。
现在只需要写一次 CMakeLists.txt,他会视不同的操作系统,生成不同构建系统的规则文件。
那个和操作系统绑定的构建系统(make、MSBuild)称为本地构建系统(native buildsystem)。
负责从 CMakeLists.txt 生成本地构建系统构建规则文件的,称为生成器(generator)。
$cmake.exe -G
CMake Error: No generator specified for -G
Generators
Visual Studio 16 2019 = Generates Visual Studio 2019 project files.
Use -A option to specify architecture.
Visual Studio 15 2017 [arch] = Generates Visual Studio 2017 project files.
Optional [arch] can be "Win64" or "ARM".
Visual Studio 14 2015 [arch] = Generates Visual Studio 2015 project files.
Optional [arch] can be "Win64" or "ARM".
Visual Studio 12 2013 [arch] = Generates Visual Studio 2013 project files.
Optional [arch] can be "Win64" or "ARM".
Visual Studio 11 2012 [arch] = Generates Visual Studio 2012 project files.
Optional [arch] can be "Win64" or "ARM".
Visual Studio 10 2010 [arch] = Generates Visual Studio 2010 project files.
Optional [arch] can be "Win64" or "IA64".
Visual Studio 9 2008 [arch] = Generates Visual Studio 2008 project files.
Optional [arch] can be "Win64" or "IA64".
Borland Makefiles = Generates Borland makefiles.
* NMake Makefiles = Generates NMake makefiles.
NMake Makefiles JOM = Generates JOM makefiles.
MSYS Makefiles = Generates MSYS makefiles.
MinGW Makefiles = Generates a make file for use with
mingw32-make.
Unix Makefiles = Generates standard UNIX makefiles.
Green Hills MULTI = Generates Green Hills MULTI files
(experimental, work-in-progress).
Ninja = Generates build.ninja files.
Ninja Multi-Config = Generates build-<Config>.ninja files.
Watcom WMake = Generates Watcom WMake makefiles.
CodeBlocks - MinGW Makefiles = Generates CodeBlocks project files.
CodeBlocks - NMake Makefiles = Generates CodeBlocks project files.
CodeBlocks - NMake Makefiles JOM
= Generates CodeBlocks project files.
CodeBlocks - Ninja = Generates CodeBlocks project files.
CodeBlocks - Unix Makefiles = Generates CodeBlocks project files.
CodeLite - MinGW Makefiles = Generates CodeLite project files.
CodeLite - NMake Makefiles = Generates CodeLite project files.
CodeLite - Ninja = Generates CodeLite project files.
CodeLite - Unix Makefiles = Generates CodeLite project files.
Sublime Text 2 - MinGW Makefiles
= Generates Sublime Text 2 project files.
Sublime Text 2 - NMake Makefiles
= Generates Sublime Text 2 project files.
Sublime Text 2 - Ninja = Generates Sublime Text 2 project files.
Sublime Text 2 - Unix Makefiles
= Generates Sublime Text 2 project files.
Kate - MinGW Makefiles = Generates Kate project files.
Kate - NMake Makefiles = Generates Kate project files.
Kate - Ninja = Generates Kate project files.
Kate - Unix Makefiles = Generates Kate project files.
Eclipse CDT4 - NMake Makefiles
= Generates Eclipse CDT 4.0 project files.
Eclipse CDT4 - MinGW Makefiles
= Generates Eclipse CDT 4.0 project files.
Eclipse CDT4 - Ninja = Generates Eclipse CDT 4.0 project files.
Eclipse CDT4 - Unix Makefiles= Generates Eclipse CDT 4.0 project files.
Linux 系统上的 CMake 默认用是 Unix Makefiles 生成器;Windows 系统默认是 Visual Studio 2019 生成器;MacOS 系统默认是 Xcode 生成器。
可以用 -G 参数改用别的生成器,例如 cmake -GNinja 会生成 Ninja 这个构建系统的构建规则。Ninja 是一个高性能,跨平台的构建系统,Linux、Windows、MacOS 上都可以用。
Ninja 可以从包管理器里安装,没有包管理器的 Windows 可以用 Python 的包管理器安装:
pip install ninja
(有趣的事实:CMake 也可以通过 pip install cmake 安装……)
事实上,MSBuild 是单核心的构建系统,Makefile 虽然多核心但因历史兼容原因效率一般。而 Ninja 则是专为性能优化的构建系统,他和 CMake 结合都是行业标准了。
$cmake -GNinja -B build
生成物:
$ls build
build.ninja CMakeCache.txt CMakeFiles cmake_install.cmake
本文介绍了现代CMake与古代CMake的区别,强调了CMake3.x版本的便利性和强大功能。现代CMake简化了构建和安装流程,使用-B和--build命令提高了效率。同时,提到了-D选项用于设置配置变量,以及-G选项选择生成器,如Ninja,以实现高性能跨平台构建。CMake的配置阶段和构建阶段以及如何通过CMakeLists.txt生成本地构建系统的规则文件也进行了阐述。

580

被折叠的 条评论
为什么被折叠?



