aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2021-11-25 11:53:21 +0100
committerGitHub <noreply@github.com>2021-11-25 11:53:21 +0100
commit3636c8f8e76be8bd9bf98810ead5ab1d77f6ecab (patch)
tree93a162fe11cdde7bef8bcc4b73c2c52becad8b60
parente93e86ce405fb642ba74c150d5a4661f68214c22 (diff)
parentcd07dcf0c4b60860188fc7829ebd20df835c68d4 (diff)
downloadPROJ-3636c8f8e76be8bd9bf98810ead5ab1d77f6ecab.tar.gz
PROJ-3636c8f8e76be8bd9bf98810ead5ab1d77f6ecab.zip
Merge pull request #2948 from mwtoews/cmake-ccache
CMake: add option USE_CCACHE=OFF to use ccache to compile C/C++ objs
-rw-r--r--CMakeLists.txt2
-rw-r--r--cmake/Ccache.cmake64
-rw-r--r--cmake/Makefile.am1
-rw-r--r--docs/source/install.rst6
-rwxr-xr-xtravis/install.sh17
5 files changed, 88 insertions, 2 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 661b3f6a..744ee4c2 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -122,6 +122,8 @@ set(PROJ_BUILD_VERSION "${PROJ_API_VERSION}.${PROJ_LIBTOOL_AGE}.${PROJ_LIBTOOL_R
################################################################################
# Build features and variants
################################################################################
+
+include(Ccache)
include(ProjConfig)
include(ProjMac)
include(policies)
diff --git a/cmake/Ccache.cmake b/cmake/Ccache.cmake
new file mode 100644
index 00000000..10b4cfd0
--- /dev/null
+++ b/cmake/Ccache.cmake
@@ -0,0 +1,64 @@
+#
+# CMake module to support ccache (or clcache for MSVC)
+#
+# Copyright (c) 2021, Mike Taves <mwtoews at gmail dot com>
+#
+# Usage:
+# Add "include(Ccache)" to CMakeLists.txt and enable
+# using the option -D USE_CCACHE=ON
+
+cmake_minimum_required(VERSION 3.4)
+
+
+option(USE_CCACHE
+ "Use ccache (or clcache for MSVC) to compile C/C++ objects" OFF)
+if(NOT USE_CCACHE)
+ # stop here and return to including file
+ return()
+endif()
+
+# Search priority:
+# 1. ccache for many compilers except MSVC
+# 2. clcache for MSVC
+
+find_program(CCACHE_PROGRAM NAMES ccache clcache)
+
+if(CCACHE_PROGRAM)
+ message(STATUS "Configuring ccache with ${CCACHE_PROGRAM}")
+
+ if(CMAKE_GENERATOR STREQUAL "Xcode")
+ # see https://crascit.com/2016/04/09/using-ccache-with-cmake/
+ set(C_LAUNCHER "${CCACHE_PROGRAM}")
+ set(CXX_LAUNCHER "${CCACHE_PROGRAM}")
+ set(CCACHE_LAUNCH_C ${CMAKE_BINARY_DIR}/ccache-c)
+ set(CCACHE_LAUNCH_CXX ${CMAKE_BINARY_DIR}/ccache-cxx)
+ file(WRITE "${CCACHE_LAUNCH_C}" "\
+#!/bin/sh
+shift
+exec \"${C_LAUNCHER}\" \"${CMAKE_C_COMPILER}\" \"$@\"
+")
+ file(WRITE "${CCACHE_LAUNCH_CXX}" "\
+#!/bin/sh
+shift
+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}"
+ )
+ # Set Xcode project attributes to route compilation and linking
+ # through the wrapper 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()
+ # Most other generators (Unix Makefiles, Ninja, etc.)
+ set(CMAKE_C_COMPILER_LAUNCHER "${CCACHE_PROGRAM}")
+ set(CMAKE_CXX_COMPILER_LAUNCHER "${CCACHE_PROGRAM}")
+ endif()
+else()
+ message(WARNING "Ccache was requested, but no program 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..23224e23 100644
--- a/docs/source/install.rst
+++ b/docs/source/install.rst
@@ -465,6 +465,12 @@ 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/>`_ (or
+ `clcache <https://github.com/frerich/clcache>`_ for MSVC)
+ 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..916f554d 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