diff --git a/CMakeLists.txt b/CMakeLists.txt
index 6f39cac13..c8ecb5295 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -22,6 +22,13 @@ endif()
 set(CMAKE_USER_MAKE_RULES_OVERRIDE_CXX "${CMAKE_CURRENT_SOURCE_DIR}/cmake/cxx_compiler_flags_overrides.cmake")
 project(Z3 CXX)
 
+if ("${CMAKE_VERSION}" VERSION_LESS "3.4")
+  # FIXME: Drop this when we upgrade to newer CMake versions.
+  # HACK: Although we don't need C language support if it is not
+  # enabled CMake's `FindThreads` module fails in old CMake versions.
+  enable_language(C)
+endif()
+
 ################################################################################
 # Project version
 ################################################################################
@@ -102,7 +109,7 @@ if (EXISTS "${GIT_DIR}")
       endif()
       message(STATUS "Using Git hash in version output: ${Z3GITHASH}")
       # This mimics the behaviour of the old build system.
-      string(APPEND Z3_FULL_VERSION_STR " ${Z3GITHASH}")
+      set(Z3_FULL_VERSION_STR "${Z3_FULL_VERSION_STR} ${Z3GITHASH}")
     else()
       message(STATUS "Not using Git hash in version output")
       unset(Z3GITHASH) # Used in configure_file()
@@ -115,7 +122,7 @@ if (EXISTS "${GIT_DIR}")
       endif()
       message(STATUS "Using Git description in version output: ${Z3_GIT_DESCRIPTION}")
       # This mimics the behaviour of the old build system.
-      string(APPEND Z3_FULL_VERSION_STR " ${Z3_GIT_DESCRIPTION}")
+      set(Z3_FULL_VERSION_STR "${Z3_FULL_VERSION_STR} ${Z3_GIT_DESCRIPTION}")
     else()
       message(STATUS "Not including git descrption in version")
     endif()
@@ -517,10 +524,18 @@ add_subdirectory(src)
 # use Z3 via CMake.
 ################################################################################
 include(CMakePackageConfigHelpers)
-export(EXPORT Z3_EXPORTED_TARGETS
-  NAMESPACE z3::
-  FILE "${CMAKE_BINARY_DIR}/Z3Targets.cmake"
-)
+if ("${CMAKE_VERSION}" VERSION_LESS "3.0")
+  # FIXME: Remove this once we drop support for CMake 2.8.12
+  export(TARGETS libz3
+    NAMESPACE z3::
+    FILE "${CMAKE_BINARY_DIR}/Z3Targets.cmake"
+  )
+else()
+  export(EXPORT Z3_EXPORTED_TARGETS
+    NAMESPACE z3::
+    FILE "${CMAKE_BINARY_DIR}/Z3Targets.cmake"
+  )
+endif()
 set(Z3_FIRST_PACKAGE_INCLUDE_DIR "${CMAKE_BINARY_DIR}/src/api")
 set(Z3_SECOND_PACKAGE_INCLUDE_DIR "${CMAKE_SOURCE_DIR}/src/api")
 set(Z3_CXX_PACKAGE_INCLUDE_DIR "${CMAKE_SOURCE_DIR}/src/api/c++")
@@ -533,7 +548,6 @@ configure_package_config_file("${CMAKE_SOURCE_DIR}/cmake/Z3Config.cmake.in"
     Z3_FIRST_PACKAGE_INCLUDE_DIR
     Z3_SECOND_PACKAGE_INCLUDE_DIR
     Z3_CXX_PACKAGE_INCLUDE_DIR
-  INSTALL_PREFIX "${CMAKE_BINARY_DIR}"
 )
 unset(Z3_FIRST_PACKAGE_INCLUDE_DIR)
 unset(Z3_SECOND_PACKAGE_INCLUDE_DIR)
diff --git a/cmake/git_utils.cmake b/cmake/git_utils.cmake
index aa7f38825..f98aca205 100644
--- a/cmake/git_utils.cmake
+++ b/cmake/git_utils.cmake
@@ -99,7 +99,9 @@ function(get_git_head_hash GIT_DIR OUTPUT_VAR)
     message(FATAL_ERROR \""${GIT_DIR}\" is not an absolute path")
   endif()
   find_package(Git)
-  if (NOT Git_FOUND)
+  # NOTE: Use `GIT_FOUND` rather than `Git_FOUND` which was only
+  # available in CMake >= 3.5
+  if (NOT GIT_FOUND)
     set(${OUTPUT_VAR} "GIT-NOTFOUND" PARENT_SCOPE)
     return()
   endif()
@@ -146,7 +148,9 @@ function(get_git_head_describe GIT_DIR OUTPUT_VAR)
     message(FATAL_ERROR \""${GIT_DIR}\" is not an absolute path")
   endif()
   find_package(Git)
-  if (NOT Git_FOUND)
+  # NOTE: Use `GIT_FOUND` rather than `Git_FOUND` which was only
+  # available in CMake >= 3.5
+  if (NOT GIT_FOUND)
     set(${OUTPUT_VAR} "GIT-NOTFOUND" PARENT_SCOPE)
     return()
   endif()
diff --git a/cmake/z3_add_cxx_flag.cmake b/cmake/z3_add_cxx_flag.cmake
index 8bffd7de3..6e756d3b9 100644
--- a/cmake/z3_add_cxx_flag.cmake
+++ b/cmake/z3_add_cxx_flag.cmake
@@ -8,6 +8,7 @@ function(z3_add_cxx_flag flag)
   string(REPLACE "=" "_" SANITIZED_FLAG_NAME "${SANITIZED_FLAG_NAME}")
   string(REPLACE " " "_" SANITIZED_FLAG_NAME "${SANITIZED_FLAG_NAME}")
   string(REPLACE ":" "_" SANITIZED_FLAG_NAME "${SANITIZED_FLAG_NAME}")
+  string(REPLACE "+" "_" SANITIZED_FLAG_NAME "${SANITIZED_FLAG_NAME}")
   unset(HAS_${SANITIZED_FLAG_NAME})
   CHECK_CXX_COMPILER_FLAG("${flag}" HAS_${SANITIZED_FLAG_NAME})
   if (z3_add_flag_REQUIRED AND NOT HAS_${SANITIZED_FLAG_NAME})