Fix/improve installation directory logic.
authorTeemu Murtola <teemu.murtola@gmail.com>
Sun, 4 Aug 2013 03:55:20 +0000 (06:55 +0300)
committerGerrit Code Review <gerrit@gerrit.gromacs.org>
Tue, 15 Oct 2013 14:59:34 +0000 (16:59 +0200)
With the move to relative install paths (recommended by CMake), logic
that relied on the *_INSTALL_DIR variables for something else than
locations for the CMake install() command got broken.  Explicitly added
CMAKE_INSTALL_PREFIX there.

Also improve the approach for customizing the installation directories:
 - GMXLIB is now GMX_LIB_INSTALL_DIR, and a proper cache variable.
 - Added a GMX_DATA_INSTALL_DIR to customize the directory under which
   the data files get installed under share/.  Use this also in the code
   that searches for the data directory instead of hardcoding several
   guesses.

Related, moved the logic of falling back to a hard-coded library
directory into get_libdir(); it was duplicated in two places.

Resolves part of #1271: creating a binary package with CPack and
installing it somewhere else than in the CMAKE_INSTALL_PREFIX
used to create it still breaks all the logic touched here.  Also using
DESTDIR with 'make install' breaks it (but that has never worked).

Change-Id: I0271a8152f87dd59a229c9d0eca976404f974ea8

CMakeLists.txt
scripts/GMXRC.bash.cmakein
scripts/GMXRC.cmakein
scripts/GMXRC.csh.cmakein
scripts/GMXRC.zsh.cmakein
share/template/cmake/FindGROMACS.cmakein
src/config.h.cmakein
src/gromacs/gmxlib/futil.cpp
src/gromacs/gmxpreprocess/fflibutil.cpp
src/gromacs/legacyheaders/futil.h
src/gromacs/libgromacs.pc.cmakein

index 0888dd3c292aaa28364b80384840ed71cc486e49..5693688b246ccee0030b23b7f6c7aa79bbb8dd38 100644 (file)
@@ -1132,16 +1132,20 @@ endif(GMX_GPU)
 ########################################################################
 # Specify install locations
 ########################################################################
-if ( NOT DEFINED GMXLIB )
-    set(GMXLIB lib)
-endif()
-set(LIB_INSTALL_DIR "${GMX_INSTALL_PREFIX}${GMXLIB}")
+set(GMX_LIB_INSTALL_DIR lib CACHE STRING
+    "Library installation directory (default: lib)")
+set(GMX_DATA_INSTALL_DIR gromacs CACHE STRING
+    "Data installation directory under share/ (default: gromacs)")
+mark_as_advanced(GMX_LIB_INSTALL_DIR GMX_DATA_INSTALL_DIR)
+
+set(LIB_INSTALL_DIR  ${GMX_INSTALL_PREFIX}${GMX_LIB_INSTALL_DIR})
 set(BIN_INSTALL_DIR  ${GMX_INSTALL_PREFIX}bin)
-set(DATA_INSTALL_DIR ${GMX_INSTALL_PREFIX}share/gromacs)
+set(DATA_INSTALL_DIR ${GMX_INSTALL_PREFIX}share/${GMX_DATA_INSTALL_DIR})
 set(MAN_INSTALL_DIR  ${GMX_INSTALL_PREFIX}share/man)
 set(INCL_INSTALL_DIR ${GMX_INSTALL_PREFIX}include)
 
-set(GMXLIBDIR        ${DATA_INSTALL_DIR}/top)
+set(GMXLIB_SEARCH_DIR share/${GMX_DATA_INSTALL_DIR}/top)
+set(GMXLIB_FALLBACK   ${CMAKE_INSTALL_PREFIX}/${DATA_INSTALL_DIR}/top)
 
 ########################################################################
 # Set up binary and library suffixing
index 9fa09605756d270ed18c0c1c58325a91e10bb63b..3bd1674d6d389cbf27a470982e17cf550392014b 100644 (file)
@@ -48,13 +48,14 @@ MANPATH=$tmppath
 ##########################################################
 # This is the real configuration part. We save the Gromacs
 # things in separate vars, so we can remove them later.
-# If you move gromacs, change the next four line.
+# If you move gromacs, change the first line.
 ##########################################################
-GMXBIN=@BIN_INSTALL_DIR@
-GMXLDLIB=@LIB_INSTALL_DIR@
-GMXMAN=@MAN_INSTALL_DIR@
-GMXDATA=@DATA_INSTALL_DIR@
-       
+GMXPREFIX=@CMAKE_INSTALL_PREFIX@
+GMXBIN=${GMXPREFIX}/@BIN_INSTALL_DIR@
+GMXLDLIB=${GMXPREFIX}/@LIB_INSTALL_DIR@
+GMXMAN=${GMXPREFIX}/@MAN_INSTALL_DIR@
+GMXDATA=${GMXPREFIX}/@DATA_INSTALL_DIR@
+
 LD_LIBRARY_PATH=${GMXLDLIB}${LD_LIBRARY_PATH:+:}${LD_LIBRARY_PATH}
 PKG_CONFIG_PATH=${GMXLDLIB}/pkgconfig${PKG_CONFIG_PATH:+:}${PKG_CONFIG_PATH}
 PATH=${GMXBIN}${PATH:+:}${PATH}
index bc5f737fba02a62c080b97ccee65776302071f56..de92be9ab031105e398e4c42533c483ddf13840d 100644 (file)
@@ -9,27 +9,9 @@
 test $shell && goto CSH
 
 # if we got here, shell is bsh/bash/zsh/ksh
-. @BIN_INSTALL_DIR@/GMXRC.bash
+. @CMAKE_INSTALL_PREFIX@/@BIN_INSTALL_DIR@/GMXRC.bash
 return
 
 # csh/tcsh jump here
 CSH:
-source @BIN_INSTALL_DIR@/GMXRC.csh
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+source @CMAKE_INSTALL_PREFIX@/@BIN_INSTALL_DIR@/GMXRC.csh
index 328e0976b0967eb3bbdae4cda01d7152f54208eb..47cfd69ac8b559329ca61edad72cef27a53c0117 100644 (file)
@@ -68,12 +68,13 @@ setenv MANPATH $tmppath
 ##########################################################
 # This is the real configuration part. We save the Gromacs
 # things in separate vars, so we can remove them later.
-# If you move gromacs, change the next four line.
+# If you move gromacs, change the first line.
 ##########################################################
-setenv GMXBIN @BIN_INSTALL_DIR@
-setenv GMXLDLIB @LIB_INSTALL_DIR@
-setenv GMXMAN @MAN_INSTALL_DIR@
-setenv GMXDATA @DATA_INSTALL_DIR@
+setenv GMXPREFIX @CMAKE_INSTALL_PREFIX@
+setenv GMXBIN ${GMXPREFIX}/@BIN_INSTALL_DIR@
+setenv GMXLDLIB ${GMXPREFIX}/@LIB_INSTALL_DIR@
+setenv GMXMAN ${GMXPREFIX}/@MAN_INSTALL_DIR@
+setenv GMXDATA ${GMXPREFIX}/@DATA_INSTALL_DIR@
 
 #make them begin with :
 if ($?LD_LIBRARY_PATH) setenv LD_LIBRARY_PATH ":${LD_LIBRARY_PATH}"
index 29278ce441412068cd6fa157ad65f9ee8ce74b44..97287547eafc45916006eff57c7bf959dbbb00e5 100644 (file)
@@ -1,3 +1,3 @@
 # zsh configuration file for Gromacs
 # only kept for backwards compatibility
-source @BIN_INSTALL_DIR@/GMXRC.bash 
+source @CMAKE_INSTALL_PREFIX@/@BIN_INSTALL_DIR@/GMXRC.bash
index c0796a29cd6ca06f53a81bfdb72e8629ede952b4..2000a038c31d7a6d54aa48b95ec8890d46d2ee2e 100644 (file)
@@ -82,13 +82,15 @@ if (PC_GROMACS_CFLAGS_OTHER)
 endif (PC_GROMACS_CFLAGS_OTHER)
 set(GROMACS_DEFINITIONS "${GMX_DEFS}" CACHE STRING "extra GROMACS definitions")
 
-find_library(GROMACS_LIBRARY NAMES ${GROMACS_LIBRARY_NAME} HINTS ${PC_GROMACS_LIBRARY_DIRS} @LIB_INSTALL_DIR@)
+find_library(GROMACS_LIBRARY NAMES ${GROMACS_LIBRARY_NAME}
+             HINTS ${PC_GROMACS_LIBRARY_DIRS} @CMAKE_INSTALL_PREFIX@/@LIB_INSTALL_DIR@)
 if (GROMACS_LIBRARY)
   if("${GROMACS_LIBRARY}" MATCHES "lib(gmx|gromacs)[^;]*\\.a")
     if(PC_GROMACS_LIBRARIES)
       list(REMOVE_ITEM PC_GROMACS_LIBRARIES ${GROMACS_LIBRARY_NAME})
       foreach (LIB ${PC_GROMACS_LIBRARIES})
-        find_library(GROMACS_${LIB} NAMES ${LIB} HINTS ${PC_GROMACS_LIBRARY_DIRS} @INCL_INSTALL_DIR@)
+        find_library(GROMACS_${LIB} NAMES ${LIB}
+                     HINTS ${PC_GROMACS_LIBRARY_DIRS} @CMAKE_INSTALL_PREFIX@/@INCL_INSTALL_DIR@)
         list(APPEND GMX_DEP_LIBRARIES ${GROMACS_${LIB}})
         unset(GROMACS_${LIB} CACHE)
       endforeach(LIB)
index 3bf56ecc9e721d0273baa28601bf88f9f776c7f5..2a640f350e7e26c403994d1e5f94aa624dcabde3 100644 (file)
 #cmakedefine GMX_GIT_VERSION_INFO
 
 /* Default location of data files */
-#define GMXLIBDIR "@GMXLIBDIR@"
+#define GMXLIB_SEARCH_DIR "@GMXLIB_SEARCH_DIR@"
+
+/* Default location of data files */
+#define GMXLIB_FALLBACK "@GMXLIB_FALLBACK@"
 
 /* Binary suffix for the created binaries */
 #define GMX_BINARY_SUFFIX "@GMX_BINARY_SUFFIX@"
index c1303f43adad3a3d5273bf4dc10a807a9ddf08e3..a1fb7aa930093b99bb233a324b5bf7092a3dd6f1 100644 (file)
@@ -799,23 +799,8 @@ static gmx_bool search_subdirs(const char *parent, char *libdir)
     found = gmx_fexist(libdir);
     if (!found)
     {
-        sprintf(libdir, "%s%cshare%cgromacs%ctop%cgurgle.dat", parent,
-                DIR_SEPARATOR, DIR_SEPARATOR,
-                DIR_SEPARATOR, DIR_SEPARATOR);
-        found = gmx_fexist(libdir);
-    }
-    if (!found)
-    {
-        sprintf(libdir, "%s%cshare%cgromacs-%s%ctop%cgurgle.dat", parent,
-                DIR_SEPARATOR, DIR_SEPARATOR, VERSION,
-                DIR_SEPARATOR, DIR_SEPARATOR);
-        found = gmx_fexist(libdir);
-    }
-    if (!found)
-    {
-        sprintf(libdir, "%s%cshare%cgromacs%cgromacs-%s%ctop%cgurgle.dat", parent,
-                DIR_SEPARATOR, DIR_SEPARATOR, DIR_SEPARATOR,
-                VERSION, DIR_SEPARATOR, DIR_SEPARATOR);
+        sprintf(libdir, "%s%c%s%cgurgle.dat", parent,
+                DIR_SEPARATOR, GMXLIB_SEARCH_DIR, DIR_SEPARATOR);
         found = gmx_fexist(libdir);
     }
 
@@ -842,7 +827,7 @@ static gmx_bool filename_is_absolute(char *name)
 #endif
 }
 
-gmx_bool get_libdir(char *libdir)
+void get_libdir(char *libdir)
 {
 #define GMX_BINNAME_MAX 512
     char     bin_name[GMX_BINNAME_MAX];
@@ -899,7 +884,8 @@ gmx_bool get_libdir(char *libdir)
                 }
                 if (!found)
                 {
-                    return FALSE;
+                    strcpy(libdir, GMXLIB_FALLBACK);
+                    return;
                 }
             }
             else if (!filename_is_absolute(bin_name))
@@ -943,7 +929,7 @@ gmx_bool get_libdir(char *libdir)
             {
                 if (search_subdirs(CMAKE_SOURCE_DIR, libdir))
                 {
-                    return TRUE;
+                    return;
                 }
             }
 #endif
@@ -980,7 +966,10 @@ gmx_bool get_libdir(char *libdir)
         found = search_subdirs("/opt", libdir);
     }
 #endif
-    return found;
+    if (!found)
+    {
+        strcpy(libdir, GMXLIB_FALLBACK);
+    }
 }
 
 
@@ -1000,9 +989,9 @@ char *low_gmxlibfn(const char *file, gmx_bool bAddCWD, gmx_bool bFatal)
         env_is_set = TRUE;
         strncpy(libpath, lib, GMX_PATH_MAX);
     }
-    else if (!get_libdir(libpath))
+    else
     {
-        strncpy(libpath, GMXLIBDIR, GMX_PATH_MAX);
+        get_libdir(libpath);
     }
 
     ret = NULL;
index e38ecbb533425aa2104cf7d030b83bb72da54bb6..2b8a7088e310c19cbba7bb9f5a567247aa13b9cd 100644 (file)
@@ -176,9 +176,9 @@ static int low_fflib_search_file_end(const char *ffdir,
             env_is_set = TRUE;
             strncat(libpath, lib, GMX_PATH_MAX);
         }
-        else if (!get_libdir(libpath+strlen(libpath)))
+        else
         {
-            strncat(libpath, GMXLIBDIR, GMX_PATH_MAX);
+            get_libdir(libpath + strlen(libpath));
         }
     }
     s         = libpath;
index fe0e85dde6d6ff92589a18d900522108e20ca51a..23fe9946b8ae83f08ea7b27066ac3d6c1ea2edd2 100644 (file)
@@ -166,7 +166,7 @@ gmx_directory_close(gmx_directory_t gmxdir);
 
 
 
-gmx_bool get_libdir(char *libdir);
+void get_libdir(char *libdir);
 
 char *low_gmxlibfn(const char *file, gmx_bool bAddCWD, gmx_bool bFatal);
 
index b36896a0e7cbc795fc4997d3264e0abfd51e6997..082e07f8db4788b20a0051695c01244780587d58 100644 (file)
@@ -1,5 +1,5 @@
-libdir=@LIB_INSTALL_DIR@
-includedir=@INCL_INSTALL_DIR@
+libdir=@CMAKE_INSTALL_PREFIX@/@LIB_INSTALL_DIR@
+includedir=@CMAKE_INSTALL_PREFIX@/@INCL_INSTALL_DIR@
 
 Name: libgromacs@GMX_LIBS_SUFFIX@
 Description: Gromacs library