aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Taves <mwtoews@gmail.com>2021-11-19 23:55:09 +1300
committerMike Taves <mwtoews@gmail.com>2021-11-20 00:56:48 +1300
commitdd74dd05a055cb882388862f8a3fe6e3ba4b194b (patch)
treed37a8707018c670852b53a99c462408625be37a6
parentac882266b57d04720bb645b8144901127f7427cf (diff)
downloadPROJ-dd74dd05a055cb882388862f8a3fe6e3ba4b194b.tar.gz
PROJ-dd74dd05a055cb882388862f8a3fe6e3ba4b194b.zip
CMake: add option USE_CCACHE=OFF to use ccache to compile C/C++ objs
-rw-r--r--CMakeLists.txt6
-rw-r--r--cmake/Ccache.cmake66
-rw-r--r--cmake/Makefile.am1
-rw-r--r--docs/source/install.rst5
-rwxr-xr-xtravis/install.sh17
5 files changed, 93 insertions, 2 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 661b3f6a..c1d58405 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -122,6 +122,12 @@ set(PROJ_BUILD_VERSION "${PROJ_API_VERSION}.${PROJ_LIBTOOL_AGE}.${PROJ_LIBTOOL_R
################################################################################
# Build features and variants
################################################################################
+
+option(USE_CCACHE "Use ccache to compile C/C++ objects" OFF)
+if(USE_CCACHE)
+ include(Ccache)
+endif()
+
include(ProjConfig)
include(ProjMac)
include(policies)
diff --git a/cmake/Ccache.cmake b/cmake/Ccache.cmake
new file mode 100644
index 00000000..09e81756
--- /dev/null
+++ b/cmake/Ccache.cmake
@@ -0,0 +1,66 @@
+#
+# CMake module to support ccache
+#
+# see https://crascit.com/2016/04/09/using-ccache-with-cmake/
+#
+
+find_program(CCACHE_PROGRAM ccache)
+# Note: REQUIRED keyword introduced in CMake 3.18
+
+if(CCACHE_PROGRAM)
+ message(STATUS "Configuring ccache with ${CCACHE_PROGRAM}")
+
+ set(C_LAUNCHER "${CCACHE_PROGRAM}")
+ set(CXX_LAUNCHER "${CCACHE_PROGRAM}")
+
+ # Set up wrapper scripts
+ set(CCACHE_LAUNCH_C ${CMAKE_BINARY_DIR}/ccache-launch-c)
+ file(WRITE ${CCACHE_LAUNCH_C} "\
+#!/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
+
+export CCACHE_CPP2=true
+exec \"${C_LAUNCHER}\" \"${CMAKE_C_COMPILER}\" \"$@\"
+")
+
+ set(CCACHE_LAUNCH_CXX ${CMAKE_BINARY_DIR}/ccache-launch-cxx)
+ file(WRITE ${CCACHE_LAUNCH_CXX} "\
+#!/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
+
+export CCACHE_CPP2=true
+exec \"${CXX_LAUNCHER}\" \"${CMAKE_CXX_COMPILER}\" \"$@\"
+")
+
+ # Note: file(CHMOD) introduced in CMake 3.19
+ execute_process(
+ COMMAND chmod a+rx
+ "${CCACHE_LAUNCH_C}"
+ "${CCACHE_LAUNCH_CXX}"
+ )
+
+ if(CMAKE_GENERATOR STREQUAL "Xcode")
+ # Set Xcode project attributes to route compilation and linking
+ # through our scripts
+ set(CMAKE_XCODE_ATTRIBUTE_CC "${CCACHE_LAUNCH_C}")
+ set(CMAKE_XCODE_ATTRIBUTE_CXX "${CCACHE_LAUNCH_CXX}")
+ set(CMAKE_XCODE_ATTRIBUTE_LD "${CCACHE_LAUNCH_C}")
+ set(CMAKE_XCODE_ATTRIBUTE_LDPLUSPLUS "${CCACHE_LAUNCH_CXX}")
+ else()
+ # Support Unix Makefiles and Ninja
+ set(CMAKE_C_COMPILER_LAUNCHER "${CCACHE_LAUNCH_C}")
+ set(CMAKE_CXX_COMPILER_LAUNCHER "${CCACHE_LAUNCH_CXX}")
+ endif()
+else()
+ message(SEND_ERROR "Ccache requested, but ccache was not found")
+endif()
diff --git a/cmake/Makefile.am b/cmake/Makefile.am
index cdad1ff8..de982198 100644
--- a/cmake/Makefile.am
+++ b/cmake/Makefile.am
@@ -1,4 +1,5 @@
EXTRA_DIST = CMakeLists.txt \
+ Ccache.cmake \
ProjInstallPath.cmake \
ProjUtilities.cmake \
proj_config.cmake.in \
diff --git a/docs/source/install.rst b/docs/source/install.rst
index 208b55d4..d4d202b8 100644
--- a/docs/source/install.rst
+++ b/docs/source/install.rst
@@ -465,6 +465,11 @@ All cached entries can be viewed using ``cmake -LAH`` from a build directory.
``TIFF_LIBRARY_DEBUG`` can also be specified to a similar library for
building Debug releases.
+.. option:: USE_CCACHE=OFF
+
+ Configure CMake to use `ccache <https://ccache.dev/>`_ to build C/C++
+ objects.
+
Building on Windows with vcpkg and Visual Studio 2017 or 2019
--------------------------------------------------------------------------------
diff --git a/travis/install.sh b/travis/install.sh
index d0b4d9cb..8a9a6f72 100755
--- a/travis/install.sh
+++ b/travis/install.sh
@@ -139,11 +139,24 @@ if [ "$BUILD_NAME" != "linux_gcc8" -a "$BUILD_NAME" != "linux_gcc_32bit" ]; then
VERBOSE=1 make >/dev/null
cd ../..
+ # Use ccache if it's available
+ if command -v ccache &> /dev/null
+ then
+ USE_CCACHE=ON
+ ccache -s
+ else
+ USE_CCACHE=OFF
+ fi
+
# Regular build
mkdir build_cmake
cd build_cmake
- cmake .. -DCMAKE_INSTALL_PREFIX=/tmp/proj_cmake_install
- VERBOSE=1 make >/dev/null
+ cmake .. -DCMAKE_INSTALL_PREFIX=/tmp/proj_cmake_install -DUSE_CCACHE=${USE_CCACHE}
+ make >/dev/null
+ if [ "$USE_CCACHE" = "ON" ]; then
+ ccache -s
+ fi
+
make install >/dev/null
ctest
find /tmp/proj_cmake_install