Skip to content

Commit

Permalink
Faster compile times (ccache#759)
Browse files Browse the repository at this point in the history
  • Loading branch information
AlexanderLanin authored Jan 17, 2021
1 parent 5796e9b commit c47e684
Show file tree
Hide file tree
Showing 4 changed files with 104 additions and 1 deletion.
2 changes: 2 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@ else()
endif()
message(STATUS "Ccache dev mode: ${CCACHE_DEV_MODE}")

include(UseCcache)
include(UseFastestLinker)
include(StandardSettings)
include(StandardWarnings)
include(CIBuildType)
Expand Down
68 changes: 68 additions & 0 deletions cmake/UseCcache.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
# Note: Compiling ccache via ccache is fine, because this uses a stable version which
# is installed on the system.


# Calls `message(VERBOSE msg)` if and only if VERBOSE is available (since CMake 3.15).
# Call CMake with --loglevel=VERBOSE to view those messages.
function(message_verbose msg)
if(NOT ${CMAKE_VERSION} VERSION_LESS "3.15")
message(VERBOSE ${msg})
endif()
endfunction()

# Modified version of Craig Scott's "Professional CMake: A Practical Guide", 8th Edition
function(use_ccache)
if(NOT CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
message(WARNING "use_ccache() disabled, as it is not called from the project top level")
return()
endif()

find_program(CCACHE_PROGRAM ccache)
if(NOT CCACHE_PROGRAM)
message_verbose("Ccache program not found, not enabling ccache for faster recompilation")
return()
endif()

message_verbose("Ccache enabled for faster recompilation")

# This will override any config and environment settings.
# Worst case it's overriding better suited user defined values.
set(ccacheEnv
# Another option would be CMAKE_BINARY_DIR, however currently only one basedir is supported.
CCACHE_BASEDIR=${CMAKE_SOURCE_DIR}

# In case of very old ccache versions (pre 3.3)
CCACHE_CPP2=true

# This has been turned on by default in ccache 4.0
# CCACHE_COMPRESS=1
)

if(CMAKE_GENERATOR MATCHES "Ninja|Makefiles")
foreach(lang IN ITEMS C CXX OBJC OBJCXX CUDA)
set(CMAKE_${lang}_COMPILER_LAUNCHER
${CMAKE_COMMAND} -E env ${ccacheEnv} ${CCACHE_PROGRAM}
PARENT_SCOPE)
endforeach()
elseif(CMAKE_GENERATOR STREQUAL Xcode)
foreach(lang IN ITEMS C CXX)
set(launcher ${CMAKE_BINARY_DIR}/launch-${lang})
file(WRITE ${launcher} "#!/bin/bash\n\n")
foreach(keyVal IN LISTS ccacheEnv)
file(APPEND ${launcher} "export ${keyVal}\n")
endforeach()
file(APPEND ${launcher}
"exec \"${CCACHE_PROGRAM}\" \"${CMAKE_${lang}_COMPILER}\" \"$@\"\n")
execute_process(COMMAND chmod a+rx ${launcher})
endforeach()
set(CMAKE_XCODE_ATTRIBUTE_CC ${CMAKE_BINARY_DIR}/launch-C PARENT_SCOPE)
set(CMAKE_XCODE_ATTRIBUTE_CXX ${CMAKE_BINARY_DIR}/launch-CXX PARENT_SCOPE)
set(CMAKE_XCODE_ATTRIBUTE_LD ${CMAKE_BINARY_DIR}/launch-C PARENT_SCOPE)
set(CMAKE_XCODE_ATTRIBUTE_LDPLUSPLUS ${CMAKE_BINARY_DIR}/launch-CXX PARENT_SCOPE)
endif()
endfunction()

option(USE_CCACHE "Use ccache to speed up recompilation time" TRUE)
if(USE_CCACHE)
use_ccache()
endif()
33 changes: 33 additions & 0 deletions cmake/UseFastestLinker.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Calls `message(VERBOSE msg)` if and only if VERBOSE is available (since CMake 3.15).
# Call CMake with --loglevel=VERBOSE to view those messages.
function(message_verbose msg)
if(NOT ${CMAKE_VERSION} VERSION_LESS "3.15")
message(VERBOSE ${msg})
endif()
endfunction()

function(use_fastest_linker)
if(NOT CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
message(WARNING "use_fastest_linker() disabled, as it is not called at the project top level")
return()
endif()

find_program(HAS_LD_LLD ld.lld)
if(HAS_LD_LLD)
link_libraries(-fuse-ld=lld)
message_verbose("Using lld linker for faster linking")
else()
find_program(HAS_LD_GOLD ld.gold)
if(HAS_LD_GOLD)
link_libraries(-fuse-ld=gold)
message_verbose("Using gold linker for faster linking")
else()
message_verbose("Using default linker")
endif()
endif()
endfunction()

option(USE_FASTER_LINKER "Use the lld or gold linker instead of the default for faster linking" TRUE)
if(USE_FASTER_LINKER)
use_fastest_linker()
endif()
2 changes: 1 addition & 1 deletion doc/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ find_program(ASCIIDOC_EXE asciidoc)
mark_as_advanced(ASCIIDOC_EXE) # Don't show in CMake UIs

if(NOT ASCIIDOC_EXE)
message(WARNING "Could not find asciidoc; documentation will not be generated")
message(NOTICE "Could not find asciidoc; documentation will not be generated")
else()
#
# HTML documentation
Expand Down

0 comments on commit c47e684

Please sign in to comment.