From 8f83cdde40420a19a72c9cc986b2c70e8a9fcff1 Mon Sep 17 00:00:00 2001 From: Be Date: Tue, 2 Nov 2021 19:56:44 -0500 Subject: [PATCH] CMake: use ccache and sccache for compiler caching First build on Fedora 35 with an Intel Core i7 8550U: 4.5 minutes Repeat build with ccache after deleting CMake build directory and creating a new one: 1.5 minutes This code is adapted from Tenacity, written by myself and @emabrey, licensed BSD-3-Clause. ccache is easily available from Linux distribution packages and Homebrew on macOS. sccache is the only currently maintained compiler cache for MSVC and can be installed easily from Chocolatey on Windows. Alternatively it can be installed with cargo if a Rust toolchain is installed. Signed-off-by: Be --- cmake/modules/CompilerCaching.cmake | 63 +++++++++++++++++++++++++++++ src/CMakeLists.txt | 1 + 2 files changed, 64 insertions(+) create mode 100644 cmake/modules/CompilerCaching.cmake diff --git a/cmake/modules/CompilerCaching.cmake b/cmake/modules/CompilerCaching.cmake new file mode 100644 index 0000000000000..970c2962420b0 --- /dev/null +++ b/cmake/modules/CompilerCaching.cmake @@ -0,0 +1,63 @@ +# SPDX-FileCopyrightText: 2021 Tenacity Audio Editor contributors +# +# SPDX-License-Identifier: BSD-3-Clause +#[=======================================================================[.rst: +CompilerCaching +--------------- + +Search for sccache and ccache and use them for compiler caching for C & C++. +ccache is preferred if both are found, but the user can override this by +explicitly setting CCACHE=OFF to use sccache when both are installed. +#]=======================================================================] + +# ccache does not support MSVC +if(NOT CMAKE_CXX_COMPILER_ID MATCHES "MSVC") + find_program(CCACHE_PROGRAM ccache) + mark_as_advanced(FORCE CCACHE_PROGRAM) + if("${CCACHE_PROGRAM}" STREQUAL "CCACHE_PROGRAM-NOTFOUND") + message(STATUS "Could NOT find ccache") + else() + message(STATUS "Found ccache: ${CCACHE_PROGRAM}") + option(CCACHE "Use ccache for compiler caching to speed up rebuilds." ON) + endif() +endif() + +find_program(SCCACHE_PROGRAM sccache) +mark_as_advanced(FORCE SCCACHE_PROGRAM) +if("${SCCACHE_PROGRAM}" STREQUAL "SCCACHE_PROGRAM-NOTFOUND") + message(STATUS "Could NOT find sccache") +else() + message(STATUS "Found sccache: ${SCCACHE_PROGRAM}") + option(SCCACHE "Use sccache for compiler caching to speed up rebuilds." ON) +endif() + +if(CCACHE) + message(STATUS "Using ccache for compiler caching to speed up rebuilds") + set(CMAKE_C_COMPILER_LAUNCHER "${CCACHE_PROGRAM}") + set(CMAKE_CXX_COMPILER_LAUNCHER "${CCACHE_PROGRAM}") +elseif(SCCACHE) + message(STATUS "Using sccache for compiler caching to speed up rebuilds") + set(CMAKE_C_COMPILER_LAUNCHER "${SCCACHE_PROGRAM}") + set(CMAKE_CXX_COMPILER_LAUNCHER "${SCCACHE_PROGRAM}") + + # Instruct MSVC to generate symbolic debug information within object files for sccache + if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC") + if(IS_MULTI_CONFIG) + foreach(CONFIG ${CMAKE_CONFIGURATION_TYPES}) + string(TOUPPER "${CONFIG}" CONFIG) + string(REPLACE "/Zi" "/Z7" CMAKE_CXX_FLAGS_${CONFIG} "${CMAKE_CXX_FLAGS_${CONFIG}}") + string(REPLACE "/Zi" "/Z7" CMAKE_C_FLAGS_${CONFIG} "${CMAKE_C_FLAGS_${CONFIG}}") + endforeach() + else() + string(TOUPPER "${CMAKE_BUILD_TYPE}" CONFIG) + string(REPLACE "/Zi" "/Z7" CMAKE_CXX_FLAGS_${CONFIG} "${CMAKE_CXX_FLAGS_${CONFIG}}") + string(REPLACE "/Zi" "/Z7" CMAKE_C_FLAGS_${CONFIG} "${CMAKE_C_FLAGS_${CONFIG}}") + endif() + endif() +else() + if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC") + message(STATUS "No compiler caching enabled. Install sccache to speed up rebuilds.") + else() + message(STATUS "No compiler caching enabled. Install ccache or sccache to speed up rebuilds.") + endif() +endif() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a4d06844abccc..e186ab78ae049 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -3,6 +3,7 @@ if(NOT TOKEN_AUTH_ONLY) endif() include(ECMEnableSanitizers) +include(CompilerCaching) set(REQUIRED_QT_VERSION "5.15.0")