From 6664d65e9f9909938921c34d1863d3c717d40416 Mon Sep 17 00:00:00 2001
From: EndrII <EndrIIMail@gmail.com>
Date: Sat, 15 Apr 2023 13:47:54 +0200
Subject: [PATCH] added support ccache for xcode

---
 .gitignore               |  2 ++
 ccache.cmake             | 16 ++++++++++------
 ccahe_cc_launcher.sh.in  | 11 +++++++++++
 ccahe_cxx_launcher.sh.in | 11 +++++++++++
 4 files changed, 34 insertions(+), 6 deletions(-)
 create mode 100644 ccahe_cc_launcher.sh.in
 create mode 100644 ccahe_cxx_launcher.sh.in

diff --git a/.gitignore b/.gitignore
index dc20ac1..d543268 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,3 +9,5 @@ compile_commands.json
 CTestTestfile.cmake
 .cmake
 build.ninja
+ccahe_cc_launcher.sh
+ccahe_cxx_launcher.sh
diff --git a/ccache.cmake b/ccache.cmake
index 2e4154e..579052b 100644
--- a/ccache.cmake
+++ b/ccache.cmake
@@ -21,17 +21,21 @@ if(CCACHE_PROGRAM)
     set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK "${CCACHE_PROGRAM}") # Less useful to do it for linking, see edit2
 
     if(CMAKE_GENERATOR STREQUAL "Xcode")
+
+        set(CC_LAUNCHER ${CMAKE_CURRENT_LIST_DIR}/ccahe_cc_launcher.sh)
+        set(CXX_LAUNCHER ${CMAKE_CURRENT_LIST_DIR}/ccahe_cxx_launcher.sh)
+
+        configure_file("${CC_LAUNCHER}.in" "${CC_LAUNCHER}")
+        configure_file("${CXX_LAUNCHER}.in" "${CXX_LAUNCHER}")
+
         # Set Xcode project attributes to route compilation and linking
         # through our scripts
-        set(CMAKE_XCODE_ATTRIBUTE_CC         "${CCACHE_PROGRAM} ${CMAKE_C_COMPILER}" CACHE INTERNAL "override CMAKE_XCODE_ATTRIBUTE_CC" )
-        set(CMAKE_XCODE_ATTRIBUTE_CXX        "${CCACHE_PROGRAM} ${CMAKE_CXX_COMPILER}" CACHE INTERNAL "override CMAKE_XCODE_ATTRIBUTE_CC")
-        set(CMAKE_XCODE_ATTRIBUTE_LD         "${CCACHE_PROGRAM} ${CMAKE_LD_COMPILER}" CACHE INTERNAL "override CMAKE_XCODE_ATTRIBUTE_CC")
-        set(CMAKE_XCODE_ATTRIBUTE_LDPLUSPLUS "${CCACHE_PROGRAM} ${CMAKE_LDPLUSPLUS_COMPILER}" CACHE INTERNAL "override CMAKE_XCODE_ATTRIBUTE_CC")
+        set(CMAKE_XCODE_ATTRIBUTE_CC         ${CC_LAUNCHER} CACHE INTERNAL "override CMAKE_XCODE_ATTRIBUTE_CC" )
+        set(CMAKE_XCODE_ATTRIBUTE_CXX        ${CXX_LAUNCHER} CACHE INTERNAL "override CMAKE_XCODE_ATTRIBUTE_CC")
 
         message("CMAKE_XCODE_ATTRIBUTE_CC = ${CMAKE_XCODE_ATTRIBUTE_CC}")
         message("CMAKE_XCODE_ATTRIBUTE_CXX = ${CMAKE_XCODE_ATTRIBUTE_CXX}")
-        message("CMAKE_XCODE_ATTRIBUTE_LD = ${CMAKE_XCODE_ATTRIBUTE_LD}")
-        message("CMAKE_XCODE_ATTRIBUTE_LDPLUSPLUS = ${CMAKE_XCODE_ATTRIBUTE_LDPLUSPLUS}")
+
     endif()
 endif()
 
diff --git a/ccahe_cc_launcher.sh.in b/ccahe_cc_launcher.sh.in
new file mode 100644
index 0000000..de66b55
--- /dev/null
+++ b/ccahe_cc_launcher.sh.in
@@ -0,0 +1,11 @@
+#!/bin/sh
+
+# Xcode generator doesn't include the compiler as the
+# first argument, Ninja and Makefiles do. Handle both cases.
+if [ "$1" = "${CMAKE_C_COMPILER}" ] ; then
+    shift
+fi
+
+${CCCACHE_EXPORTS}
+
+exec "${CCACHE_PROGRAM}" "${CMAKE_C_COMPILER}" "$@"
diff --git a/ccahe_cxx_launcher.sh.in b/ccahe_cxx_launcher.sh.in
new file mode 100644
index 0000000..a32fc5a
--- /dev/null
+++ b/ccahe_cxx_launcher.sh.in
@@ -0,0 +1,11 @@
+#!/bin/sh
+
+# Xcode generator doesn't include the compiler as the
+# first argument, Ninja and Makefiles do. Handle both cases.
+if [ "$1" = "${CMAKE_CXX_COMPILER}" ] ; then
+    shift
+fi
+
+${CCCACHE_EXPORTS}
+
+exec "${CCACHE_PROGRAM}" "${CMAKE_CXX_COMPILER}" "$@"