1 cmake_minimum_required(VERSION 2.8)
2 # Keep CMake suitably quiet on Cygwin
3 set(CMAKE_LEGACY_CYGWIN_WIN32 0) # Remove when CMake >= 2.8.4 is required
5 # override bugs on OS X where Cmake picks gcc (GNU) for C instead of system default cc (Clang).
7 set(CMAKE_C_COMPILER_INIT "cc")
12 mark_as_advanced(DART_ROOT)
14 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
15 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
16 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
18 # PROJECT_VERSION should have the following structure:
19 # VERSION-dev[-SUFFIX] where the VERSION should have the for: vMajor.vMinor.vPatch
21 # The "-dev" suffix is important to keep because it makes possible to distinguish
22 # between a build from official release and a build from git release branch on a
23 # machine with no git.
25 # NOTE: when releasing the "-dev" suffix needs to be stripped off!
26 set(PROJECT_VERSION "5.0-dev")
27 set(CUSTOM_VERSION_STRING ""
28 CACHE STRING "Custom version string (if empty, use hard-coded default)")
29 mark_as_advanced(CUSTOM_VERSION_STRING)
30 if (CUSTOM_VERSION_STRING)
31 set(PROJECT_VERSION ${CUSTOM_VERSION_STRING})
32 endif (CUSTOM_VERSION_STRING)
34 # It is a bit irritating, but this has to be set separately for now!
35 SET(CPACK_PACKAGE_VERSION_MAJOR "5")
36 SET(CPACK_PACKAGE_VERSION_MINOR "0")
37 #SET(CPACK_PACKAGE_VERSION_PATCH "0")
39 # The numerical gromacs version. It is 40600 for 4.6.0.
40 # The #define GMX_VERSION in gmx_header_config_h is set to this value.
42 "${CPACK_PACKAGE_VERSION_MAJOR}*10000 + ${CPACK_PACKAGE_VERSION_MINOR}*100")
43 if(CPACK_PACKAGE_VERSION_PATCH)
45 "${NUM_VERSION} + ${CPACK_PACKAGE_VERSION_PATCH}")
48 # The API version tracks the numerical Gromacs version (for now).
49 # It is potentially different from the Gromacs version in the future, if
50 # the programs/libraries diverge from the presumably more stable API.
51 # The #define GMX_API_VERSION in version.h is set to this value to
52 # provide backward compatibility of software written against the Gromacs API.
53 set(API_VERSION ${NUM_VERSION})
55 # Cmake modules/macros are in a subdirectory to keep this file cleaner
56 set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
58 if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT AND UNIX)
59 set(CMAKE_INSTALL_PREFIX "/usr/local/gromacs" CACHE STRING "Installation prefix (installation will need write permissions here)" FORCE)
62 set(GMX_INSTALL_PREFIX "" CACHE STRING "Prefix gets appended to CMAKE_INSTALL_PREFIX. For cpack it sets the root folder of the archive.")
63 mark_as_advanced(GMX_INSTALL_PREFIX)
65 if(NOT CMAKE_BUILD_TYPE)
66 set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE)
67 endif(NOT CMAKE_BUILD_TYPE)
72 set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION})
73 set(CPACK_PACKAGE_VENDOR "gromacs.org")
74 set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Gromacs - a toolkit for high-performance molecular simulation")
75 set(CPACK_RESOURCE_FILE_WELCOME "${CMAKE_SOURCE_DIR}/admin/InstallWelcome.txt")
76 # Its GPL/LGPL, so they do not have to agree to a license for mere usage, but some installers require this...
77 set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/COPYING")
78 set(CPACK_RESOURCE_FILE_README "${CMAKE_SOURCE_DIR}/admin/InstallInfo.txt")
79 set(CPACK_SOURCE_IGNORE_FILES ".isreposource;.git;.gitignore")
80 set(CPACK_PROJECT_CONFIG_FILE "${CMAKE_SOURCE_DIR}/CPackInit.cmake")
81 SET(CPACK_SOURCE_INSTALLED_DIRECTORIES "${CMAKE_SOURCE_DIR};/;${CMAKE_BINARY_DIR}/man;man")
82 set(CPACK_PACKAGE_CONTACT "gmx-users@gromacs.org")
84 #must come after all cpack settings!
87 set(SOURCE_IS_GIT_REPOSITORY OFF)
88 if(EXISTS "${CMAKE_SOURCE_DIR}/.git")
89 set(SOURCE_IS_GIT_REPOSITORY ON)
92 ########################################################################
93 # Check and warn if cache generated on a different host is being reused
94 ########################################################################
96 execute_process(COMMAND hostname
97 OUTPUT_VARIABLE TMP_HOSTNAME
98 OUTPUT_STRIP_TRAILING_WHITESPACE)
99 if(GMX_BUILD_HOSTNAME AND NOT "${GMX_BUILD_HOSTNAME}" STREQUAL "${TMP_HOSTNAME}")
101 The CMake cache, probably generated on a different host (${GMX_BUILD_HOSTNAME}),
102 is being reused! This could lead to inconsitencies; therefore, it is
103 recommended to regenerate the cache!")
105 set(GMX_BUILD_HOSTNAME "${TMP_HOSTNAME}" CACHE INTERNAL
106 "Hostname of the machine where the cache was generated.")
109 ########################################################################
110 set(CMAKE_PREFIX_PATH "" CACHE STRING "Extra locations to search for external libraries and tools (give directory without lib, bin, or include)")
111 # Fix stupid flags on Windows
112 ########################################################################
113 SET(SHARED_LIBS_DEFAULT ON)
114 IF( WIN32 AND NOT CYGWIN)
115 option(GMX_PREFER_STATIC_LIBS "When finding libraries prefer static system libraries (MT instead of MD)!" ON)
116 mark_as_advanced(GMX_PREFER_STATIC_LIBS)
117 SET(SHARED_LIBS_DEFAULT OFF) #is currently not working on Windows
118 # This makes windows.h not declare min/max as macros that would break
119 # C++ code using std::min/std::max.
120 add_definitions(-DNOMINMAX)
122 IF (GMX_PREFER_STATIC_LIBS)
123 #Only setting Debug and Release flags. Others configurations current not used.
124 STRING(REPLACE /MD /MT CMAKE_C_FLAGS_RELEASE ${CMAKE_C_FLAGS_RELEASE})
125 SET(CMAKE_C_FLAGS_RELEASE ${CMAKE_C_FLAGS_RELEASE} CACHE STRING "" FORCE)
126 STRING(REPLACE /MD /MT CMAKE_C_FLAGS_DEBUG ${CMAKE_C_FLAGS_DEBUG})
127 SET(CMAKE_C_FLAGS_DEBUG ${CMAKE_C_FLAGS_DEBUG} CACHE STRING "" FORCE)
128 STRING(REPLACE /MD /MT CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE})
129 SET(CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE} CACHE STRING "" FORCE)
130 STRING(REPLACE /MD /MT CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG})
131 SET(CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG} CACHE STRING "" FORCE)
134 #Workaround for cmake bug 13174. Replace deprecated options.
135 IF( CMAKE_C_COMPILER_ID MATCHES "Intel" )
136 STRING(REPLACE /GZ /RTC1 CMAKE_C_FLAGS_DEBUG ${CMAKE_C_FLAGS_DEBUG})
137 SET(CMAKE_C_FLAGS_DEBUG ${CMAKE_C_FLAGS_DEBUG} CACHE STRING "" FORCE)
139 IF( CMAKE_CXX_COMPILER_ID MATCHES "Intel" )
140 STRING(REPLACE /GZ /RTC1 CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG})
141 STRING(REPLACE /GX /EHsc CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG})
142 SET(CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG} CACHE STRING "" FORCE)
144 STRING(REPLACE /GX /EHsc CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE})
145 SET(CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE} CACHE STRING "" FORCE)
150 ########################################################################
151 # User input options #
152 ########################################################################
153 option(GMX_DOUBLE "Use double precision (much slower, use only if you really need it)" OFF)
154 option(GMX_MPI "Build a parallel (message-passing) version of GROMACS" OFF)
155 option(GMX_THREAD_MPI "Build a thread-MPI-based multithreaded version of GROMACS (not compatible with MPI)" ON)
156 option(GMX_SOFTWARE_INVSQRT "Use GROMACS software 1/sqrt" ON)
157 mark_as_advanced(GMX_SOFTWARE_INVSQRT)
158 option(GMX_POWERPC_INVSQRT "Use PowerPC hardware 1/sqrt" OFF)
159 mark_as_advanced(GMX_POWERPC_INVSQRT)
160 option(GMX_FAHCORE "Build a library with mdrun functionality" OFF)
161 mark_as_advanced(GMX_FAHCORE)
162 option(GMX_OPENMM "Accelerated execution on GPUs through the OpenMM library (rerun cmake after changing to see relevant options)" OFF)
164 include(gmxDetectAcceleration)
165 if(NOT DEFINED GMX_CPU_ACCELERATION)
166 if(CMAKE_CROSSCOMPILING)
167 set(GMX_SUGGESTED_CPU_ACCELERATION "None")
168 else(CMAKE_CROSSCOMPILING)
169 gmx_detect_acceleration(GMX_SUGGESTED_CPU_ACCELERATION)
170 endif(CMAKE_CROSSCOMPILING)
171 endif(NOT DEFINED GMX_CPU_ACCELERATION)
173 set(GMX_CPU_ACCELERATION "@GMX_SUGGESTED_CPU_ACCELERATION@"
174 CACHE STRING "Accelerated CPU kernels. Pick one of: None, SSE2, SSE4.1, AVX_128_FMA, AVX_256, BlueGene, Power6, Fortran")
176 set(GMX_FFT_LIBRARY "fftw3"
177 CACHE STRING "FFT library choices: fftw3,mkl,fftpack[built-in]")
178 option(GMX_DISABLE_FFTW_MEASURE
179 "Do not optimize FFTW setups (not needed with SSE)" OFF)
180 mark_as_advanced(GMX_DISABLE_FFTW_MEASURE)
181 set(GMX_QMMM_PROGRAM "none"
182 CACHE STRING "QM package choices: none,gaussian,mopac,gamess,orca")
183 option(GMX_BROKEN_CALLOC "Work around broken calloc()" OFF)
184 mark_as_advanced(GMX_BROKEN_CALLOC)
185 option(GMX_MPI_IN_PLACE "Enable MPI_IN_PLACE for MPIs that have it defined" ON)
186 mark_as_advanced(GMX_MPI_IN_PLACE)
187 option(GMX_LOAD_PLUGINS "Compile with plugin support, needed to read VMD supported file formats" ON)
188 mark_as_advanced(GMX_LOAD_PLUGINS)
190 option(GMX_GPU "Enable GPU acceleration" ON)
191 option(GMX_OPENMP "Enable OpenMP-based multithreading" ON)
193 option(GMX_GIT_VERSION_INFO "Generate git version information" ${SOURCE_IS_GIT_REPOSITORY})
194 mark_as_advanced(GMX_GIT_VERSION_INFO)
196 option(GMX_DEFAULT_SUFFIX "Use default suffixes for GROMACS binaries and libs (_d for double, _mpi for MPI; rerun cmake after changing to see relevant options)" ON)
198 option(GMX_SYMLINK_OLD_BINARY_NAMES "Create symbolic links for pre-5.0 binary names" ON)
202 option(GMX_PREFER_STATIC_LIBS "When finding libraries prefer static archives (not available on non-*nix platforms and it will only work if static versions of external dependencies are available and found)!" OFF)
203 mark_as_advanced(GMX_PREFER_STATIC_LIBS)
206 option(GMX_CYCLE_SUBCOUNTERS "Enable cycle subcounters to get a more detailed cycle timings" OFF)
207 mark_as_advanced(GMX_CYCLE_SUBCOUNTERS)
209 ######################################################################
211 # These need to be done early (before further tests).
212 #####################################################################
214 # The cmake/Check{C,CXX}CompilerFlag.cmake files in the GROMACS distribution
215 # are used with permission from CMake v2.8.9 so that GROMACS can detect
216 # invalid options with the Intel Compilers.
217 # These files should be removed from the source tree when a CMake version that
218 # includes the features in question becomes required for building GROMACS.
219 include(CheckCCompilerFlag)
220 include(CheckCXXCompilerFlag)
222 # OpenMP check must come before other CFLAGS!
226 # CMake on Windows doesn't support linker flags passed to target_link_libraries
227 # (i.e. it treats /openmp as \openmp library file). Also, no OpenMP linker flags are needed.
228 if(NOT (WIN32 AND NOT CYGWIN))
229 if(CMAKE_COMPILER_IS_GNUCC AND GMX_PREFER_STATIC_OPENMP AND NOT APPLE)
230 set(OpenMP_LINKER_FLAGS "-Wl,-static -lgomp -lrt -Wl,-Bdynamic -lpthread")
231 set(OpenMP_SHARED_LINKER_FLAGS "")
233 # Only set a linker flag if the user didn't set them manually
234 if(NOT DEFINED OpenMP_LINKER_FLAGS)
235 set(OpenMP_LINKER_FLAGS "${OpenMP_C_FLAGS}")
237 if(NOT DEFINED OpenMP_SHARED_LINKER_FLAGS)
238 set(OpenMP_SHARED_LINKER_FLAGS "${OpenMP_C_FLAGS}")
244 "The compiler you are using does not support OpenMP parallelism. This might hurt your performance a lot, in particular with GPUs. Try using a more recent version, or a different compiler. For now, we are proceeding by turning off OpenMP.")
245 set(GMX_OPENMP OFF CACHE STRING "Whether GROMACS will use OpenMP parallelism." FORCE)
253 include(gmxGetCompilerVersion)
254 get_compiler_version()
256 # gcc 4.4.x is buggy and crashes when compiling some files with O3 and OpenMP on.
257 # Detect here whether applying a workaround is needed and will apply it later
258 # on the affected files.
259 include(gmxGCC44O3BugWorkaround)
260 gmx_check_gcc44_bug_workaround_needed(GMX_USE_GCC44_BUG_WORKAROUND)
262 ########################################################################
263 # Set up binary and library suffixing
264 ########################################################################
265 set(GMX_BINARY_SUFFIX "" CACHE STRING "Suffix for GROMACS binaries (default: _d for double, _mpi for MPI, _mpi_d for MPI and double).")
266 set(GMX_LIBS_SUFFIX ""
267 CACHE STRING "Suffix for GROMACS libs (default: _d for double, _mpi for MPI, _mpi_d for MPI and double).")
268 if (GMX_DEFAULT_SUFFIX)
269 set(GMX_BINARY_SUFFIX "")
270 set(GMX_LIBS_SUFFIX "")
272 set(GMX_BINARY_SUFFIX "_mpi")
273 set(GMX_LIBS_SUFFIX "_mpi")
276 set (GMX_BINARY_SUFFIX "${GMX_BINARY_SUFFIX}_d")
277 set (GMX_LIBS_SUFFIX "${GMX_LIBS_SUFFIX}_d")
280 set (GMX_BINARY_SUFFIX "-openmm")
281 set (GMX_LIBS_SUFFIX "_openmm")
283 mark_as_advanced(FORCE GMX_BINARY_SUFFIX GMX_LIBS_SUFFIX)
284 if (NOT SUFFIX_QUIETLY)
285 message(STATUS "Using default binary suffix: \"${GMX_BINARY_SUFFIX}\"")
286 message(STATUS "Using default library suffix: \"${GMX_LIBS_SUFFIX}\"")
287 endif (NOT SUFFIX_QUIETLY)
288 else(GMX_DEFAULT_SUFFIX)
289 mark_as_advanced(CLEAR GMX_BINARY_SUFFIX GMX_LIBS_SUFFIX)
290 if (NOT SUFFIX_QUIETLY)
291 message(STATUS "Using manually set binary suffix: \"${GMX_BINARY_SUFFIX}\"")
292 message(STATUS "Using manually set library suffix: \"${GMX_LIBS_SUFFIX}\"")
293 endif (NOT SUFFIX_QUIETLY)
294 endif(GMX_DEFAULT_SUFFIX)
295 set(SUFFIX_QUIETLY TRUE CACHE INTERNAL "")
299 set(PKG_CFLAGS "${PKG_CFLAGS} -DGMX_DOUBLE")
301 if(GMX_SOFTWARE_INVSQRT)
302 set(PKG_CFLAGS "${PKG_CFLAGS} -DGMX_SOFTWARE_INVSQRT")
303 endif(GMX_SOFTWARE_INVSQRT)
304 if(GMX_POWERPC_INVSQRT)
305 set(PKG_CFLAGS "${PKG_CFLAGS} -DGMX_POWERPC_INVSQRT")
306 endif(GMX_POWERPC_INVSQRT)
308 ########################################################################
309 #Process MPI settings
310 ########################################################################
311 include(gmxManageMPI)
313 #######################################################################
314 # Check for options incompatible with OpenMM build #
315 #######################################################################
317 # we'll use the built-in fft to avoid unnecessary dependencies
318 string(TOUPPER ${GMX_FFT_LIBRARY} GMX_FFT_LIBRARY)
319 if(NOT ${GMX_FFT_LIBRARY} STREQUAL "FFTPACK")
320 message(STATUS "No external FFT libraries needed for the OpenMM build, switching to fftpack!")
321 set(GMX_FFT_LIBRARY "fftpack" CACHE STRING
322 "No external FFT libraries needed for the OpenMM build, switching to fftpack!" FORCE)
325 message(FATAL_ERROR "The OpenMM build is not compatible with MPI!")
328 message(STATUS "Thread-MPI not compatible with OpenMM, disabled!")
329 set(GMX_THREAD_MPI OFF CACHE BOOL
330 "Thread-MPI not compatible with OpenMM build, disabled!" FORCE)
331 endif(GMX_THREAD_MPI)
333 message(STATUS "OpenMP multithreading not compatible with OpenMM, disabled")
334 set(GMX_OPENMP OFF CACHE BOOL
335 "OpenMP multithreading not compatible with OpenMM, disabled!" FORCE)
337 if(GMX_SOFTWARE_INVSQRT)
338 set(GMX_SOFTWARE_INVSQRT OFF CACHE STRING
339 "The OpenMM build does not need GROMACS software 1/sqrt!" FORCE)
340 endif(GMX_SOFTWARE_INVSQRT)
341 string(TOUPPER ${GMX_CPU_ACCELERATION} GMX_CPU_ACCELERATION)
342 if(NOT GMX_CPU_ACCELERATION STREQUAL "NONE")
343 message(STATUS "Switching off CPU-based acceleration, the OpenMM build does not support/need any!")
344 set(GMX_CPU_ACCELERATION "None" CACHE STRING
345 "Switching off CPU-based acceleration, the OpenMM build does not support/need any!" FORCE)
348 message(FATAL_ERROR "The OpenMM build does not support FAH build!")
351 message(FATAL_ERROR "The OpenMM-build does not support double precision calculations!")
353 # mark as advanced the unused variables
354 mark_as_advanced(FORCE GMX_CPU_ACCELERATION GMX_MPI GMX_FFT_LIBRARY
355 GMX_QMMM_PROGRAM GMX_THREAD_MPI GMX_DOUBLE)
357 mark_as_advanced(CLEAR GMX_CPU_ACCELERATION GMX_MPI GMX_FFT_LIBRARY
358 GMX_QMMM_PROGRAM GMX_THREAD_MPI GMX_DOUBLE)
362 ########################################################################
363 # Basic system tests (standard libraries, headers, functions, types) #
364 ########################################################################
365 include(CheckIncludeFiles)
366 include(CheckIncludeFileCXX)
367 check_include_files(unistd.h HAVE_UNISTD_H)
368 check_include_files(pwd.h HAVE_PWD_H)
369 check_include_files(pthread.h HAVE_PTHREAD_H)
370 check_include_files(dirent.h HAVE_DIRENT_H)
371 check_include_files(sys/time.h HAVE_SYS_TIME_H)
372 check_include_files(io.h HAVE_IO_H)
373 check_include_files(sched.h HAVE_SCHED_H)
375 check_include_files(regex.h HAVE_POSIX_REGEX)
376 check_include_file_cxx(regex HAVE_CXX11_REGEX)
377 # TODO: It could be nice to inform the user if no regex support is found,
378 # as selections won't be fully functional.
380 include(CheckFunctionExists)
381 check_function_exists(strdup HAVE_STRDUP)
382 check_function_exists(posix_memalign HAVE_POSIX_MEMALIGN)
383 check_function_exists(memalign HAVE_MEMALIGN)
384 check_function_exists(_aligned_malloc HAVE__ALIGNED_MALLOC)
385 check_function_exists(gettimeofday HAVE_GETTIMEOFDAY)
386 check_function_exists(fsync HAVE_FSYNC)
387 check_function_exists(_fileno HAVE__FILENO)
388 check_function_exists(fileno HAVE_FILENO)
389 check_function_exists(_commit HAVE__COMMIT)
390 check_function_exists(lstat HAVE_LSTAT)
391 check_function_exists(sigaction HAVE_SIGACTION)
392 check_function_exists(sysconf HAVE_SYSCONF)
393 check_function_exists(sched_setaffinity HAVE_SCHED_SETAFFINITY)
394 check_function_exists(sched_getaffinity HAVE_SCHED_GETAFFINITY)
395 check_function_exists(rsqrt HAVE_RSQRT)
396 check_function_exists(rsqrtf HAVE_RSQRTF)
397 check_function_exists(sqrtf HAVE_SQRTF)
399 include(CheckLibraryExists)
400 check_library_exists(m sqrt "" HAVE_LIBM)
401 check_library_exists(m cbrt "" HAVE_CBRT)
404 include(CheckTypeSize)
406 check_type_size("int" SIZEOF_INT)
407 check_type_size("long int" SIZEOF_LONG_INT)
408 check_type_size("long long int" SIZEOF_LONG_LONG_INT)
409 check_type_size("off_t" SIZEOF_OFF_T)
410 check_type_size("void *" SIZEOF_VOIDP)
412 if (CMAKE_C_SIZEOF_DATA_PTR EQUAL 8)
414 else (CMAKE_C_SIZEOF_DATA_PTR EQUAL 8)
415 set(GMX_64_BIT FALSE)
416 endif (CMAKE_C_SIZEOF_DATA_PTR EQUAL 8)
418 include(TestBigEndian)
419 test_big_endian(GMX_INTEGER_BIG_ENDIAN)
424 ########################################################################
425 # Find external packages #
426 ########################################################################
428 if(GMX_PREFER_STATIC_LIBS)
429 # On Linux .a is the static library suffix, on Mac OS X .lib can also
430 # be used, so we'll add both to the preference list.
431 SET(CMAKE_FIND_LIBRARY_SUFFIXES ".lib;.a" ${CMAKE_FIND_LIBRARY_SUFFIXES})
432 if(SHARED_LIBS_DEFAULT)
433 if(BUILD_SHARED_LIBS) #Warn the user about the combination. But don't overwrite the request.
434 message(WARNING "Static libraries requested, and shared Gromacs libraries requested.")
435 elseif(NOT DEFINED BUILD_SHARED_LIBS) #Change default to OFF. Don't warn if it's already off.
436 message(WARNING "Static libraries requested, the GROMACS libraries will also be build static (BUILD_SHARED_LIBS=OFF)")
437 set(SHARED_LIBS_DEFAULT OFF)
442 option(BUILD_SHARED_LIBS "Enable shared libraries (can be problematic with MPI, Windows)" ${SHARED_LIBS_DEFAULT})
444 option(GMX_XML "Use libxml2 to parse xml files" ON)
446 find_package(LibXml2)
449 include_directories(${LIBXML2_INCLUDE_DIR})
450 set(PKG_XML libxml-2.0)
451 set(XML_LIBRARIES ${LIBXML2_LIBRARIES})
455 option(GMX_GSL "Add support for gsl" OFF)
460 include_directories(${GSL_INCLUDE_DIR})
466 option(GMX_X11 "Use X window system" OFF)
469 # X11 includes/libraries are only set in the ngmx subdirectory!
476 set(THREAD_MPI_LIB thread_mpi)
478 tmpi_get_source_list(THREAD_MPI_SRC CXX)
479 set(PKG_CFLAGS "${PKG_CFLAGS} -DGMX_THREAD_MPI")
482 tmpi_get_source_list(THREAD_MPI_SRC CXX NOMPI)
483 endif(GMX_THREAD_MPI)
486 set(CUDA_BUILD_EMULATION OFF)
487 find_package(CUDA 3.1 REQUIRED)
488 add_definitions(-DGMX_OPENMM)
489 if(CMAKE_BUILD_TYPE STREQUAL "DEBUG")
490 set(CUDA_VERBOSE_BUILD ON)
498 message(WARNING "GPU acceleration is not available in double precision, disabled!")
499 set(GMX_GPU OFF CACHE BOOL "Enable GPU acceleration" FORCE)
505 # We support CUDA >=v3.2 on *nix, but <= v4.1 doesn't work with MSVC
507 find_package(CUDA 4.1)
509 find_package(CUDA 3.2)
512 if (NOT EXISTS ${CUDA_TOOLKIT_ROOT_DIR})
513 message(FATAL_ERROR "
514 mdrun supports native GPU acceleration on NVIDIA hardware with compute
515 capability >=2.0. This requires the NVIDIA CUDA library, which was not
516 found; the location can be hinted by setting CUDA_TOOLKIT_ROOT_DIR.
518 CPU or GPU acceleration can be selected at runtime, but if you are
519 sure you can not make use of GPU acceleration, disable it by setting
520 the CMake variable GMX_GPU=OFF.")
525 In order to use GPU acceleration efficiently, mdrun requires OpenMP multithreding.
526 Without OpenMP only a single CPU core per GPU can be used which is suboptimal.
527 Note that with MPI multiple processes can be forced to use a single GPU, but this
528 typically inefficient.")
531 include(gmxManageNvccConfig)
533 # Check whether we can use atomic operations needed for polling wait for GPU
534 # (to avoid the cudaStreamSynchronize + ECC bug).
535 # With thread-MPI testing atomics has already been carried out, but without
536 # thread-MPI we need to invoke the atomics test independently.
537 if (NOT GMX_THREAD_MPI)
538 set(TEST_TMPI_ATOMICS_ONLY ON CACHE INTERNAL
539 "Test only the atomic operations of thread-MPI.")
544 # Annoyingly enough, FindCUDA leaves a few variables behind as non-advanced.
545 # We need to mark these advanced outside the conditional, otherwise, if the user
546 # tuns GMX_GPU=OFF after a failed cmake pass, these variables will be left behind.
547 mark_as_advanced(CUDA_BUILD_CUBIN CUDA_BUILD_EMULATION CUDA_SDK_ROOT_DIR CUDA_VERBOSE_BUILD)
550 find_library(ACCELERATE_FRAMEWORK Accelerate)
551 list(APPEND GMX_EXTRA_LIBRARIES ${ACCELERATE_FRAMEWORK})
558 if(WIN32 AND NOT CYGWIN)
559 set(GMX_NATIVE_WINDOWS 1)
562 # only bother with finding git and using version.h if the source is a git repo
563 if(GMX_GIT_VERSION_INFO)
564 if (NOT SOURCE_IS_GIT_REPOSITORY)
566 "Cannot generate git version information from source tree not under git. "
567 "Set GMX_GIT_VERSION_INFO=OFF to proceed.")
569 # We need at least git v1.5.3 be able to parse git's date output. If not
570 # found or the version is too small, we can't generate version information.
573 # Find out the git version
574 if(GIT_FOUND AND NOT GIT_VERSION)
575 execute_process(COMMAND ${GIT_EXECUTABLE} "--version"
576 OUTPUT_VARIABLE _exec_out
577 OUTPUT_STRIP_TRAILING_WHITESPACE)
578 string(REGEX REPLACE "git version (.*)" "\\1" GIT_VERSION ${_exec_out})
579 set(GIT_VERSION ${GIT_VERSION} CACHE STRING "Git version")
580 mark_as_advanced(GIT_VERSION)
583 if(NOT GIT_FOUND OR GIT_VERSION VERSION_LESS "1.5.3")
585 "No compatible git version found (>= 1.5.3 required). "
586 "Won't be able to generate development version information. "
587 "Set GMX_GIT_VERSION_INFO=OFF to proceed.")
591 option(GMX_INTERNAL_BOOST "Use minimal internal version of boost" OFF)
592 if ( NOT GMX_INTERNAL_BOOST )
593 find_package( Boost 1.44.0 )
594 else ( NOT GMX_INTERNAL_BOOST )
595 set (Boost_FOUND FALSE)
596 endif( NOT GMX_INTERNAL_BOOST )
598 if(Boost_FOUND AND NOT Boost_VERSION VERSION_LESS "104400" )
599 include_directories(${Boost_INCLUDE_DIRS})
601 if(NOT BOOST_QUIETLY)
602 message("Boost >= 1.44 not found. Using minimal internal version. Not recommended if GROMACS is used as library!")
604 include_directories(${CMAKE_SOURCE_DIR}/src/external/boost)
605 add_definitions( -DBOOST_NO_TYPEID ) #TYPEID not supported for minimal internal version (would add significant more code)
606 # TODO: Propagate the above settings to the installed CMakeFiles.txt template
607 # (from share/template/)
608 # TODO: Reorder stuff such that INCL_INSTALL_DIR could be used here
609 set(PKG_CFLAGS "${PKG_CFLAGS} -DBOOST_NO_TYPEID -I${GMX_INSTALL_PREFIX}include/gromacs/external/boost")
610 install(DIRECTORY ${CMAKE_SOURCE_DIR}/src/external/boost/boost
611 DESTINATION ${GMX_INSTALL_PREFIX}include/gromacs/external/boost
612 COMPONENT development)
614 set(BOOST_QUIETLY TRUE CACHE INTERNAL "")
617 option(GMX_BUILD_UNITTESTS "Build unit tests with BUILD_TESTING (uses Google C++ Testing and Mocking Frameworks, requires libxml2)" ON)
619 set(GMX_BUILD_UNITTESTS OFF)
620 endif (LIBXML2_FOUND)
621 mark_as_advanced(GMX_BUILD_UNITTESTS)
622 set(MEMORYCHECK_SUPPRESSIONS_FILE ${CMAKE_SOURCE_DIR}/cmake/legacy_and_external.supp)
624 ########################################################################
625 # Generate development version info for cache
626 ########################################################################
627 # set(GEN_VERSION_INFO_INTERNAL "ON")
628 # include(gmxGenerateVersionString)
630 ########################################################################
631 # Our own GROMACS tests
632 ########################################################################
634 add_definitions( -DHAVE_CONFIG_H )
635 include_directories(${CMAKE_SOURCE_DIR}/src)
636 # Required for config.h, maybe should only be set in src/CMakeLists.txt
637 include_directories(${CMAKE_BINARY_DIR}/src)
638 # Required for gmx_header_config_gen.h to be found before installation
639 include_directories(${CMAKE_BINARY_DIR}/src/gromacs/utility)
640 # Required for now to make old code compile
641 include_directories(${CMAKE_SOURCE_DIR}/src/gromacs/legacyheaders)
643 include(gmxTestInlineASM)
644 gmx_test_inline_asm_gcc_x86(GMX_X86_GCC_INLINE_ASM)
646 include(gmxSetBuildInformation)
647 gmx_set_build_information()
648 if(BUILD_CPU_FEATURES MATCHES "rdtscp" AND NOT GMX_DISTRIBUTABLE_BUILD)
649 # The timestep counter headers do not include config.h
650 add_definitions(-DHAVE_RDTSCP)
651 endif(BUILD_CPU_FEATURES MATCHES "rdtscp" AND NOT GMX_DISTRIBUTABLE_BUILD)
653 include(gmxTestFloatFormat)
654 gmx_test_float_format(GMX_FLOAT_FORMAT_IEEE754
655 GMX_IEEE754_BIG_ENDIAN_BYTE_ORDER
656 GMX_IEEE754_BIG_ENDIAN_WORD_ORDER)
658 include(gmxTestLargeFiles)
659 gmx_test_large_files(GMX_LARGEFILES)
661 include(gmxTestSignal)
662 gmx_test_sigusr1(HAVE_SIGUSR1)
664 include(gmxTestInline)
665 gmx_test_inline(INLINE_KEYWORD)
667 include(gmxTestRestrict)
668 gmx_test_restrict(RESTRICT_KEYWORD)
670 include(gmxTestPipes)
671 gmx_test_pipes(HAVE_PIPES)
673 include(gmxTestIsfinite)
674 gmx_test_isfinite(HAVE_ISFINITE)
675 gmx_test__isfinite(HAVE__ISFINITE)
676 gmx_test__finite(HAVE__FINITE)
678 include(gmxTestCXX11)
679 gmx_test_cxx11(GMX_CXX11 CXX11_FLAG)
680 set(GROMACS_CXX_FLAGS "${CXX11_FLAG} ${GROMACS_CXX_FLAGS}")
681 if(CXX11_FLAG AND GMX_GPU)
682 #FIXME: add proper solution for progate all but cxx11 flag
683 set(CUDA_PROPAGATE_HOST_FLAGS no)
684 message(WARNING "Please manually add compiler flags to CUDA_NVCC_FLAGS. Automatic propogation temporary not working.")
688 gmx_test_xdr(GMX_SYSTEM_XDR)
689 if(NOT GMX_SYSTEM_XDR)
690 set(GMX_INTERNAL_XDR 1)
691 set(PKG_CFLAGS "${PKG_CFLAGS} -DGMX_INTERNAL_XDR")
692 endif(NOT GMX_SYSTEM_XDR)
694 # Process nonbonded accelerated kernels settings
695 string(TOUPPER ${GMX_CPU_ACCELERATION} ${GMX_CPU_ACCELERATION})
696 if(${GMX_CPU_ACCELERATION} STREQUAL "NONE")
698 elseif(${GMX_CPU_ACCELERATION} STREQUAL "SSE2")
700 GMX_TEST_CFLAG(GNU_SSE2_CFLAG "-msse2" GROMACS_C_FLAGS)
701 if(NOT GNU_SSE2_CFLAG)
702 GMX_TEST_CFLAG(MSVC_SSE2_CFLAG "/arch:SSE2" GROMACS_C_FLAGS)
703 endif(NOT GNU_SSE2_CFLAG)
705 GMX_TEST_CXXFLAG(GNU_SSE2_CXXFLAG "-msse2" GROMACS_CXX_FLAGS)
706 if(NOT GNU_SSE2_CXXFLAG)
707 GMX_TEST_CXXFLAG(MSVC_SSE2_CXXFLAG "/arch:SSE2" GROMACS_CXX_FLAGS)
708 endif(NOT GNU_SSE2_CXXFLAG)
710 # We dont warn for lacking SSE2 flag support, since that is probably standard today.
712 # Only test the include after we have tried to add the correct flag for SSE2 support
713 check_include_file(emmintrin.h HAVE_EMMINTRIN_H ${GROMACS_C_FLAGS})
715 if(NOT HAVE_EMMINTRIN_H)
716 message(FATAL_ERROR "Cannot find emmintrin.h, which is required for SSE2 intrinsics support.")
717 endif(NOT HAVE_EMMINTRIN_H)
719 set(GMX_CPU_ACCELERATION_X86_SSE2 1)
720 # The user should not be able to set this orthogonally to the acceleration
722 if (NOT ACCELERATION_QUIETLY)
723 message(STATUS "Enabling SSE2 Gromacs acceleration, and it will help compiler optimization.")
726 elseif(${GMX_CPU_ACCELERATION} STREQUAL "SSE4.1")
728 GMX_TEST_CFLAG(GNU_SSE4_CFLAG "-msse4.1" GROMACS_C_FLAGS)
729 if (NOT GNU_SSE4_CFLAG)
730 GMX_TEST_CFLAG(MSVC_SSE4_CFLAG "/arch:SSE4.1" GROMACS_C_FLAGS)
731 endif(NOT GNU_SSE4_CFLAG)
732 if (NOT GNU_SSE4_CFLAG AND NOT MSVC_SSE4_CFLAG)
733 message(WARNING "No C SSE4.1 flag found. Consider a newer compiler, or disable SSE4.1 for slightly lower performance.")
734 # Not surprising if we end up here! MSVC current does not support the SSE4.1 flag. However, it appears to accept SSE4.1
735 # intrinsics when SSE2 support is enabled, so we try that instead.
736 GMX_TEST_CFLAG(MSVC_SSE2_CFLAG "/arch:SSE2" GROMACS_C_FLAGS)
737 endif(NOT GNU_SSE4_CFLAG AND NOT MSVC_SSE4_CFLAG)
739 GMX_TEST_CXXFLAG(GNU_SSE4_CXXFLAG "-msse4.1" GROMACS_CXX_FLAG)
740 if (NOT GNU_SSE4_CXXFLAG)
741 GMX_TEST_CXXFLAG(MSVC_SSE4_CXXFLAG "/arch:SSE4.1" GROMACS_CXX_FLAGS)
742 endif(NOT GNU_SSE4_CXXFLAG)
743 if (NOT GNU_SSE4_CXXFLAG AND NOT MSVC_SSE4_CXXFLAG)
744 message(WARNING "No C++ SSE4.1 flag found. Consider a newer compiler, or disable SSE4.1 for slightly lower performance.")
745 # Not surprising if we end up here! MSVC current does not support the SSE4.1 flag. However, it appears to accept SSE4.1
746 # intrinsics when SSE2 support is enabled, so we try that instead.
747 GMX_TEST_CXXFLAG(MSVC_SSE2_CXXFLAG "/arch:SSE2" GROMACS_CXX_FLAGS)
748 endif(NOT GNU_SSE4_CXXFLAG AND NOT MSVC_SSE4_CXXFLAG)
750 # This must come after we have added the -msse4.1 flag on some platforms.
751 check_include_file(smmintrin.h HAVE_SMMINTRIN_H ${GROMACS_C_FLAGS})
753 if(NOT HAVE_SMMINTRIN_H)
754 message(FATAL_ERROR "Cannot find smmintrin.h, which is required for SSE4.1 intrinsics support.")
755 endif(NOT HAVE_SMMINTRIN_H)
757 set(GMX_CPU_ACCELERATION_X86_SSE4_1 1)
758 # The user should not be able to set this orthogonally to the acceleration
759 set(GMX_X86_SSE4_1 1)
761 if (NOT ACCELERATION_QUIETLY)
762 message(STATUS "Enabling SSE4.1 Gromacs acceleration, and it will help compiler optimization.")
765 elseif(${GMX_CPU_ACCELERATION} STREQUAL "AVX_128_FMA" OR ${GMX_CPU_ACCELERATION} STREQUAL "AVX_256")
767 # Set the AVX compiler flag for both these choices!
769 GMX_TEST_CFLAG(GNU_AVX_CFLAG "-mavx" GROMACS_C_FLAGS)
770 if (NOT GNU_AVX_CFLAG)
771 GMX_TEST_CFLAG(MSVC_AVX_CFLAG "/arch:AVX" GROMACS_C_FLAGS)
772 endif (NOT GNU_AVX_CFLAG)
773 if (NOT GNU_AVX_CFLAG AND NOT MSVC_AVX_CFLAG)
774 message(WARNING "No C AVX flag found. Consider a newer compiler, or disable AVX for much lower performance.")
775 endif (NOT GNU_AVX_CFLAG AND NOT MSVC_AVX_CFLAG)
777 GMX_TEST_CXXFLAG(GNU_AVX_CXXFLAG "-mavx" GROMACS_CXX_FLAGS)
778 if (NOT GNU_AVX_CXXFLAG)
779 GMX_TEST_CXXFLAG(MSVC_AVX_CXXFLAG "/arch:AVX" GROMACS_CXX_FLAGS)
780 endif (NOT GNU_AVX_CXXFLAG)
781 if (NOT GNU_AVX_CXXFLAG AND NOT MSVC_AVX_CXXFLAG)
782 message(WARNING "No C++ AVX flag found. Consider a newer compiler, or disable AVX for much lower performance.")
783 endif (NOT GNU_AVX_CXXFLAG AND NOT MSVC_AVX_CXXFLAG)
785 # Set the FMA4 flags (MSVC doesn't require any)
786 if(${GMX_CPU_ACCELERATION} STREQUAL "AVX_128_FMA" AND NOT MSVC)
787 GMX_TEST_CFLAG(GNU_FMA_CFLAG "-mfma4" GROMACS_C_FLAGS)
788 if (NOT GNU_FMA_CFLAG)
789 message(WARNING "No C FMA4 flag found. Consider a newer compiler, or disable AVX_128_FMA for much lower performance.")
790 endif(NOT GNU_FMA_CFLAG)
791 if (CMAKE_CXX_COMPILER_LOADED)
792 GMX_TEST_CXXFLAG(GNU_FMA_CXXFLAG "-mfma4" GROMACS_CXX_FLAGS)
793 if (NOT GNU_FMA_CXXFLAG)
794 message(WARNING "No C++ FMA flag found. Consider a newer compiler, or disable AVX_128_FMA for much lower performance.")
795 endif (NOT GNU_FMA_CXXFLAG)
799 # Only test the header after we have tried to add the flag for AVX support
800 check_include_file(immintrin.h HAVE_IMMINTRIN_H ${GROMACS_C_FLAGS})
802 if(NOT HAVE_IMMINTRIN_H)
803 message(FATAL_ERROR "Cannot find immintrin.h, which is required for AVX intrinsics support. Consider switching compiler.")
804 endif(NOT HAVE_IMMINTRIN_H)
806 if(${GMX_CPU_ACCELERATION} STREQUAL "AVX_256")
807 try_compile(TEST_AVX ${CMAKE_BINARY_DIR}
808 "${CMAKE_SOURCE_DIR}/cmake/TestAVX.c"
809 COMPILE_DEFINITIONS "${GROMACS_C_FLAGS}")
811 message(FATAL_ERROR "Cannot compile AVX intrinsics. Consider switching compiler.")
815 # GCC requires x86intrin.h for FMA support. MSVC 2010 requires intrin.h for FMA support.
816 check_include_file(x86intrin.h HAVE_X86INTRIN_H ${GROMACS_C_FLAGS})
817 check_include_file(intrin.h HAVE_INTRIN_H ${GROMACS_C_FLAGS})
819 # The user should not be able to set this orthogonally to the acceleration
820 set(GMX_X86_SSE4_1 1)
823 # But just enable one of the choices internally...
824 if(${GMX_CPU_ACCELERATION} STREQUAL "AVX_128_FMA")
825 set(GMX_CPU_ACCELERATION_X86_AVX_128_FMA 1)
826 set(GMX_X86_AVX_128_FMA 1)
827 if (NOT ACCELERATION_QUIETLY)
828 message(STATUS "Enabling 128-bit AVX Gromacs acceleration (with fused-multiply add), and it will help compiler optimization.")
831 # If we are not doing AVX_128, it must be AVX_256...
832 set(GMX_CPU_ACCELERATION_X86_AVX_256 1)
833 set(GMX_X86_AVX_256 1)
834 if (NOT ACCELERATION_QUIETLY)
835 message(STATUS "Enabling 256-bit AVX Gromacs acceleration, and it will help compiler optimization.")
839 elseif(${GMX_CPU_ACCELERATION} STREQUAL "FORTRAN")
841 # Fortran is temporarily disabled while we push in nbNxN kernels.
842 # We need to fake it a bit here to avoid jenkins build errors!
843 # add_definitions(-DGMX_FORTRAN)
845 elseif(${GMX_CPU_ACCELERATION} STREQUAL "BLUEGENE")
846 # GMX_CPU_ACCELERATION=BlueGene should be set in the Toolchain-BlueGene?-???.cmake file
847 if (NOT ACCELERATION_QUIETLY)
848 message(STATUS "Configuring for BlueGene")
851 if (${CMAKE_SYSTEM_NAME} STREQUAL "BlueGeneL")
852 set(SHARED_LIBS_DEFAULT OFF CACHE BOOL "Shared libraries not compatible with BlueGene/L, disabled!" FORCE)
853 set(BUILD_SHARED_LIBS OFF CACHE BOOL "Shared libraries not compatible with BlueGene/L, disabled!" FORCE)
854 endif (${CMAKE_SYSTEM_NAME} STREQUAL "BlueGeneL")
855 set(GMX_SOFTWARE_INVSQRT OFF CACHE BOOL "Do not use software reciprocal square root on BlueGene" FORCE)
856 set(GMX_POWERPC_INVSQRT ON CACHE BOOL "Use hardware reciprocal square root on BlueGene" FORCE)
857 set(GMX_X11 OFF CACHE BOOL "X11 not compatible with BlueGene, disabled!" FORCE)
858 set(GMX_THREAD_MPI OFF CACHE BOOL "Thread-MPI not compatible with BlueGene, disabled!" FORCE)
859 set(GMX_MPI ON CACHE BOOL "Use MPI on BlueGene" FORCE)
860 # Access to /etc/passwd is not available on the back end of BlueGene,
861 # despite being detected by CMake. This can cause linker warnings
862 # about harmless things in src/gmxlib/string2.h.
864 # The automatic testing for endianness does not work for the BlueGene cross-compiler
865 set(GMX_IEEE754_BIG_ENDIAN_BYTE_ORDER 1 CACHE INTERNAL "BlueGene has big endian FP byte order (by default)" FORCE)
866 set(GMX_IEEE754_BIG_ENDIAN_WORD_ORDER 1 CACHE INTERNAL "BlueGene has big endian FP word order (by default)" FORCE)
867 elseif(${GMX_CPU_ACCELERATION} STREQUAL "POWER6")
869 set(GMX_SOFTWARE_INVSQRT OFF CACHE BOOL "Do not use software reciprocal square root on Power6" FORCE)
870 set(GMX_POWERPC_INVSQRT ON CACHE BOOL "Use hardware reciprocal square root on Power6" FORCE)
871 else(${GMX_CPU_ACCELERATION} STREQUAL "NONE")
872 MESSAGE(FATAL_ERROR "Unrecognized option for accelerated kernels: ${GMX_CPU_ACCELERATION}. Pick one of None, SSE2, SSE4.1, AVX_128_FMA, AVX_256, Fortran, BlueGene, Power6")
873 endif(${GMX_CPU_ACCELERATION} STREQUAL "NONE")
874 set(ACCELERATION_QUIETLY TRUE CACHE INTERNAL "")
876 if(GMX_FORTRAN OR GMX_POWER6)
878 message(FATAL_ERROR "FORTRAN/POWER6 is incompatible with thread-MPI and only provides a speed-up on certain IBM compilers. Disable FORTRAN (or threads if you really want to use FORTRAN kernels).")
879 endif(GMX_THREAD_MPI)
880 enable_language(Fortran)
881 include(FortranCInterface)
882 discover_fortran_mangling(prefix isupper suffix extra_under_score found)
883 if(extra_under_score)
885 endif(extra_under_score)
887 set(prefix "${prefix} ##")
890 set(suffix "## ${suffix}")
892 set(extrasuffix "${suffix}${extrasuffix}")
896 # Don't know if this is needed, but it can't hurt
897 set(extrasuffix "## ${extrasuffix}")
902 set(F77_FUNCDEF "${prefix} NAME ${suffix}")
903 # The underscored versions are not currently used.
904 #set(F77_FUNCDEF_ "${prefix} NAME ${extrasuffix}")
906 set(F77_FUNCDEF "${prefix} name ${suffix}")
907 #set(F77_FUNCDEF_ "${prefix} name ${extrasuffix}")
909 else(GMX_FORTRAN OR GMX_POWER6)
910 set(F77_FUNCDEF "name ## _")
911 #set(F77_FUNCDEF_ "name ## _")
912 endif(GMX_FORTRAN OR GMX_POWER6)
914 # Process QM/MM Settings
915 string(TOUPPER ${GMX_QMMM_PROGRAM} ${GMX_QMMM_PROGRAM})
916 if(${GMX_QMMM_PROGRAM} STREQUAL "GAUSSIAN")
917 set(GMX_QMMM_GAUSSIAN 1)
918 elseif(${GMX_QMMM_PROGRAM} STREQUAL "MOPAC")
919 set(GMX_QMMM_MOPAC 1)
920 elseif(${GMX_QMMM_PROGRAM} STREQUAL "GAMESS")
921 set(GMX_QMMM_GAMESS 1)
922 elseif(${GMX_QMMM_PROGRAM} STREQUAL "ORCA")
924 elseif(${GMX_QMMM_PROGRAM} STREQUAL "NONE")
926 else(${GMX_QMMM_PROGRAM} STREQUAL "GAUSSIAN")
927 MESSAGE(FATAL_ERROR "Invalid QM/MM program option: ${GMX_QMMM_PROGRAM}. Choose one of: Gaussian, Mopac, Gamess, Orca, None")
928 endif(${GMX_QMMM_PROGRAM} STREQUAL "GAUSSIAN")
930 # Process FFT library settings - if not OpenMM build
931 string(TOUPPER ${GMX_FFT_LIBRARY} ${GMX_FFT_LIBRARY})
934 if(${GMX_FFT_LIBRARY} STREQUAL "FFTW3")
940 find_package(FFTW COMPONENTS ${FFTW})
941 string(TOUPPER "${FFTW}" FFTW)
942 set(PKG_FFT "${${FFTW}_PKG}")
943 include_directories(${${FFTW}_INCLUDE_DIRS})
944 set(FFT_LIBRARIES ${${FFTW}_LIBRARIES})
945 if(NOT ${FFTW}_FOUND)
946 MESSAGE(FATAL_ERROR "Cannot find FFTW3 (with correct precision - libfftw3f for single precision GROMACS or libfftw3 for double precision GROMACS). Fix it, choose another FFT library, or use the Gromacs built-in fftpack (slower)!")
947 endif(NOT ${FFTW}_FOUND)
951 if (NOT ${GMX_CPU_ACCELERATION} STREQUAL "NONE" AND NOT ${FFTW}_HAVE_SIMD)
952 message(WARNING "The fftw library found is compiled without SIMD support, which makes it slow. Consider recompiling it or contact your admin")
953 endif (NOT ${GMX_CPU_ACCELERATION} STREQUAL "NONE" AND NOT ${FFTW}_HAVE_SIMD)
955 elseif(${GMX_FFT_LIBRARY} STREQUAL "MKL")
956 # MESSAGE(STATUS "Using external FFT library - Intel MKL")
957 find_package(MKL REQUIRED)
958 include_directories(${MKL_INCLUDE_DIR})
959 set(FFT_LIBRARIES ${MKL_LIBRARIES})
960 set(PKG_FFT_LIBS ${MKL_LIBRARIES})
965 #elseif(${GMX_FFT_LIBRARY} STREQUAL "ACML")
966 # MESSAGE(STATUS "Using external FFT library - AMD core math library")
967 # set(GMX_FFT_ACML 1)
968 elseif(${GMX_FFT_LIBRARY} STREQUAL "FFTPACK")
969 MESSAGE(STATUS "Using internal FFT library - fftpack")
970 set(GMX_FFT_FFTPACK 1)
971 else(${GMX_FFT_LIBRARY} STREQUAL "FFTW3")
972 MESSAGE(FATAL_ERROR "Invalid FFT library setting: ${GMX_FFT_LIBRARY}. Choose one of: fftw3, mkl, fftpack")
973 endif(${GMX_FFT_LIBRARY} STREQUAL "FFTW3")
975 # enable threaded fftw3 if we've found it
976 if(FFTW3_THREADS OR FFTW3F_THREADS)
977 add_definitions(-DFFT5D_FFTW_THREADS)
980 set(GMX_EXTERNAL_BLAS TRUE CACHE BOOL "Use external BLAS instead of built-in")
981 set(GMX_EXTERNAL_LAPACK TRUE CACHE BOOL "Use external LAPACK instead of built-in")
982 # MKL has BLAS/LAPACK routines
983 if(NOT HAVE_MKL AND NOT ACCELERATE_FRAMEWORK)
984 if(GMX_EXTERNAL_BLAS)
986 list(APPEND GMX_EXTRA_LIBRARIES ${GMX_BLAS_USER})
988 set(BLAS_FIND_QUIETLY ON)
991 list(APPEND GMX_EXTRA_LIBRARIES ${BLAS_LIBRARIES})
993 MESSAGE(STATUS "Using internal BLAS library")
994 set(GMX_EXTERNAL_BLAS FALSE CACHE BOOL "Use external BLAS instead of built-in" FORCE)
997 endif(GMX_EXTERNAL_BLAS)
998 if(GMX_EXTERNAL_LAPACK)
1000 list(APPEND GMX_EXTRA_LIBRARIES ${GMX_LAPACK_USER})
1001 else(GMX_LAPACK_USER)
1002 set(LAPACK_FIND_QUIETLY ON)
1003 find_package(LAPACK)
1005 list(APPEND GMX_EXTRA_LIBRARIES ${LAPACK_LIBRARIES})
1007 MESSAGE(STATUS "Using internal LAPACK library")
1008 set(GMX_EXTERNAL_LAPACK FALSE CACHE BOOL "Use external LAPACK instead of built-in" FORCE)
1010 endif(GMX_LAPACK_USER)
1011 endif(GMX_EXTERNAL_LAPACK)
1013 mark_as_advanced(GMX_EXTERNAL_LAPACK)
1014 mark_as_advanced(GMX_EXTERNAL_BLAS)
1016 set(GMX_USE_PLUGINS OFF CACHE INTERNAL "Whether GROMACS will really try to compile support for VMD plugins")
1018 if(GMX_LOAD_PLUGINS)
1019 if(CYGWIN OR NOT WIN32)
1020 # Native Windows does not have, nor need dlopen
1021 # Note that WIN32 is set with Cygwin, but Cygwin needs dlopen to use plug-ins
1022 include(gmxTestdlopen)
1023 gmx_test_dlopen(HAVE_DLOPEN)
1026 # so, should we use plug-ins?
1027 if((WIN32 AND NOT CYGWIN) OR (HAVE_DLOPEN AND BUILD_SHARED_LIBS))
1030 "Found the ability to use plug-ins when building shared libaries, "
1031 "so will compile to use plug-ins (e.g. to read VMD-supported file "
1034 if(NOT GMX_VMD_PLUGIN_PATH)
1037 set(GMX_USE_PLUGINS ON)
1038 list(APPEND GMX_EXTRA_LIBRARIES ${CMAKE_DL_LIBS}) # magic cross-platform pre-set variable for dlopen library
1039 set(PKG_DL_LIBS "-l${CMAKE_DL_LIBS}")
1043 endif(GMX_LOAD_PLUGINS)
1044 set(VMD_QUIETLY TRUE CACHE INTERNAL "")
1046 if(EXISTS "${CMAKE_SOURCE_DIR}/admin/.isreposource")
1047 if(NOT CMAKE_CROSSCOMPILING)
1048 option(GMX_BUILD_MANPAGES "Build man pages" ON)
1050 message(STATUS "Building the man pages is not available when "
1051 "cross-compiling the developer version from git")
1054 #make sure source package contains all man pages
1055 if(NOT EXISTS "${CMAKE_SOURCE_DIR}/man/man1/ngmx.1")
1056 message(FATAL_ERROR "Man pages are missing from source package.")
1059 mark_as_advanced(GMX_BUILD_MANPAGES)
1061 # Math and thread libraries must often come after all others when linking...
1063 list(APPEND GMX_EXTRA_LIBRARIES m)
1067 set(COREWRAP_INCLUDE_DIR "${CMAKE_SOURCE_DIR}/../corewrap" CACHE STRING
1068 "Path to swindirect.h")
1069 include_directories(${COREWRAP_INCLUDE_DIR})
1072 # # # # # # # # # # NO MORE TESTS AFTER THIS LINE! # # # # # # # # # # #
1073 # these are set after everything else
1074 if (NOT DEFINED GROMACS_C_FLAGS_SET)
1075 set(GROMACS_C_FLAGS_SET true CACHE INTERNAL "Whether to reset the C flags"
1077 set(CMAKE_C_FLAGS "${GROMACS_C_FLAGS} ${CMAKE_C_FLAGS}" CACHE STRING
1078 "Flags used by the compiler during all build types" FORCE)
1079 set(CMAKE_CXX_FLAGS "${GROMACS_CXX_FLAGS} ${CMAKE_CXX_FLAGS}" CACHE STRING
1080 "Flags used by the compiler during all build types" FORCE)
1081 set(CMAKE_EXE_LINKER_FLAGS
1082 "${GROMACS_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS}"
1083 CACHE STRING "Linker flags for creating executables" FORCE)
1084 set(CMAKE_SHARED_LINKER_FLAGS
1085 "${GROMACS_LINKER_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS}"
1086 CACHE STRING "Linker flags for creating shared libraries" FORCE)
1087 endif (NOT DEFINED GROMACS_C_FLAGS_SET)
1090 #Unset all OpenMP flags in case OpenMP was disabled either by the user
1091 #or because it was only partially detected (e.g. only for C but not C++ compiler)
1092 unset(OpenMP_C_FLAGS CACHE)
1093 unset(OpenMP_CXX_FLAGS CACHE)
1095 set(GMX_EXE_LINKER_FLAGS ${GMX_EXE_LINKER_FLAGS} ${OpenMP_LINKER_FLAGS})
1096 set(GMX_SHARED_LINKER_FLAGS ${GMX_SHARED_LINKER_FLAGS} ${OpenMP_SHARED_LINKER_FLAGS})
1098 ######################################
1099 # Output compiler and CFLAGS used
1100 ######################################
1101 execute_process(COMMAND ${CMAKE_C_COMPILER} --version RESULT_VARIABLE TMP_RESULT OUTPUT_VARIABLE CC_VERSION ERROR_VARIABLE CC_VERSION)
1102 #try executing just the compiler command if that failed...
1104 execute_process(COMMAND ${CMAKE_C_COMPILER} RESULT_VARIABLE TMP_RESULT OUTPUT_VARIABLE CC_VERSION ERROR_VARIABLE CC_VERSION)
1106 string(LENGTH "${CC_VERSION}" len)
1108 string(REGEX MATCH "[^\n]+" CC_VERSION "${CC_VERSION}")
1111 set(BUILD_COMPILER "@CMAKE_C_COMPILER@ @CMAKE_C_COMPILER_ID@ @CC_VERSION@")
1112 set(BUILD_CFLAGS "@CMAKE_C_FLAGS@")
1113 if(CMAKE_BUILD_TYPE STREQUAL "Debug")
1114 set(BUILD_CFLAGS "@BUILD_CFLAGS@ @CMAKE_C_FLAGS_DEBUG@")
1115 elseif(CMAKE_BUILD_TYPE STREQUAL "Release")
1116 set(BUILD_CFLAGS "@BUILD_CFLAGS@ @CMAKE_C_FLAGS_RELEASE@")
1117 elseif(CMAKE_BUILD_TYPE STREQUAL "MinSizeRel")
1118 set(BUILD_CFLAGS "@BUILD_CFLAGS@ @CMAKE_C_FLAGS_MINSIZEREL@")
1119 elseif(CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
1120 set(BUILD_CFLAGS "@BUILD_CFLAGS@ @CMAKE_C_FLAGS_RELWITHDEBINFO@")
1124 ########################################################################
1125 # Specify install locations and which subdirectories to process #
1126 ########################################################################
1127 if ( NOT DEFINED GMXLIB )
1130 set(LIB_INSTALL_DIR "${GMX_INSTALL_PREFIX}${GMXLIB}")
1131 set(BIN_INSTALL_DIR ${GMX_INSTALL_PREFIX}bin)
1132 set(DATA_INSTALL_DIR ${GMX_INSTALL_PREFIX}share/gromacs)
1133 set(MAN_INSTALL_DIR ${GMX_INSTALL_PREFIX}share/man)
1134 set(INCL_INSTALL_DIR ${GMX_INSTALL_PREFIX}include)
1136 set(GMXLIBDIR ${DATA_INSTALL_DIR}/top)
1138 ##################################################################
1139 # Shared library settings
1140 ##################################################################
1141 if(NOT CMAKE_SYSTEM_NAME STREQUAL "Darwin")
1142 set(CMAKE_SKIP_BUILD_RPATH FALSE)
1143 set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
1144 set(CMAKE_INSTALL_RPATH "\\\$ORIGIN/../${GMXLIB}")
1145 set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
1147 if(CMAKE_SYSTEM_VERSION VERSION_GREATER 8.0) #rpath supported for >10.4
1148 set(CMAKE_INSTALL_NAME_DIR "@rpath")
1149 set(GMX_EXE_LINKER_FLAGS ${GMX_EXE_LINKER_FLAGS} "-Wl,-rpath,@executable_path/../lib")
1151 set(CMAKE_INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/${LIB_INSTALL_DIR}")
1155 #COPYING file: Only necessary for binary distributions.
1156 #Simpler to always install.
1157 install(FILES COPYING DESTINATION ${DATA_INSTALL_DIR} COMPONENT data)
1159 add_subdirectory(doxygen)
1160 add_subdirectory(share)
1161 add_subdirectory(src)
1162 add_subdirectory(scripts)
1164 #######################
1166 #######################
1168 "${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in"
1169 "${CMAKE_CURRENT_BINARY_DIR}/cmake/cmake_uninstall.cmake"
1171 ###########################
1172 ADD_CUSTOM_TARGET(uninstall
1173 "${CMAKE_COMMAND}" -P
1174 "${CMAKE_CURRENT_BINARY_DIR}/cmake/cmake_uninstall.cmake")
1175 ###########################
1178 ########################################################################
1180 ########################################################################
1183 mark_as_advanced(BUILD_TESTING)
1186 add_subdirectory(tests)