Skip to content
Published at:

如果提高CMake编译速度

上个月在写rust的时候,有几个依赖有点大,编译速度感人,其实rust的编译速度一直就被人诟病,当然,有些是rust自身的问题,比如编译期的检查,泛型,RAII,宏;然后去网上找了些资料,搜索到一篇很有价值的文章:Tips for Faster Rust Compile Times,里面提到了些很有意思的点:泛型会影响到编译速度,因为在编译的时候,使用泛型的代码会去生成新的代码,包括你写的代码,以及源代码;还有使用编译缓存工具Sccache;更换更快的链接器。

公司有套CMake项目的代码,往后项目也会越来越大,节省编译的时候将会变得很有意义。有时候如何去优化一个问题,需要你对整个流程有足够的了解,知道他有哪些阶段,不同的阶段会干什么。才能对不同的环节进行优化

列表:

  1. 并行编译
  2. 更换更快的构建系统,比如Ninja
  3. 预编译头文件:target_precompile_headers (CMake3.16)
  4. 使用编译缓存ccache、sccache(CMake 3.4)
  5. 更新新版本的CMake、编译器和链接器
  6. 删除没有使用的代码和依赖

并行编译

开多线程,废话

更换更快的构建系统,比如Ninja

Android源码也是使用这个来编译

Ninja Design goals:https://ninja-build.org/manual.html#_design_goals

预编译头文件:target_precompile_headers

文章:https://github.com/sakra/cotire

使用编译缓存ccachesccache

ccache

使用cmake配置:https://crascit.com/2016/04/09/using-ccache-with-cmake/

cmake
cmake_minimum_required(VERSION 3.12)

find_program(CCACHE_PROGRAM ccache)
if(CCACHE_PROGRAM)
    set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_PROGRAM}")
endif()

project(SomeProject)

sccache

cmake配置:

cmake
-DCMAKE_C_COMPILER_LAUNCHER=sccache
-DCMAKE_CXX_COMPILER_LAUNCHER=sccache

rust配置:

自己写rust是用的这个,编译速度会快上不少

ini
# $HOME/.cargo/config
[build]
rustc-wrapper = "/path/to/sccache"

更新新版本的CMake、编译器和链接器

新版本cmake编译速度提升:https://blog.kitware.com/improving-cmakes-runtime-performance/

速度更快的链接器mold:https://github.com/rui314/mold

bash
$ mold -run make <make-options-if-any>

删除没有使用的代码和依赖

todo

Updated at: