From 0b23449442ad0b0c1cc827bcb90d698f00292be3 Mon Sep 17 00:00:00 2001 From: Teemu Murtola Date: Sun, 4 Aug 2013 06:55:20 +0300 Subject: [PATCH] Fix/improve installation directory logic. 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 | 16 +++++++---- scripts/GMXRC.bash.cmakein | 13 +++++---- scripts/GMXRC.cmakein | 22 ++------------- scripts/GMXRC.csh.cmakein | 11 ++++---- scripts/GMXRC.zsh.cmakein | 2 +- share/template/cmake/FindGROMACS.cmakein | 6 ++-- src/config.h.cmakein | 5 +++- src/gromacs/gmxlib/futil.cpp | 35 ++++++++---------------- src/gromacs/gmxpreprocess/fflibutil.cpp | 4 +-- src/gromacs/legacyheaders/futil.h | 2 +- src/gromacs/libgromacs.pc.cmakein | 4 +-- 11 files changed, 51 insertions(+), 69 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0888dd3c29..5693688b24 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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 diff --git a/scripts/GMXRC.bash.cmakein b/scripts/GMXRC.bash.cmakein index 9fa0960575..3bd1674d6d 100644 --- a/scripts/GMXRC.bash.cmakein +++ b/scripts/GMXRC.bash.cmakein @@ -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} diff --git a/scripts/GMXRC.cmakein b/scripts/GMXRC.cmakein index bc5f737fba..de92be9ab0 100644 --- a/scripts/GMXRC.cmakein +++ b/scripts/GMXRC.cmakein @@ -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 diff --git a/scripts/GMXRC.csh.cmakein b/scripts/GMXRC.csh.cmakein index 328e0976b0..47cfd69ac8 100644 --- a/scripts/GMXRC.csh.cmakein +++ b/scripts/GMXRC.csh.cmakein @@ -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}" diff --git a/scripts/GMXRC.zsh.cmakein b/scripts/GMXRC.zsh.cmakein index 29278ce441..97287547ea 100644 --- a/scripts/GMXRC.zsh.cmakein +++ b/scripts/GMXRC.zsh.cmakein @@ -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 diff --git a/share/template/cmake/FindGROMACS.cmakein b/share/template/cmake/FindGROMACS.cmakein index c0796a29cd..2000a038c3 100644 --- a/share/template/cmake/FindGROMACS.cmakein +++ b/share/template/cmake/FindGROMACS.cmakein @@ -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) diff --git a/src/config.h.cmakein b/src/config.h.cmakein index 3bf56ecc9e..2a640f350e 100644 --- a/src/config.h.cmakein +++ b/src/config.h.cmakein @@ -32,7 +32,10 @@ #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@" diff --git a/src/gromacs/gmxlib/futil.cpp b/src/gromacs/gmxlib/futil.cpp index c1303f43ad..a1fb7aa930 100644 --- a/src/gromacs/gmxlib/futil.cpp +++ b/src/gromacs/gmxlib/futil.cpp @@ -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; diff --git a/src/gromacs/gmxpreprocess/fflibutil.cpp b/src/gromacs/gmxpreprocess/fflibutil.cpp index e38ecbb533..2b8a7088e3 100644 --- a/src/gromacs/gmxpreprocess/fflibutil.cpp +++ b/src/gromacs/gmxpreprocess/fflibutil.cpp @@ -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; diff --git a/src/gromacs/legacyheaders/futil.h b/src/gromacs/legacyheaders/futil.h index fe0e85dde6..23fe9946b8 100644 --- a/src/gromacs/legacyheaders/futil.h +++ b/src/gromacs/legacyheaders/futil.h @@ -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); diff --git a/src/gromacs/libgromacs.pc.cmakein b/src/gromacs/libgromacs.pc.cmakein index b36896a0e7..082e07f8db 100644 --- a/src/gromacs/libgromacs.pc.cmakein +++ b/src/gromacs/libgromacs.pc.cmakein @@ -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 -- 2.22.0