File: PLUMED.cmake

package info (click to toggle)
lammps 20250204%2Bdfsg.1-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 474,368 kB
  • sloc: cpp: 1,060,070; python: 27,785; ansic: 8,956; f90: 7,254; sh: 6,044; perl: 4,171; fortran: 2,442; xml: 1,714; makefile: 1,352; objc: 238; lisp: 188; yacc: 58; csh: 16; awk: 14; tcl: 6; javascript: 2
file content (188 lines) | stat: -rw-r--r-- 9,462 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
# Plumed2 support for PLUMED package

# set policy to silence warnings about timestamps of downloaded files. review occasionally if it may be set to NEW
if(POLICY CMP0135)
  cmake_policy(SET CMP0135 OLD)
endif()

# for supporting multiple concurrent plumed2 installations for debugging and testing
set(PLUMED_SUFFIX "" CACHE STRING "Suffix for Plumed2 library")
mark_as_advanced(PLUMED_SUFFIX)

if(BUILD_MPI)
  set(PLUMED_CONFIG_MPI "--enable-mpi")
  set(PLUMED_CONFIG_CC  ${CMAKE_MPI_C_COMPILER})
  set(PLUMED_CONFIG_CXX  ${CMAKE_MPI_CXX_COMPILER})
  set(PLUMED_CONFIG_CPP "-I ${MPI_CXX_INCLUDE_PATH}")
  set(PLUMED_CONFIG_LIB "${MPI_CXX_LIBRARIES}")
  set(PLUMED_CONFIG_DEP "mpi4win_build")
else()
  set(PLUMED_CONFIG_MPI "--disable-mpi")
  set(PLUMED_CONFIG_CC  ${CMAKE_C_COMPILER})
  set(PLUMED_CONFIG_CXX  ${CMAKE_CXX_COMPILER})
  set(PLUMED_CONFIG_CPP "")
  set(PLUMED_CONFIG_LIB "")
  set(PLUMED_CONFIG_DEP "")
endif()
if(BUILD_OMP)
  set(PLUMED_CONFIG_OMP "--enable-openmp")
else()
  set(PLUMED_CONFIG_OMP "--disable-openmp")
endif()

# Note: must also adjust check for supported API versions in
# fix_plumed.cpp when version changes from v2.n.x to v2.n+1.y
set(PLUMED_URL "https://github.com/plumed/plumed2/releases/download/v2.9.3/plumed-src-2.9.3.tgz"
  CACHE STRING "URL for PLUMED tarball")
set(PLUMED_MD5 "ee1249805fe94bccee17d10610d3f6f1" CACHE STRING "MD5 checksum of PLUMED tarball")

mark_as_advanced(PLUMED_URL)
mark_as_advanced(PLUMED_MD5)
GetFallbackURL(PLUMED_URL PLUMED_FALLBACK)

if((CMAKE_SYSTEM_NAME STREQUAL "Windows") AND (CMAKE_CROSSCOMPILING))
  if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
    set(CROSS_CONFIGURE mingw64-configure)
  elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86")
    set(CROSS_CONFIGURE mingw32-configure)
  else()
    message(FATAL_ERROR "Unsupported target system: ${CMAKE_SYSTEM_NAME}/${CMAKE_SYSTEM_PROCESSOR}")
  endif()
  message(STATUS "Downloading and cross-compiling Plumed2 for ${CMAKE_SYSTEM_NAME}/${CMAKE_SYSTEM_PROCESSOR} with ${CROSS_CONFIGURE}")
  include(ExternalProject)
  ExternalProject_Add(plumed_build
    URL     ${PLUMED_URL} ${PLUMED_FALLBACK}
    URL_MD5 ${PLUMED_MD5}
    BUILD_IN_SOURCE 1
    CONFIGURE_COMMAND ${CROSS_CONFIGURE} --disable-shared --disable-bsymbolic
                                         --disable-python --enable-cxx=11
                                         --enable-modules=-adjmat:+crystallization:-dimred:+drr:+eds:-fisst:+funnel:+logmfd:+manyrestraints:+maze:+opes:+multicolvar:-pamm:-piv:+s2cm:-sasa:-ves
                                         ${PLUMED_CONFIG_OMP}
                                         ${PLUMED_CONFIG_MPI}
                                         CXX=${PLUMED_CONFIG_CXX}
                                         CC=${PLUMED_CONFIG_CC}
                                         CPPFLAGS=${PLUMED_CONFIG_CPP}
                                         LIBS=${PLUMED_CONFIG_LIB}
    INSTALL_COMMAND ""
    BUILD_BYPRODUCTS "<SOURCE_DIR>/src/lib/install/libplumed.a" "<SOURCE_DIR>/src/lib/install/plumed.exe"
    DEPENDS "${PLUMED_MPI_CONFIG_DEP}"
  )
  ExternalProject_Get_Property(plumed_build SOURCE_DIR)
  set(PLUMED_BUILD_DIR ${SOURCE_DIR})
  set(PLUMED_INSTALL_DIR ${PLUMED_BUILD_DIR}/src/lib/install)
  file(MAKE_DIRECTORY ${PLUMED_BUILD_DIR}/src/include)

  add_library(LAMMPS::PLUMED UNKNOWN IMPORTED)
  add_dependencies(LAMMPS::PLUMED plumed_build)
  set_target_properties(LAMMPS::PLUMED PROPERTIES
    IMPORTED_LOCATION "${PLUMED_INSTALL_DIR}/libplumed.a"
    INTERFACE_LINK_LIBRARIES "-Wl,--image-base -Wl,0x10000000 -lfftw3 -lz  -fstack-protector -lssp -fopenmp"
    INTERFACE_INCLUDE_DIRECTORIES "${PLUMED_BUILD_DIR}/src/include")

  add_custom_target(plumed_copy ALL ${CMAKE_COMMAND} -E rm -rf ${CMAKE_BINARY_DIR}/plumed.exe ${CMAKE_BINARY_DIR}/plumed_patches
    COMMAND ${CMAKE_COMMAND} -E copy ${PLUMED_INSTALL_DIR}/plumed.exe ${CMAKE_BINARY_DIR}/plumed.exe
    COMMAND ${CMAKE_COMMAND} -E copy_directory ${PLUMED_BUILD_DIR}/patches ${CMAKE_BINARY_DIR}/patches
    BYPRODUCTS ${CMAKE_BINARY_DIR}/plumed.exe ${CMAKE_BINARY_DIR}/patches
    DEPENDS plumed_build
    COMMENT "Copying Plumed files"
  )
  if(CMAKE_PROJECT_NAME STREQUAL "lammps")
    target_link_libraries(lammps INTERFACE LAMMPS::PLUMED)
  endif()

else()

  set(PLUMED_MODE "static" CACHE STRING "Linkage mode for Plumed2 library")
  set(PLUMED_MODE_VALUES static shared runtime)
  set_property(CACHE PLUMED_MODE PROPERTY STRINGS ${PLUMED_MODE_VALUES})
  validate_option(PLUMED_MODE PLUMED_MODE_VALUES)
  string(TOUPPER ${PLUMED_MODE} PLUMED_MODE)

  set(PLUMED_LINK_LIBS)
  if(PLUMED_MODE STREQUAL "STATIC")
    find_package(LAPACK REQUIRED)
    find_package(BLAS REQUIRED)
    find_package(GSL REQUIRED)
    list(APPEND PLUMED_LINK_LIBS ${LAPACK_LIBRARIES} ${BLAS_LIBRARIES} GSL::gsl)
    find_package(ZLIB QUIET)
    if(ZLIB_FOUND)
      list(APPEND PLUMED_LINK_LIBS ZLIB::ZLIB)
    endif()
    find_package(FFTW3 QUIET)
    if(FFTW3_FOUND)
      list(APPEND PLUMED_LINK_LIBS FFTW3::FFTW3)
    endif()
  endif()

  find_package(PkgConfig QUIET)
  set(DOWNLOAD_PLUMED_DEFAULT ON)
  if(PKG_CONFIG_FOUND)
    pkg_check_modules(PLUMED QUIET plumed)
    if(PLUMED_FOUND)
      set(DOWNLOAD_PLUMED_DEFAULT OFF)
    endif()
  endif()

  option(DOWNLOAD_PLUMED "Download Plumed package instead of using an already installed one" ${DOWNLOAD_PLUMED_DEFAULT})
  if(DOWNLOAD_PLUMED)
    message(STATUS "PLUMED download requested - we will build our own")
    if(PLUMED_MODE STREQUAL "STATIC")
      set(PLUMED_BUILD_BYPRODUCTS "<INSTALL_DIR>/lib/${CMAKE_STATIC_LIBRARY_PREFIX}plumed${CMAKE_STATIC_LIBRARY_SUFFIX}")
    elseif(PLUMED_MODE STREQUAL "SHARED")
      set(PLUMED_BUILD_BYPRODUCTS "<INSTALL_DIR>/lib/${CMAKE_SHARED_LIBRARY_PREFIX}plumed${CMAKE_SHARED_LIBRARY_SUFFIX};<INSTALL_DIR>/lib/${CMAKE_SHARED_LIBRARY_PREFIX}plumedKernel${CMAKE_SHARED_LIBRARY_SUFFIX}")
    elseif(PLUMED_MODE STREQUAL "RUNTIME")
      set(PLUMED_BUILD_BYPRODUCTS "<INSTALL_DIR>/lib/${CMAKE_STATIC_LIBRARY_PREFIX}plumedWrapper${CMAKE_STATIC_LIBRARY_PREFIX}")
    endif()

    include(ExternalProject)
    ExternalProject_Add(plumed_build
      URL     ${PLUMED_URL} ${PLUMED_FALLBACK}
      URL_MD5 ${PLUMED_MD5}
      BUILD_IN_SOURCE 1
      CONFIGURE_COMMAND <SOURCE_DIR>/configure --prefix=<INSTALL_DIR>
                                             ${CONFIGURE_REQUEST_PIC}
                                             --enable-modules=all
                                             --enable-cxx=11
                                             --disable-python
                                             ${PLUMED_CONFIG_MPI}
                                             ${PLUMED_CONFIG_OMP}
                                             CXX=${PLUMED_CONFIG_CXX}
                                             CC=${PLUMED_CONFIG_CC}
      BUILD_BYPRODUCTS ${PLUMED_BUILD_BYPRODUCTS}
    )
    ExternalProject_get_property(plumed_build INSTALL_DIR)
    add_library(LAMMPS::PLUMED UNKNOWN IMPORTED)
    add_dependencies(LAMMPS::PLUMED plumed_build)
    if(PLUMED_MODE STREQUAL "STATIC")
      set_target_properties(LAMMPS::PLUMED PROPERTIES IMPORTED_LOCATION ${INSTALL_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}plumed${CMAKE_STATIC_LIBRARY_SUFFIX} INTERFACE_LINK_LIBRARIES "${PLUMED_LINK_LIBS};${CMAKE_DL_LIBS}")
    elseif(PLUMED_MODE STREQUAL "SHARED")
      set_target_properties(LAMMPS::PLUMED PROPERTIES IMPORTED_LOCATION ${INSTALL_DIR}/lib/${CMAKE_SHARED_LIBRARY_PREFIX}plumed${CMAKE_SHARED_LIBRARY_SUFFIX} INTERFACE_LINK_LIBRARIES "${INSTALL_DIR}/lib/${CMAKE_SHARED_LIBRARY_PREFIX}plumedKernel${CMAKE_SHARED_LIBRARY_SUFFIX};${CMAKE_DL_LIBS}")
    elseif(PLUMED_MODE STREQUAL "RUNTIME")
      set_target_properties(LAMMPS::PLUMED PROPERTIES INTERFACE_COMPILE_DEFINITIONS "__PLUMED_DEFAULT_KERNEL=${INSTALL_DIR}/lib/${CMAKE_SHARED_LIBRARY_PREFIX}plumedKernel${CMAKE_SHARED_LIBRARY_SUFFIX}")
      set_target_properties(LAMMPS::PLUMED PROPERTIES IMPORTED_LOCATION ${INSTALL_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}plumedWrapper${CMAKE_STATIC_LIBRARY_SUFFIX} INTERFACE_LINK_LIBRARIES "${CMAKE_DL_LIBS}")
    endif()
    set_target_properties(LAMMPS::PLUMED PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${INSTALL_DIR}/include)
    file(MAKE_DIRECTORY ${INSTALL_DIR}/include)
    if(CMAKE_PROJECT_NAME STREQUAL "lammps")
      target_link_libraries(lammps PRIVATE LAMMPS::PLUMED)
    endif()
  else()
    find_package(PkgConfig REQUIRED)
    pkg_check_modules(PLUMED REQUIRED plumed${PLUMED_SUFFIX})
    add_library(LAMMPS::PLUMED INTERFACE IMPORTED)
    if(PLUMED_MODE STREQUAL "STATIC")
      include(${PLUMED_LIBDIR}/plumed${PLUMED_SUFFIX}/src/lib/Plumed.cmake.static)
    elseif(PLUMED_MODE STREQUAL "SHARED")
      include(${PLUMED_LIBDIR}/plumed${PLUMED_SUFFIX}/src/lib/Plumed.cmake.shared)
    elseif(PLUMED_MODE STREQUAL "RUNTIME")
      set_target_properties(LAMMPS::PLUMED PROPERTIES INTERFACE_COMPILE_DEFINITIONS "__PLUMED_DEFAULT_KERNEL=${PLUMED_LIBDIR}/${CMAKE_SHARED_LIBRARY_PREFIX}plumed${PLUMED_SUFFIX}Kernel${CMAKE_SHARED_LIBRARY_SUFFIX}")
      include(${PLUMED_LIBDIR}/plumed${PLUMED_SUFFIX}/src/lib/Plumed.cmake.runtime)
    endif()
    set_target_properties(LAMMPS::PLUMED PROPERTIES INTERFACE_LINK_LIBRARIES "${PLUMED_LOAD}")
    set_target_properties(LAMMPS::PLUMED PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${PLUMED_INCLUDE_DIRS}")
    if(CMAKE_PROJECT_NAME STREQUAL "lammps")
      target_link_libraries(lammps PUBLIC LAMMPS::PLUMED)
    endif()
  endif()
endif()