现代cmake--阅读笔记

简介: 现代cmake--阅读笔记

1. Running cmake


1.1. cmake选项


–build 指定输出目录


-j 指定并行度


–target 指定编译目标



1.2. 选择编译器


EXPORT CC=clang CXX=clang++ cmake ..


1.3. 选择生成器


默认为make 通过cmake -G Ninja指定ninja



1.4. 指定编译选项


cmake -DXXX=YYY

cmake会将各种编译选项缓存到一个文件中,即CMakeCache.txt



1.5. 调试


调试makefile: VERBOSE=1 make

调试cmake:


  • cmake –trace, 打印出cmake运行的每一行脚本


  • cmake –trace-source= 打印出中运行的每一行脚本


1.6. 指定编译类型


-DCMAKE_BUILD_TYPE:Debug或Release或RelWithDebInfo

-DCMAKE_INSTALL_PREFIX: 指定安装路径,默认为/usr/local

-DBUILD_SHARED_LIBS: 是否编译共享库,ON or OFF

-DBUILD_TESTING: 是否编译tests



2. Do's and Don'ts


2.1. 不要做


  • 不要使用全局函数: link_directories, include_libraries等


  • 非必要不使用PULIBC限制


  • 不要用glob匹配文件:当新增文件时,除非重新跑一遍cmake, make或其他编译工具将不会感知到新文件


  • lib不要直接link到最终的target


  • link lib时不要忽略PUBLIC/PRIVATE关键字



2.2. 要做


  • 把cmake当做正经代码维护


  • 站在target的角度思考


  • 善用alias


  • 将通用功能抽象成函数或宏


  • 函数名统一小写


  • 善用cmake_policy



2.3. 选择cmake版本


2.3.1. os支持


  • 3.4: The bare minimum. Never set less.


  • 3.7: Debian old-stable.


  • 3.10: Ubuntu 18.04.


  • 3.11: CentOS 8 (use EPEL or AppSteams, though)


  • 3.13: Debian stable.


  • 3.16: Ubuntu 20.04.


  • 3.19: First to support Apple Silicon.


  • latest: pip/conda-forge/homebew/chocolaty, ect.


笔者目前用的是3.16



2.3.2. 特性


  • 3.8: C++ meta features, CUDA, lots more


  • 3.11: IMPORTED INTERFACE setting, faster, FetchContent, COMPILE_LANGUAGE in IDEs


  • 3.12: C++20, cmake --build build -j N, SHELL:, FindPython


  • 3.14/3.15: CLI, FindPython updates


  • 3.16: Unity builds / precompiled headers, CUDA meta features


  • 3.17/3.18: Lots more CUDA, metaprogramming



3. What's new in in CMake


  • cmake 3.0: interface libraries, 允许将一组头文件抽象成一个lib


  • cmake 3.1: 支持c++11和compile features


  • cmake 3.2: 支持UTF-8


  • cmake 3.4: 支持swift语言,支持ccache


  • cmake 3.5: 支持ARM平台


  • cmake 3.6: 支持clang-tidy


  • 其他:略




4. 基础知识


指定最小版本

cmake_minimum_required(VERSION 3.1)


创建工程

project(MyProject VERSION 1.0
                  DESCRIPTION "Very nice project"
                  LANGUAGES CXX)


新增executable

add_executable(one two.cpp three.h)


新增library

add_library(one STATIC two.cpp three.h)



用户可指定STATIC、SHARED、MODULE 。缺省使用BUILD_SHARED_LIBS选项。

INTERFAC用于创建头文件库


ALIAS用于指定库的别名.


绑定头文件路径

target_include_directories(one PUBLIC include)

PUBLIC表示所有依赖lib的target都自动绑定了该头文件路径

PRIVATE表示该头文件路径仅对本target有效


INTERFACE表示该头文件路径仅对依赖该lib的target生效

PUBLIC = PRIVATE + INTERFACE



5. 变量和cache


定义变量

set(MY_VARIABLE "value")

访问变量时使用${MY_VARIABLE}

变量仅在当前作用域内有效。


定义变量(多个值)

set(MY_LIST "one" "two")

等效于

set(MY_LIST "one;two")

属性

set_property(TARGET TargetName
             PROPERTY CXX_STANDARD 11)
set_target_properties(TargetName PROPERTIES
                      CXX_STANDARD 11)
get_property(ResultVariable TARGET TargetName PROPERTY CXX_STANDARD)



相关文章
|
6月前
|
存储 测试技术 编译器
面向 C++ 的现代 CMake 教程(三)(5)
面向 C++ 的现代 CMake 教程(三)
70 1
|
4月前
|
自然语言处理 Linux C++
make和Cmake都有什么区别?(内附使用详解)
make: 是一个构建工具,它的任务是读取 Makefile 文件,并基于这些文件中的指令执行具体的构建操作。Makefile 文件包含了如何构建项目的规则,make 负责解析这些规则并执行必要的命令来编译和链接源代码,生成可执行文件或库。 CMake: 是一个构建系统生成器。它并不直接进行编译或链接,而是根据项目中 CMakeLists.txt 文件的内容生成一个或多个构建系统的描述文件(如 Makefile 或 Visual Studio 解决方案)。CMake 提供了一种更高级、更抽象的方式来描述构建过程,这使得它能够跨平台地生成各种构建系统。
335 0
|
6月前
|
存储 Unix 程序员
面向 C++ 的现代 CMake 教程(三)(1)
面向 C++ 的现代 CMake 教程(三)
133 1
|
6月前
|
存储 并行计算 编译器
面向 C++ 的现代 CMake 教程(二)(3)
面向 C++ 的现代 CMake 教程(二)
73 1
|
6月前
|
存储 Unix 编译器
面向 C++ 的现代 CMake 教程(二)(1)
面向 C++ 的现代 CMake 教程(二)
52 0
|
6月前
|
存储 编译器 开发工具
面向 C++ 的现代 CMake 教程(三)(2)
面向 C++ 的现代 CMake 教程(三)
71 0
|
6月前
|
编译器 测试技术 开发工具
面向 C++ 的现代 CMake 教程(二)(4)
面向 C++ 的现代 CMake 教程(二)
57 0
|
6月前
|
测试技术 开发工具 git
面向 C++ 的现代 CMake 教程(三)(3)
面向 C++ 的现代 CMake 教程(三)
127 0
|
6月前
|
存储 数据可视化 编译器
面向 C++ 的现代 CMake 教程(二)(2)
面向 C++ 的现代 CMake 教程(二)
83 0
|
6月前
|
存储 前端开发 测试技术
面向 C++ 的现代 CMake 教程(三)(4)
面向 C++ 的现代 CMake 教程(三)
51 0