Merge branch release-2021
[alexxy/gromacs.git] / src / gromacs / CMakeLists.txt
1 #
2 # This file is part of the GROMACS molecular simulation package.
3 #
4 # Copyright (c) 2010,2011,2012,2013,2014 by the GROMACS development team.
5 # Copyright (c) 2015,2016,2017,2018,2019,2020,2021, by the GROMACS development team, led by
6 # Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
7 # and including many others, as listed in the AUTHORS file in the
8 # top-level source directory and at http://www.gromacs.org.
9 #
10 # GROMACS is free software; you can redistribute it and/or
11 # modify it under the terms of the GNU Lesser General Public License
12 # as published by the Free Software Foundation; either version 2.1
13 # of the License, or (at your option) any later version.
14 #
15 # GROMACS is distributed in the hope that it will be useful,
16 # but WITHOUT ANY WARRANTY; without even the implied warranty of
17 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18 # Lesser General Public License for more details.
19 #
20 # You should have received a copy of the GNU Lesser General Public
21 # License along with GROMACS; if not, see
22 # http://www.gnu.org/licenses, or write to the Free Software Foundation,
23 # Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA.
24 #
25 # If you want to redistribute modifications to GROMACS, please
26 # consider that scientific software is very special. Version
27 # control is crucial - bugs must be traceable. We will be happy to
28 # consider code for inclusion in the official distribution, but
29 # derived work must not be called official GROMACS. Details are found
30 # in the README & COPYING files - if they are missing, get the
31 # official version at http://www.gromacs.org.
32 #
33 # To help us fund GROMACS development, we humbly ask that you cite
34 # the research papers on the package. Check out http://www.gromacs.org.
35
36 set(LIBGROMACS_SOURCES)
37
38 if (GMX_CLANG_CUDA)
39     include(gmxClangCudaUtils)
40 endif()
41
42 set_property(GLOBAL PROPERTY GMX_LIBGROMACS_SOURCES)
43 set_property(GLOBAL PROPERTY CUDA_SOURCES)
44 set_property(GLOBAL PROPERTY GMX_INSTALLED_HEADERS)
45 set_property(GLOBAL PROPERTY GMX_AVX_512_SOURCE)
46
47 set(libgromacs_object_library_dependencies "")
48 function (_gmx_add_files_to_property PROPERTY)
49     foreach (_file ${ARGN})
50         if (IS_ABSOLUTE "${_file}")
51             set_property(GLOBAL APPEND PROPERTY ${PROPERTY} ${_file})
52         else()
53             set_property(GLOBAL APPEND PROPERTY ${PROPERTY}
54                          ${CMAKE_CURRENT_LIST_DIR}/${_file})
55         endif()
56     endforeach()
57 endfunction ()
58
59 function (gmx_add_libgromacs_sources)
60     _gmx_add_files_to_property(GMX_LIBGROMACS_SOURCES ${ARGN})
61 endfunction ()
62
63 # Permit the configuration to disable compiling the many nbnxm kernels
64 # and others involved in force calculations. Currently only
65 # short-ranged and bonded kernels are disabled this way, but in future
66 # others may be appropriate. Thus the cmake option is not specific to
67 # nbnxm module.
68 option(GMX_USE_SIMD_KERNELS "Whether to compile NBNXM and other SIMD kernels" ON)
69 mark_as_advanced(GMX_USE_SIMD_KERNELS)
70
71 # Add these contents first because linking their tests can take a lot
72 # of time, so we want lots of parallel work still available after
73 # linking starts.
74 add_subdirectory(utility)
75 # Add normal contents
76 add_subdirectory(gmxlib)
77 add_subdirectory(mdlib)
78 add_subdirectory(applied_forces)
79 add_subdirectory(listed_forces)
80 add_subdirectory(nbnxm)
81 add_subdirectory(commandline)
82 add_subdirectory(domdec)
83 add_subdirectory(ewald)
84 add_subdirectory(fft)
85 add_subdirectory(gpu_utils)
86 add_subdirectory(hardware)
87 add_subdirectory(linearalgebra)
88 add_subdirectory(math)
89 add_subdirectory(mdrun)
90 add_subdirectory(mdrunutility)
91 add_subdirectory(mdspan)
92 add_subdirectory(mdtypes)
93 add_subdirectory(onlinehelp)
94 add_subdirectory(options)
95 add_subdirectory(pbcutil)
96 add_subdirectory(random)
97 add_subdirectory(restraint)
98 add_subdirectory(tables)
99 add_subdirectory(taskassignment)
100 add_subdirectory(timing)
101 add_subdirectory(topology)
102 add_subdirectory(trajectory)
103 add_subdirectory(swap)
104 add_subdirectory(essentialdynamics)
105 add_subdirectory(pulling)
106 add_subdirectory(simd)
107 add_subdirectory(imd)
108 add_subdirectory(compat)
109 add_subdirectory(mimic)
110 add_subdirectory(modularsimulator)
111 add_subdirectory(gmxana)
112 add_subdirectory(gmxpreprocess)
113 add_subdirectory(correlationfunctions)
114 add_subdirectory(statistics)
115 add_subdirectory(analysisdata)
116 add_subdirectory(coordinateio)
117 add_subdirectory(trajectoryanalysis)
118 add_subdirectory(energyanalysis)
119 add_subdirectory(tools)
120
121 get_property(PROPERTY_SOURCES GLOBAL PROPERTY GMX_LIBGROMACS_SOURCES)
122 list(APPEND LIBGROMACS_SOURCES ${GMXLIB_SOURCES} ${MDLIB_SOURCES} ${PROPERTY_SOURCES})
123
124 # This would be the standard way to include thread_mpi, but
125 # we want libgromacs to link the functions directly
126 #if(GMX_THREAD_MPI)
127 #    add_subdirectory(thread_mpi)
128 #endif()
129 #target_link_libraries(gmx ${GMX_EXTRA_LIBRARIES} ${THREAD_MPI_LIB})
130 tmpi_get_source_list(THREAD_MPI_SOURCES ${PROJECT_SOURCE_DIR}/src/external/thread_mpi/src)
131 add_library(thread_mpi OBJECT ${THREAD_MPI_SOURCES})
132 target_compile_definitions(thread_mpi PRIVATE HAVE_CONFIG_H)
133 if(CYGWIN)
134     # Needs POSIX-isms for strdup, not just std-isms
135     target_compile_definitions(thread_mpi PRIVATE _POSIX_C_SOURCE=200809L)
136 endif()
137 gmx_target_compile_options(thread_mpi)
138 if (WIN32)
139     gmx_target_warning_suppression(thread_mpi /wd4996 HAS_NO_MSVC_UNSAFE_FUNCTION)
140 endif()
141 list(APPEND libgromacs_object_library_dependencies thread_mpi)
142
143 if(GMX_INSTALL_LEGACY_API)
144   install(FILES
145           analysisdata.h
146           options.h
147           selection.h
148           trajectoryanalysis.h
149           DESTINATION include/gromacs)
150 endif()
151
152 # This code is here instead of utility/CMakeLists.txt, because CMake
153 # custom commands and source file properties can only be set in the directory
154 # that contains the target that uses them.
155 # TODO: Generate a header instead that can be included from baseversion.cpp.
156 # That probably simplifies things somewhat.
157 set(GENERATED_VERSION_FILE utility/baseversion-gen.cpp)
158 gmx_configure_version_file(
159     utility/baseversion-gen.cpp.cmakein ${GENERATED_VERSION_FILE}
160     REMOTE_HASH
161     EXTRA_VARS
162         GMX_SOURCE_DOI
163         GMX_RELEASE_HASH
164         GMX_SOURCE_HASH
165         )
166 list(APPEND LIBGROMACS_SOURCES ${GENERATED_VERSION_FILE})
167
168 # Mark some shared GPU implementation files to compile with CUDA if needed
169 if (GMX_GPU_CUDA)
170     get_property(CUDA_SOURCES GLOBAL PROPERTY CUDA_SOURCES)
171     set_source_files_properties(${CUDA_SOURCES} PROPERTIES CUDA_SOURCE_PROPERTY_FORMAT OBJ)
172 endif()
173
174 if (GMX_GPU_CUDA)
175     # Work around FindCUDA that prevents using target_link_libraries()
176     # with keywords otherwise...
177     set(CUDA_LIBRARIES PRIVATE ${CUDA_LIBRARIES})
178     if (NOT GMX_CLANG_CUDA)
179         gmx_cuda_add_library(libgromacs ${LIBGROMACS_SOURCES})
180     else()
181         add_library(libgromacs ${LIBGROMACS_SOURCES})
182     endif()
183     target_link_libraries(libgromacs PRIVATE ${CUDA_CUFFT_LIBRARIES})
184 else()
185     add_library(libgromacs ${LIBGROMACS_SOURCES})
186 endif()
187 target_link_libraries(libgromacs PRIVATE $<BUILD_INTERFACE:common>)
188 # As long as the libgromacs target has source files that reference headers from
189 # modules that don't provide CMake targets, libgromacs needs to use `src/`
190 # amongst its include directories (to support `#include "gromacs/module/header.h"`).
191 add_library(legacy_modules INTERFACE)
192 target_include_directories(legacy_modules INTERFACE $<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/src>)
193 target_link_libraries(libgromacs PRIVATE $<BUILD_INTERFACE:legacy_modules>)
194
195 # Add these contents first because linking their tests can take a lot
196 # of time, so we want lots of parallel work still available after
197 # linking starts.
198 add_subdirectory(fileio)
199 add_subdirectory(selection)
200
201 # Suppress a warning about our abuse of t_inputrec
202 gmx_source_file_warning_suppression(mdtypes/inputrec.cpp -Wno-class-memaccess HAS_NO_CLASS_MEMACCESS)
203
204 # Handle the object libraries that contain the source file
205 # dependencies that need special handling because they are generated
206 # or external code.
207 foreach(object_library ${libgromacs_object_library_dependencies})
208     if (BUILD_SHARED_LIBS)
209         set_target_properties(${object_library} PROPERTIES POSITION_INDEPENDENT_CODE true)
210     endif()
211     target_include_directories(${object_library} SYSTEM BEFORE PRIVATE ${PROJECT_SOURCE_DIR}/src/external/thread_mpi/include)
212     target_link_libraries(${object_library} PRIVATE common)
213
214     # Add the sources from the object libraries to the main library.
215     target_sources(libgromacs PRIVATE $<TARGET_OBJECTS:${object_library}>)
216 endforeach()
217 gmx_target_compile_options(libgromacs)
218 target_compile_definitions(libgromacs PRIVATE HAVE_CONFIG_H)
219 target_include_directories(libgromacs SYSTEM BEFORE PRIVATE ${PROJECT_SOURCE_DIR}/src/external/thread_mpi/include)
220
221 if (GMX_GPU_OPENCL)
222     option(GMX_EXTERNAL_CLFFT "True if an external clFFT is required to be used" FALSE)
223     mark_as_advanced(GMX_EXTERNAL_CLFFT)
224
225     # Default to using clFFT found on the system
226     # switch to quiet at the second run.
227     if (DEFINED clFFT_LIBRARY)
228         set (clFFT_FIND_QUIETLY TRUE)
229     endif()
230     find_package(clFFT)
231     if (NOT clFFT_FOUND)
232         if (GMX_EXTERNAL_CLFFT)
233             message(FATAL_ERROR "Did not find required external clFFT library, consider setting clFFT_ROOT_DIR")
234         endif()
235
236         if(MSVC)
237             message(FATAL_ERROR
238 "An OpenCL build was requested with Visual Studio compiler, but GROMACS
239 requires clFFT, which was not found on your system. GROMACS does bundle
240 clFFT to help with building for OpenCL, but that clFFT has not yet been
241 ported to the more recent versions of that compiler that GROMACS itself
242 requires. Thus for now, OpenCL is not available with MSVC and the internal
243 build of clFFT in GROMACS 2019. Either change compiler, try installing
244 a clFFT package, or use the latest GROMACS 2018 point release.")
245         endif()
246
247         # Fall back on the internal version
248         set (_clFFT_dir ../external/clFFT/src)
249         add_subdirectory(${_clFFT_dir} clFFT-build)
250         target_sources(libgromacs PRIVATE
251             $<TARGET_OBJECTS:clFFT>
252         )
253         target_include_directories(libgromacs SYSTEM PRIVATE ${_clFFT_dir}/include)
254         # Use the magic variable for how to link any library needed for
255         # dlopen, etc.  which is -ldl where needed, and empty otherwise
256         # (e.g. Windows, BSD, Mac).
257         target_link_libraries(libgromacs PRIVATE "${CMAKE_DL_LIBS}")
258     else()
259         target_link_libraries(libgromacs PRIVATE clFFT)
260     endif()
261 endif()
262
263 # Permit GROMACS code to include externally developed headers, such as
264 # the functionality from the nonstd project that we use for
265 # gmx::compat::optional. These are included as system headers so that
266 # no warnings are issued from them.
267 #
268 # TODO Perhaps generalize this for all headers from src/external
269 target_include_directories(libgromacs SYSTEM PRIVATE ${PROJECT_SOURCE_DIR}/src/external)
270
271 if(SIMD_AVX_512_CXX_SUPPORTED AND NOT ("${GMX_SIMD_ACTIVE}" STREQUAL "AVX_512_KNL"))
272     # Since we might be overriding -march=core-avx2, add a flag so we don't warn for this specific file.
273     # On KNL this can cause illegal instruction because the compiler might use non KNL AVX instructions
274     # with the SIMD_AVX_512_CXX_FLAGS flags.
275     set_source_files_properties(hardware/identifyavx512fmaunits.cpp PROPERTIES COMPILE_FLAGS "${SIMD_AVX_512_CXX_FLAGS} ${CXX_NO_UNUSED_OPTION_WARNING_FLAGS}")
276 endif()
277
278 # Do any special handling needed for .cpp files that use
279 # CUDA runtime headers
280 if (GMX_GPU_CUDA AND CMAKE_CXX_COMPILER_ID MATCHES "Clang")
281     # CUDA header cuda_runtime_api.h in at least CUDA 10.1 uses 0
282     # where nullptr would be preferable. GROMACS can't fix these, so
283     # must suppress them.
284     GMX_TEST_CXXFLAG(CXXFLAGS_NO_ZERO_AS_NULL_POINTER_CONSTANT "-Wno-zero-as-null-pointer-constant" NVCC_CLANG_SUPPRESSIONS_CXXFLAGS)
285
286     foreach(_compile_flag ${NVCC_CLANG_SUPPRESSIONS_CXXFLAGS})
287         set(GMX_CUDA_CLANG_FLAGS "${GMX_CUDA_CLANG_FLAGS} ${_compile_flag}")
288     endforeach()
289     if (GMX_CLANG_CUDA)
290         foreach (_file ${LIBGROMACS_SOURCES})
291             get_filename_component(_ext ${_file} EXT)
292             get_source_file_property(_cuda_source_format ${_file} CUDA_SOURCE_PROPERTY_FORMAT)
293             if ("${_ext}" STREQUAL ".cu" OR _cuda_source_format)
294                 gmx_compile_cuda_file_with_clang(${_file})
295             endif()
296         endforeach()
297     else()
298         get_property(CUDA_SOURCES GLOBAL PROPERTY CUDA_SOURCES)
299         set_source_files_properties(${CUDA_SOURCES} PROPERTIES COMPILE_FLAGS ${GMX_CUDA_CLANG_FLAGS})
300     endif()
301 endif()
302
303 # Only add the -fsycl flag to sources that really need it
304 if (GMX_GPU_SYCL)
305     get_property(SYCL_SOURCES GLOBAL PROPERTY SYCL_SOURCES)
306     set_source_files_properties(${SYCL_SOURCES} PROPERTIES COMPILE_FLAGS "${SYCL_CXX_FLAGS}")
307 endif()
308
309 gmx_setup_tng_for_libgromacs()
310
311 # We apply the SYCL flag explicitly just for libgromacs, since bugs in the beta versions of
312 # icpx/dpcpp leads to crashes if we try to link an library without any SYCL code with the
313 # -fsycl flag enabled. Once that bug is fixed, we should change it to simply add
314 # SYCL_CXX_FLAGS to GMX_SHARED_LINKER_FLAGS.
315 target_link_libraries(libgromacs
316                       PRIVATE
317                       ${EXTRAE_LIBRARIES}
318                       ${GMX_EXTRA_LIBRARIES}
319                       ${GMX_COMMON_LIBRARIES}
320                       ${FFT_LIBRARIES} ${LINEAR_ALGEBRA_LIBRARIES}
321                       ${THREAD_LIB} ${GMX_SHARED_LINKER_FLAGS}
322                       ${SYCL_CXX_FLAGS}
323                       ${OpenCL_LIBRARIES}
324                       $<$<PLATFORM_ID:SunOS>:socket>
325                       PUBLIC
326                       ${GMX_PUBLIC_LIBRARIES}
327                       )
328 target_link_libraries(libgromacs PUBLIC legacy_api)
329 # Dependencies from libgromacs to the modules are set up here, but
330 # once the add_subdirectory() commands are re-ordered then
331 # responsibility for setting this up will move to the respective
332 # modules.
333 target_link_libraries(libgromacs PRIVATE
334                       $<BUILD_INTERFACE:analysisdata>
335                       $<BUILD_INTERFACE:applied_forces>
336                       $<BUILD_INTERFACE:commandline>
337                       $<BUILD_INTERFACE:compat>
338                       $<BUILD_INTERFACE:coordinateio>
339                       $<BUILD_INTERFACE:correlationfunctions>
340                       $<BUILD_INTERFACE:domdec>
341 #                      $<BUILD_INTERFACE:energyanalysis>
342                       $<BUILD_INTERFACE:essentialdynamics>
343                       $<BUILD_INTERFACE:ewald>
344                       $<BUILD_INTERFACE:fft>
345                       $<BUILD_INTERFACE:fileio>
346                       $<BUILD_INTERFACE:gmxana>
347                       $<BUILD_INTERFACE:gmxlib>
348                       $<BUILD_INTERFACE:gmxpreprocess>
349                       $<BUILD_INTERFACE:gpu_utils>
350                       $<BUILD_INTERFACE:hardware>
351                       $<BUILD_INTERFACE:imd>
352                       $<BUILD_INTERFACE:linearalgebra>
353                       $<BUILD_INTERFACE:listed_forces>
354                       $<BUILD_INTERFACE:math>
355                       $<BUILD_INTERFACE:mdlib>
356                       $<BUILD_INTERFACE:mdrun>
357                       $<BUILD_INTERFACE:mdrunutility>
358                       $<BUILD_INTERFACE:mdspan>
359                       $<BUILD_INTERFACE:mdtypes>
360                       $<BUILD_INTERFACE:mimic>
361                       $<BUILD_INTERFACE:modularsimulator>
362                       $<BUILD_INTERFACE:nbnxm>
363                       $<BUILD_INTERFACE:onlinehelp>
364                       $<BUILD_INTERFACE:options>
365                       $<BUILD_INTERFACE:pbcutil>
366                       $<BUILD_INTERFACE:pulling>
367                       $<BUILD_INTERFACE:random>
368                       $<BUILD_INTERFACE:restraint>
369                       $<BUILD_INTERFACE:selection>
370                       $<BUILD_INTERFACE:simd>
371                       $<BUILD_INTERFACE:statistics>
372                       $<BUILD_INTERFACE:swap>
373                       $<BUILD_INTERFACE:tables>
374                       $<BUILD_INTERFACE:taskassignment>
375                       $<BUILD_INTERFACE:timing>
376                       $<BUILD_INTERFACE:tools>
377                       $<BUILD_INTERFACE:topology>
378                       $<BUILD_INTERFACE:trajectory>
379                       $<BUILD_INTERFACE:trajectoryanalysis>
380                       $<BUILD_INTERFACE:utility>
381     )
382 if (GMX_OPENMP)
383     target_link_libraries(libgromacs PUBLIC OpenMP::OpenMP_CXX)
384 endif()
385 set_target_properties(libgromacs PROPERTIES
386                       OUTPUT_NAME "gromacs${GMX_LIBS_SUFFIX}"
387                       SOVERSION ${LIBRARY_SOVERSION_MAJOR}
388                       VERSION ${LIBRARY_VERSION}
389                       )
390
391 gmx_manage_lmfit()
392 target_link_libraries(libgromacs PRIVATE lmfit)
393
394 # Make sure we fix "everything" found by more recent versions of clang.
395 if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER "7")
396    target_compile_options(libgromacs PRIVATE $<$<COMPILE_LANGUAGE:CXX>:-Weverything ${IGNORED_CLANG_ALL_WARNINGS}>)
397 endif()
398 if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
399    target_compile_options(libgromacs PRIVATE $<$<COMPILE_LANGUAGE:CXX>:/analyze /analyze:stacksize 70000
400      #Control flow warnings are disabled because the commond line output is insufficient. There is no tool
401      #to convert the xml report to e.g. HTML and even in Visual Studio the viewer doesn't work with cmake support.
402      /wd6001  #unitialized memory
403      /wd6011  #derefencing NULL
404      /wd6053  #prior call not zero-terminate
405      /wd6054  #might not be zero-terminated
406      /wd6385  #reading invalid data
407      /wd6386  #buffer overrun
408      /wd6387  #could be '0'
409      /wd28199 #uninitialized memory
410      # For compile time constant (e.g. templates) the following warnings have flase postives
411      /wd6239  #(<non-zero> && <expr>)
412      /wd6240  #(<expr> && <non-zero>)
413      /wd6294  #Ill-defined for-loop
414      /wd6326  #comparison of constant with other constant
415      /wd28020 #expression involving paramter is not true
416      # Misc
417      /wd6330  #incorrect type to function (warns for char (instead of unsigned) for isspace/isalpha/isdigit/..))
418      /wd6993  #OpenMP ignored
419      #TODO
420      /wd6031  #return value ignored (important - mostly warnigns about sscanf)
421      /wd6244  #hides declaration (known issue - we ingore similar warnings for other compilers)
422      /wd6246  #hides declaration
423      >
424    )
425 endif()
426
427 if (GMX_CLANG_TIDY)
428    set_target_properties(libgromacs PROPERTIES CXX_CLANG_TIDY
429        "${CLANG_TIDY_EXE};-warnings-as-errors=*")
430 endif()
431
432 # clang-3.6 warns about a number of issues that are not reported by more modern compilers
433 # and we know they are not real issues. So we only check that it can compile without error
434 # but ignore all warnings.
435 if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND CMAKE_CXX_COMPILER_VERSION MATCHES "^3\.6")
436     target_compile_options(libgromacs PRIVATE $<$<COMPILE_LANGUAGE:CXX>:-w>)
437 endif()
438
439 # TODO: Stop installing libgromacs. Possibly allow installation during deprecation period with GMX_INSTALL_LEGACY_API.
440 if (BUILD_SHARED_LIBS)
441     install(TARGETS libgromacs
442             EXPORT libgromacs
443             LIBRARY
444                 DESTINATION ${CMAKE_INSTALL_LIBDIR}
445                 COMPONENT libraries
446             RUNTIME
447                 DESTINATION ${CMAKE_INSTALL_BINDIR}
448                 COMPONENT libraries
449             ARCHIVE
450                 DESTINATION ${CMAKE_INSTALL_LIBDIR}
451                 COMPONENT libraries
452             INCLUDES DESTINATION include)
453     target_compile_definitions(libgromacs PUBLIC $<INSTALL_INTERFACE:GMX_DOUBLE=${GMX_DOUBLE_VALUE}>)
454     # legacy headers use c++17 features, so consumer codes need to use that standard, too
455     if(GMX_INSTALL_LEGACY_API)
456         target_compile_features(libgromacs INTERFACE cxx_std_${CMAKE_CXX_STANDARD})
457     endif()
458 endif()
459 add_library(Gromacs::libgromacs ALIAS libgromacs)
460
461 include(InstallLibInfo.cmake)
462
463 # Technically, the user could want to do this for an OpenCL build
464 # using the CUDA runtime, but currently there's no reason to want to
465 # do that.
466 if (INSTALL_CUDART_LIB) #can be set manual by user
467     if (GMX_GPU_CUDA)
468         foreach(CUDA_LIB ${CUDA_LIBRARIES})
469             string(REGEX MATCH "cudart" IS_CUDART ${CUDA_LIB})
470             if(IS_CUDART) #libcuda should not be installed
471                 #install also name-links (linker uses those)
472                 file(GLOB CUDA_LIBS ${CUDA_LIB}*)
473                 install(FILES ${CUDA_LIBS} DESTINATION
474                     ${CMAKE_INSTALL_LIBDIR} COMPONENT libraries)
475             endif()
476         endforeach()
477     else()
478         message(WARNING "INSTALL_CUDART_LIB only makes sense when configuring for CUDA support")
479     endif()
480 endif()
481
482 if(GMX_GPU_OPENCL)
483     # Install the utility headers
484     file(GLOB OPENCL_INSTALLED_FILES
485         gpu_utils/vectype_ops.clh
486         gpu_utils/device_utils.clh
487         )
488     install(FILES ${OPENCL_INSTALLED_FILES}
489         DESTINATION ${GMX_INSTALL_OCLDIR}/gromacs/gpu_utils
490         COMPONENT libraries)
491     file(GLOB OPENCL_INSTALLED_FILES
492         pbcutil/ishift.h
493         )
494     install(FILES ${OPENCL_INSTALLED_FILES}
495         DESTINATION ${GMX_INSTALL_OCLDIR}/gromacs/pbcutil
496         COMPONENT libraries)
497
498     # Install the NBNXM source and headers
499     file(GLOB OPENCL_INSTALLED_FILES
500         nbnxm/constants.h
501         )
502     install(FILES ${OPENCL_INSTALLED_FILES}
503         DESTINATION ${GMX_INSTALL_OCLDIR}/gromacs/nbnxm
504         COMPONENT libraries)
505     file(GLOB OPENCL_INSTALLED_FILES
506         nbnxm/opencl/nbnxm_ocl_kernels.cl
507         nbnxm/opencl/nbnxm_ocl_kernel.clh
508         nbnxm/opencl/nbnxm_ocl_kernel_pruneonly.clh
509         nbnxm/opencl/nbnxm_ocl_kernels.clh
510         nbnxm/opencl/nbnxm_ocl_kernels_fastgen.clh
511         nbnxm/opencl/nbnxm_ocl_kernels_fastgen_add_twincut.clh
512         nbnxm/opencl/nbnxm_ocl_kernel_utils.clh
513         nbnxm/opencl/nbnxm_ocl_consts.h
514         )
515     install(FILES ${OPENCL_INSTALLED_FILES}
516         DESTINATION ${GMX_INSTALL_OCLDIR}/gromacs/nbnxm/opencl
517         COMPONENT libraries)
518
519     # Install the PME source and headers
520     file(GLOB OPENCL_INSTALLED_FILES
521         ewald/pme_spread.clh
522         ewald/pme_solve.clh
523         ewald/pme_gather.clh
524         ewald/pme_gpu_calculate_splines.clh
525         ewald/pme_program.cl
526         ewald/pme_gpu_types.h
527         )
528     install(FILES ${OPENCL_INSTALLED_FILES}
529         DESTINATION ${GMX_INSTALL_OCLDIR}/gromacs/ewald
530         COMPONENT libraries)
531 endif()