diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 0222e04b90..d359f79236 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -49,9 +49,12 @@ so it should be invoked as one would invoke Maven, e.g.: `build/build-in-docker
### cudf Submodule and Build
[RAPIDS cuDF](https://github.com/rapidsai/cudf) is being used as a submodule in this project.
-Due to the lengthy build of libcudf, it is **not cleaned** during a normal Maven clean phase.
-Use `-Dlibcudf.clean.skip=true` to clean the libcudf build area in addition to the normal clean
-of `target/` directories.
+Due to the lengthy build of libcudf, it is **not cleaned** during a normal Maven clean phase
+unless built using `build/build-in-docker`. `build/build-in-docker` uses `ccache` by default
+unless CCACHE_DISABLE=1 is set in the environment.
+
+`-Dlibcudf.clean.skip=false` can also be specified on the Maven command-line to force
+libcudf to be cleaned during the Maven clean phase.
Currently libcudf is only configured once and the build relies on cmake to re-configure as needed.
This is because libcudf currently is rebuilding almost entirely when it is configured with the same
diff --git a/build-libcudf.xml b/build-libcudf.xml
index 1be5d49c84..1daa0e5add 100644
--- a/build-libcudf.xml
+++ b/build-libcudf.xml
@@ -36,6 +36,7 @@
executable="cmake"
if:true="${needConfigure}">
+
diff --git a/build/build-in-docker b/build/build-in-docker
index a3b007cd90..a759d970d4 100755
--- a/build/build-in-docker
+++ b/build/build-in-docker
@@ -46,6 +46,25 @@ $DOCKER_CMD build -f $REPODIR/thirdparty/cudf/java/ci/Dockerfile.centos7 \
-t $IMAGE_NAME \
$REPODIR/thirdparty/cudf/java/ci
+CCACHE_OPTS=(
+ "-DCMAKE_C_COMPILER_LAUNCHER=ccache"
+ "-DCMAKE_CXX_COMPILER_LAUNCHER=ccache"
+ "-DCMAKE_CUDA_COMPILER_LAUNCHER=ccache"
+ "-DCMAKE_CXX_LINKER_LAUNCHER=ccache"
+)
+
+_CUDF_CLEAN_SKIP=""
+# if ccache is enabled and libcudf.clean.skip not provided
+# by the user remove the cpp build directory
+#
+if [[ "$CCACHE_DISABLE" != "1" ]]; then
+ if [[ ! "$*" =~ " -Dlibcudf.clean.skip=" ]]; then
+ # Don't skip clean if ccache is enabled
+ # unless the user overrides
+ _CUDF_CLEAN_SKIP="-Dlibcudf.clean.skip=false"
+ fi
+fi
+
$DOCKER_CMD run -it -u $(id -u):$(id -g) --rm \
-v "/etc/group:/etc/group:ro" \
-v "/etc/passwd:/etc/passwd:ro" \
@@ -53,7 +72,9 @@ $DOCKER_CMD run -it -u $(id -u):$(id -g) --rm \
-v "/etc/sudoers.d:/etc/sudoers.d:ro" \
-v "$REPODIR:$WORKSPACE_REPODIR:rw" \
-v "$LOCAL_MAVEN_REPO:$WORKSPACE_MAVEN_REPODIR:rw" \
+ -v "$HOME/.ccache:$HOME/.ccache:rw" \
--workdir "$WORKSPACE_REPODIR" \
+ -e CCACHE_DISABLE \
-e CMAKE_GENERATOR="$CMAKE_GENERATOR" \
-e CUDA_VISIBLE_DEVICES \
-e PARALLEL_LEVEL \
@@ -63,4 +84,6 @@ $DOCKER_CMD run -it -u $(id -u):$(id -g) --rm \
-Dmaven.repo.local=$WORKSPACE_MAVEN_REPODIR \
-DPER_THREAD_DEFAULT_STREAM=$PER_THREAD_DEFAULT_STREAM \
-DUSE_GDS=$USE_GDS \
+ -Dcmake.ccache.opts=\"${CCACHE_OPTS[*]}\" \
+ $_CUDF_CLEAN_SKIP \
$*"
diff --git a/pom.xml b/pom.xml
index 8a17befb02..5cbd892188 100644
--- a/pom.xml
+++ b/pom.xml
@@ -100,6 +100,7 @@
UTF-8
1.7.30
false
+
@@ -260,6 +261,7 @@
+