Added pkg-config detection of libcp2k #3172
authorDmitry Morozov <aracsmd@gmail.com>
Thu, 21 Oct 2021 18:55:47 +0000 (18:55 +0000)
committerMark Abraham <mark.j.abraham@gmail.com>
Thu, 21 Oct 2021 18:55:47 +0000 (18:55 +0000)
cmake/gmxManageCP2K.cmake

index d23ca3392e1c8a3a1f53c9287d15644bbdfe23a4..a2b8c608e7ad3b614efacd5a184a9337a6ad5062 100644 (file)
 
 if(GMX_CP2K)
     
 
 if(GMX_CP2K)
     
-    # Check that all necessary CMake flags are present 
+    # CMake flags for CP2K linking 
     set(CP2K_DIR "" CACHE STRING "Path to the directory with libcp2k.a library")
     set(CP2K_LINKER_FLAGS "" CACHE STRING "List of flags and libraries required for linking libcp2k. Typically this should be combination of LDFLAGS and LIBS variables from ARCH file used to compile CP2K")
     set(CP2K_DIR "" CACHE STRING "Path to the directory with libcp2k.a library")
     set(CP2K_LINKER_FLAGS "" CACHE STRING "List of flags and libraries required for linking libcp2k. Typically this should be combination of LDFLAGS and LIBS variables from ARCH file used to compile CP2K")
-    if ((CP2K_DIR STREQUAL "") OR (CP2K_LINKER_FLAGS STREQUAL ""))
-        message(FATAL_ERROR "To build GROMACS with CP2K Interface both CP2K_DIR and CP2K_LINKER_FLAGS should be defined")
+
+    # Check is CP2K_DIR present (this flags is required)
+    if (NOT CP2K_DIR)
+        message(FATAL_ERROR "To build GROMACS with CP2K Interface CP2K_DIR should be defined")
     endif()
 
     endif()
 
-    # Add directory with libcp2k.h into system include directories
-    include_directories(SYSTEM "${CP2K_DIR}/../../../src/start")
+    # if CP2K_LINKER_FLAGS defined then it should be used for linking instead pkg-config
+    if (CP2K_LINKER_FLAGS)
+        message(STATUS "CP2K_LINKER_FLAGS will be used to link libcp2k")
+
+        # Add directory with libcp2k.h into system include directories
+        include_directories(SYSTEM "${CP2K_DIR}/../../../src/start")
+
+        # Add libcp2k and DBCSR for linking 
+        set(CMAKE_CXX_STANDARD_LIBRARIES "${CMAKE_CXX_STANDARD_LIBRARIES} -Wl,--allow-multiple-definition -L${CP2K_DIR} -lcp2k -L${CP2K_DIR}/exts/dbcsr -ldbcsr")
 
 
-    # Add libcp2k and DBCSR for linking 
-    set(CMAKE_CXX_STANDARD_LIBRARIES "${CMAKE_CXX_STANDARD_LIBRARIES} -Wl,--allow-multiple-definition -L${CP2K_DIR} -lcp2k -L${CP2K_DIR}/exts/dbcsr -ldbcsr")
+        # Add User provided libraries
+        set(CMAKE_CXX_STANDARD_LIBRARIES "${CMAKE_CXX_STANDARD_LIBRARIES} ${CP2K_LINKER_FLAGS}")
+    else()
+        # In other case pkg-config should be used to search for libcp2k
+        find_package(PkgConfig QUIET)
+
+        # if pkg-config not found then ask user to provide CP2K_LINKER_FLAGS
+        if(NOT PKG_CONFIG_FOUND)
+            message(FATAL_ERROR "pkg-config not found, define CP2K_LINKER_FLAGS for custom linking of libcp2k")
+        endif()
 
 
-    # Add User provided libraries
-    set(CMAKE_CXX_STANDARD_LIBRARIES "${CMAKE_CXX_STANDARD_LIBRARIES} ${CP2K_LINKER_FLAGS}")
+        # Append PKG_CONFIG_PATH_PATH with ${CP2K_DIR}/pkgconfig which should contain libcp2k.pc
+        set(ENV{PKG_CONFIG_PATH} "$ENV{PKG_CONFIG_PATH}:${CP2K_DIR}/pkgconfig")
+        # Search for libcp2k
+        pkg_check_modules(LIBCP2K QUIET libcp2k)
 
 
+        # if libcp2k not found then ask user to provide CP2K_LINKER_FLAGS
+        if(NOT LIBCP2K_FOUND)
+            message(FATAL_ERROR "pkg-config could not find libcp2k, define CP2K_LINKER_FLAGS for custom linking of libcp2k")
+        endif()
+
+        # libcp2k found: add libraries and paths to the respecting GROMACS variables
+        message(STATUS "Found libcp2k in ${LIBCP2K_LIBDIR}")
+        include_directories(SYSTEM "${LIBCP2K_INCLUDE_DIRS}")
+        link_directories(${LIBCP2K_LIBRARY_DIRS})
+        list(APPEND GMX_COMMON_LIBRARIES ${LIBCP2K_LIBRARIES})
+    endif()
     # If we use GNU compilers then also libgfortran should be linked
     if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
     # If we use GNU compilers then also libgfortran should be linked
     if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
-        set(CMAKE_CXX_STANDARD_LIBRARIES "${CMAKE_CXX_STANDARD_LIBRARIES} -lgfortran")
+        list(APPEND GMX_COMMON_LIBRARIES "gfortran")
     endif()
 
     # If we use external MPI then Fortran MPI library should be linked
     endif()
 
     # If we use external MPI then Fortran MPI library should be linked
@@ -66,4 +98,3 @@ if(GMX_CP2K)
     endif()
 
 endif()
     endif()
 
 endif()
-