about summary refs log tree commit diff homepage
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt17
-rw-r--r--README-CMake.md6
-rw-r--r--docs/CMakeLists.txt14
-rw-r--r--runtime/CMakeLists.txt6
4 files changed, 40 insertions, 3 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index ed031459..32933e7c 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -490,6 +490,23 @@ else()
 endif()
 
 ################################################################################
+# Global clean target
+################################################################################
+# CMake already uses the "clean" target name but it doesn't clean everything
+# unfortunately. We can't modify the target so we provide our own "clean_all"
+# target that runs clean. Other rules for performing clean up should declare
+# that "clean_all" depends on those rules.
+add_custom_target(clean_all
+  # Invoke CMake's own clean target
+  COMMAND
+    "${CMAKE_COMMAND}"
+    "--build"
+    "${CMAKE_BINARY_DIR}"
+    "--target"
+    "clean"
+)
+
+################################################################################
 # KLEE runtime support
 ################################################################################
 # This is set here and not in `runtime` because `config.h` needs to be generated.
diff --git a/README-CMake.md b/README-CMake.md
index daa1e90c..5828e319 100644
--- a/README-CMake.md
+++ b/README-CMake.md
@@ -6,7 +6,11 @@ its autoconf/Makefile based build system.
 ## Useful top level targets
 
 * `check` - Build and run all tests.
-* `clean` - Clean the build tree. Note this won't clean the runtime build.
+* `clean` - Invoke CMake's built-in target to clean the build tree.  Note this
+  won't invoke the `clean_*` targets. It is advised that the `clean_all` target
+  is used instead.
+* `clean_all` - Run all clean targets.
+* `clean_doxygen` - Clean doxygen build tree.
 * `clean_runtime` - Clean the runtime build tree.
 * `docs` - Build documentation
 * `edit_cache` - Show cmake/ccmake/cmake-gui interface for chaning configure options.
diff --git a/docs/CMakeLists.txt b/docs/CMakeLists.txt
index 386298ce..f689e8a0 100644
--- a/docs/CMakeLists.txt
+++ b/docs/CMakeLists.txt
@@ -28,6 +28,20 @@ if (ENABLE_DOXYGEN)
       ${ADD_CUSTOM_COMMAND_USES_TERMINAL_ARG}
     )
     add_dependencies(docs doc-doxygen)
+
+    # FIXME: This variable should be used to set `OUTPUT_DIRECTORY` in
+    # doxygen.cfg
+    set(DOXYGEN_OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/doxygen")
+
+    # Add rule to clean doxygen documentation
+    add_custom_target(clean_doxygen
+      COMMAND
+        "${CMAKE_COMMAND}"
+        "-E"
+        "remove_directory"
+        "${DOXYGEN_OUTPUT_DIR}"
+    )
+    add_dependencies(clean_all clean_doxygen)
   else()
     message(WARNING "Doxygen not found. Can't build Doxygen documentation")
     set(ENABLE_DOXYGEN OFF
diff --git a/runtime/CMakeLists.txt b/runtime/CMakeLists.txt
index c90cbda0..2a056d9f 100644
--- a/runtime/CMakeLists.txt
+++ b/runtime/CMakeLists.txt
@@ -115,13 +115,15 @@ ExternalProject_Add_Step(BuildKLEERuntimes RuntimeBuild
 )
 
 # Target for cleaning the bitcode build system
-# FIXME: Invoke `make clean` does not invoke this target. It's also weird
-# that `ExternalProject` provides no way to do a clean.
+# NOTE: Invoking `make clean` does not invoke this target.
+# Instead the user needs to invoke the `clean_all` target.
+# It's also weird that `ExternalProject` provides no way to do a clean.
 add_custom_target(clean_runtime
   COMMAND ${ENV_BINARY} MAKEFLAGS="" ${MAKE_BINARY} -f Makefile.cmake.bitcode clean
   WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
   ${ADD_CUSTOM_COMMAND_USES_TERMINAL_ARG}
 )
+add_dependencies(clean_all clean_runtime)
 
 ###############################################################################
 # Runtime install