[llvm] [CMake] Configure ccache using command line options (PR #134857)
Kajetan Puchalski via llvm-commits
llvm-commits at lists.llvm.org
Wed Apr 9 04:21:12 PDT 2025
https://github.com/mrkajetanp updated https://github.com/llvm/llvm-project/pull/134857
>From 773575fcf7c4b6bf7c0ff1c2bf98ddaad59d6347 Mon Sep 17 00:00:00 2001
From: Kajetan Puchalski <kajetan.puchalski at arm.com>
Date: Tue, 8 Apr 2025 13:39:58 +0000
Subject: [PATCH 1/4] [CMake] Configure ccache using command line options
Since ccache 4.8, it is possible to pass configuration options directly
to ccache on the command line as opposed to through environment
variables.
This is the intended way for CMake to configure ccache, as described on
the GitHub wiki for the project:
https://github.com/ccache/ccache/wiki/CMake
This should allow for uniform ccache configuration that does not rely on
platform-specific environment setup.
Rework the way ccache is configured by LLVM accordingly.
Signed-off-by: Kajetan Puchalski <kajetan.puchalski at arm.com>
---
llvm/CMakeLists.txt | 39 +++++++++++++++++++++++++--------------
1 file changed, 25 insertions(+), 14 deletions(-)
diff --git a/llvm/CMakeLists.txt b/llvm/CMakeLists.txt
index cfd1a086c0fc2..56fc4235eb526 100644
--- a/llvm/CMakeLists.txt
+++ b/llvm/CMakeLists.txt
@@ -271,30 +271,41 @@ set(LLVM_CCACHE_BUILD OFF CACHE BOOL "Set to ON for a ccache enabled build")
if(LLVM_CCACHE_BUILD)
find_program(CCACHE_PROGRAM ccache)
if(CCACHE_PROGRAM)
+ # ccache --version example output: "ccache version 4.9.1\n(..)"
+ execute_process(COMMAND ${CCACHE_PROGRAM} --version OUTPUT_VARIABLE CCACHE_VERSION_STR)
+ string(REGEX MATCH "[0-9]+\.[0-9]+\.?[0-9]*" CCACHE_VERSION "${CCACHE_VERSION_STR}")
+
set(LLVM_CCACHE_MAXSIZE "" CACHE STRING "Size of ccache")
set(LLVM_CCACHE_DIR "" CACHE STRING "Directory to keep ccached data")
- set(LLVM_CCACHE_PARAMS "CCACHE_CPP2=yes CCACHE_HASHDIR=yes"
- CACHE STRING "Parameters to pass through to ccache")
- if(NOT CMAKE_SYSTEM_NAME MATCHES "Windows")
- set(CCACHE_PROGRAM "${LLVM_CCACHE_PARAMS} ${CCACHE_PROGRAM}")
+ # ccache only supports passing options on the command line from version 4.8.0
+ # use a workaround with ad-hoc environment variables for older versions
+ if (CCACHE_VERSION VERSION_LESS "4.8.0")
+ set(LLVM_CCACHE_PARAMS CCACHE_CPP2=yes CCACHE_HASHDIR=yes)
+
+ set(launcher_params ${LLVM_CCACHE_PARAMS})
if (LLVM_CCACHE_MAXSIZE)
- set(CCACHE_PROGRAM "CCACHE_MAXSIZE=${LLVM_CCACHE_MAXSIZE} ${CCACHE_PROGRAM}")
+ set(launcher_params CCACHE_MAXSIZE=${LLVM_CCACHE_MAXSIZE} ${launcher_params})
endif()
if (LLVM_CCACHE_DIR)
- set(CCACHE_PROGRAM "CCACHE_DIR=${LLVM_CCACHE_DIR} ${CCACHE_PROGRAM}")
+ set(launcher_params CCACHE_DIR=${LLVM_CCACHE_DIR} ${launcher_params})
endif()
- set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE_PROGRAM})
+ set(launcher ${launcher_params} ${CCACHE_PROGRAM})
else()
- if(LLVM_CCACHE_MAXSIZE OR LLVM_CCACHE_DIR OR
- NOT LLVM_CCACHE_PARAMS MATCHES "CCACHE_CPP2=yes CCACHE_HASHDIR=yes")
- message(FATAL_ERROR "Ccache configuration through CMake is not supported on Windows. Please use environment variables.")
+ set(LLVM_CCACHE_PARAMS run_second_cpp=true hash_dir=true)
+
+ set(launcher_params ${LLVM_CCACHE_PARAMS})
+ if (LLVM_CCACHE_MAXSIZE)
+ set(launcher_params max_size=${LLVM_CCACHE_MAXSIZE} ${launcher_params})
endif()
- # RULE_LAUNCH_COMPILE should work with Ninja but currently has issues
- # with cmd.exe and some MSVC tools other than cl.exe
- set(CMAKE_C_COMPILER_LAUNCHER ${CCACHE_PROGRAM})
- set(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE_PROGRAM})
+ if (LLVM_CCACHE_DIR)
+ set(launcher_params cache_dir=${LLVM_CCACHE_DIR} ${launcher_params})
+ endif()
+ set(launcher ${CCACHE_PROGRAM} ${launcher_params})
endif()
+
+ set(CMAKE_C_COMPILER_LAUNCHER ${launcher})
+ set(CMAKE_CXX_COMPILER_LAUNCHER ${launcher})
else()
message(FATAL_ERROR "Unable to find the program ccache. Set LLVM_CCACHE_BUILD to OFF")
endif()
>From 8e259f42e11a9cc761abbd363212bd7372975e59 Mon Sep 17 00:00:00 2001
From: Kajetan Puchalski <kajetan.puchalski at arm.com>
Date: Tue, 8 Apr 2025 14:20:32 +0000
Subject: [PATCH 2/4] [CMake] Quote CCACHE_PROGRAM in case it has spaces
---
llvm/CMakeLists.txt | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/llvm/CMakeLists.txt b/llvm/CMakeLists.txt
index 56fc4235eb526..61251b0966f5c 100644
--- a/llvm/CMakeLists.txt
+++ b/llvm/CMakeLists.txt
@@ -290,7 +290,7 @@ if(LLVM_CCACHE_BUILD)
if (LLVM_CCACHE_DIR)
set(launcher_params CCACHE_DIR=${LLVM_CCACHE_DIR} ${launcher_params})
endif()
- set(launcher ${launcher_params} ${CCACHE_PROGRAM})
+ set(launcher ${launcher_params} "${CCACHE_PROGRAM}")
else()
set(LLVM_CCACHE_PARAMS run_second_cpp=true hash_dir=true)
@@ -301,7 +301,7 @@ if(LLVM_CCACHE_BUILD)
if (LLVM_CCACHE_DIR)
set(launcher_params cache_dir=${LLVM_CCACHE_DIR} ${launcher_params})
endif()
- set(launcher ${CCACHE_PROGRAM} ${launcher_params})
+ set(launcher "${CCACHE_PROGRAM}" ${launcher_params})
endif()
set(CMAKE_C_COMPILER_LAUNCHER ${launcher})
>From 7d7d28248a21754500a9173e420f37c69b3443f1 Mon Sep 17 00:00:00 2001
From: Kajetan Puchalski <kajetan.puchalski at arm.com>
Date: Tue, 8 Apr 2025 14:26:37 +0000
Subject: [PATCH 3/4] [CMake] Keep ccache-related CACHE variables
---
llvm/CMakeLists.txt | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/llvm/CMakeLists.txt b/llvm/CMakeLists.txt
index 61251b0966f5c..96ca44e393442 100644
--- a/llvm/CMakeLists.txt
+++ b/llvm/CMakeLists.txt
@@ -281,7 +281,8 @@ if(LLVM_CCACHE_BUILD)
# ccache only supports passing options on the command line from version 4.8.0
# use a workaround with ad-hoc environment variables for older versions
if (CCACHE_VERSION VERSION_LESS "4.8.0")
- set(LLVM_CCACHE_PARAMS CCACHE_CPP2=yes CCACHE_HASHDIR=yes)
+ set(LLVM_CCACHE_PARAMS "CCACHE_CPP2=yes;CCACHE_HASHDIR=yes"
+ CACHE STRING "Parameters to pass through to ccache")
set(launcher_params ${LLVM_CCACHE_PARAMS})
if (LLVM_CCACHE_MAXSIZE)
@@ -292,7 +293,8 @@ if(LLVM_CCACHE_BUILD)
endif()
set(launcher ${launcher_params} "${CCACHE_PROGRAM}")
else()
- set(LLVM_CCACHE_PARAMS run_second_cpp=true hash_dir=true)
+ set(LLVM_CCACHE_PARAMS "run_second_cpp=true;hash_dir=true"
+ CACHE STRING "Parameters to pass through to ccache")
set(launcher_params ${LLVM_CCACHE_PARAMS})
if (LLVM_CCACHE_MAXSIZE)
>From 61d4754001849f29a70df7b81ac570682dbc3c57 Mon Sep 17 00:00:00 2001
From: Kajetan Puchalski <kajetan.puchalski at arm.com>
Date: Wed, 9 Apr 2025 11:19:26 +0000
Subject: [PATCH 4/4] [CMake] Include pre-4.8 ccache error on Windows
---
llvm/CMakeLists.txt | 22 +++++++++++++++-------
1 file changed, 15 insertions(+), 7 deletions(-)
diff --git a/llvm/CMakeLists.txt b/llvm/CMakeLists.txt
index 96ca44e393442..6913fde73be67 100644
--- a/llvm/CMakeLists.txt
+++ b/llvm/CMakeLists.txt
@@ -284,14 +284,22 @@ if(LLVM_CCACHE_BUILD)
set(LLVM_CCACHE_PARAMS "CCACHE_CPP2=yes;CCACHE_HASHDIR=yes"
CACHE STRING "Parameters to pass through to ccache")
- set(launcher_params ${LLVM_CCACHE_PARAMS})
- if (LLVM_CCACHE_MAXSIZE)
- set(launcher_params CCACHE_MAXSIZE=${LLVM_CCACHE_MAXSIZE} ${launcher_params})
- endif()
- if (LLVM_CCACHE_DIR)
- set(launcher_params CCACHE_DIR=${LLVM_CCACHE_DIR} ${launcher_params})
+ if(NOT CMAKE_SYSTEM_NAME MATCHES "Windows")
+ set(launcher_params ${LLVM_CCACHE_PARAMS})
+ if (LLVM_CCACHE_MAXSIZE)
+ set(launcher_params CCACHE_MAXSIZE=${LLVM_CCACHE_MAXSIZE} ${launcher_params})
+ endif()
+ if (LLVM_CCACHE_DIR)
+ set(launcher_params CCACHE_DIR=${LLVM_CCACHE_DIR} ${launcher_params})
+ endif()
+ set(launcher ${launcher_params} "${CCACHE_PROGRAM}")
+ else()
+ if(LLVM_CCACHE_MAXSIZE OR LLVM_CCACHE_DIR OR
+ NOT LLVM_CCACHE_PARAMS MATCHES "CCACHE_CPP2=yes;CCACHE_HASHDIR=yes")
+ message(FATAL_ERROR "Ccache configuration through CMake is not supported on Windows. Please use environment variables.")
+ endif()
+ set(launcher "${CCACHE_PROGRAM}")
endif()
- set(launcher ${launcher_params} "${CCACHE_PROGRAM}")
else()
set(LLVM_CCACHE_PARAMS "run_second_cpp=true;hash_dir=true"
CACHE STRING "Parameters to pass through to ccache")
More information about the llvm-commits
mailing list