COMP: Prevent insource builds and inbuild installs
authorHans Johnson <hans-johnson@uiowa.edu>
Wed, 27 Jul 2016 12:53:36 +0000 (07:53 -0500)
committerHans Johnson <hans-johnson@uiowa.edu>
Thu, 28 Jul 2016 13:56:44 +0000 (08:56 -0500)
With cmake is best to require out-of-source builds,
and to avoid intalling into the same directory as the
build was performed.

Both of these situations can cause very confusing situations
that can frustrate new users of the software package, so
check for and provide guidance to the end-users.

These files were initially contributed to the ITK
(www.itk.org) project and have been widely re-used
by many other projects.

NOTE: This patch is dependant on pull request #16

CMAKE/PreventInBuildInstalls.cmake [new file with mode: 0644]
CMAKE/PreventInSourceBuilds.cmake [new file with mode: 0644]
CMakeLists.txt

diff --git a/CMAKE/PreventInBuildInstalls.cmake b/CMAKE/PreventInBuildInstalls.cmake
new file mode 100644 (file)
index 0000000..accfea6
--- /dev/null
@@ -0,0 +1,9 @@
+string(TOLOWER "${CMAKE_INSTALL_PREFIX}" _PREFIX)
+string(TOLOWER "${ITK_BINARY_DIR}" _BUILD)
+if("${_PREFIX}" STREQUAL "${_BUILD}")
+  message(FATAL_ERROR
+    "The current CMAKE_INSTALL_PREFIX points at the build tree:\n"
+    "  ${CMAKE_INSTALL_PREFIX}\n"
+    "This is not supported."
+    )
+endif()
diff --git a/CMAKE/PreventInSourceBuilds.cmake b/CMAKE/PreventInSourceBuilds.cmake
new file mode 100644 (file)
index 0000000..8101aa6
--- /dev/null
@@ -0,0 +1,45 @@
+#
+# This function will prevent in-source builds
+function(AssureOutOfSourceBuilds)
+  # make sure the user doesn't play dirty with symlinks
+  get_filename_component(srcdir "${CMAKE_SOURCE_DIR}" REALPATH)
+  get_filename_component(bindir "${CMAKE_BINARY_DIR}" REALPATH)
+
+  # disallow in-source builds
+  if("${srcdir}" STREQUAL "${bindir}")
+    message("######################################################")
+    message("# lapack should not be configured & built in the lapack source directory")
+    message("# You must run cmake in a build directory.")
+    message("# For example:")
+    message("# mkdir lapack-Sandbox ; cd lapack-sandbox")
+    message("# git clone https://github.com/Reference-LAPACK/lapack.git # or download & unpack the source tarball")
+    message("# mkdir lapack-build")
+    message("# this will create the following directory structure")
+    message("#")
+    message("# lapack-Sandbox")
+    message("#  +--lapack")
+    message("#  +--lapack-build")
+    message("#")
+    message("# Then you can proceed to configure and build")
+    message("# by using the following commands")
+    message("#")
+    message("# cd lapack-build")
+    message("# cmake ../lapack # or ccmake, or cmake-gui ")
+    message("# make")
+    message("#")
+    message("# NOTE: Given that you already tried to make an in-source build")
+    message("#       CMake have already created several files & directories")
+    message("#       in your source tree. run 'git status' to find them and")
+    message("#       remove them by doing:")
+    message("#")
+    message("#       cd lapack-Sandbox/lapack")
+    message("#       git clean -n -d")
+    message("#       git clean -f -d")
+    message("#       git checkout --")
+    message("#")
+    message("######################################################")
+    message(FATAL_ERROR "Quitting configuration")
+  endif()
+endfunction()
+
+AssureOutOfSourceBuilds()
index 0f23553..ae2bd2d 100644 (file)
@@ -42,6 +42,8 @@ configure_file(
 
 # Add the CMake directory for custon CMake modules
 set(CMAKE_MODULE_PATH "${LAPACK_SOURCE_DIR}/CMAKE" ${CMAKE_MODULE_PATH})
+include(PreventInSourceBuilds)
+include(PreventInBuildInstalls)
 
 if (UNIX)
    if ( "${CMAKE_Fortran_COMPILER}" MATCHES "ifort" )