Merge "Merge branch release-4-6"
[alexxy/gromacs.git] / CMakeLists.txt
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
4
5 # CMake modules/macros are in a subdirectory to keep this file cleaner
6 # This needs to be set before project() in order to pick up toolchain files
7 list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Platform)
8
9 project(Gromacs)
10
11 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
12 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
13 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
14
15 # PROJECT_VERSION should have the following structure:
16 # VERSION-dev[-SUFFIX] where the VERSION should have the for: vMajor.vMinor.vPatch
17 #
18 # The "-dev" suffix is important to keep because it makes possible to distinguish
19 # between a build from official release and a build from git release branch on a
20 # machine with no git.
21 #
22 # NOTE: when releasing the "-dev" suffix needs to be stripped off!
23 set(PROJECT_VERSION "5.0-dev")
24 # The version number of the regressiontest tarball against which this
25 # git branch can be tested. Normally, this will be the version of the
26 # last patch release. Comment the next line out for branches leading
27 # to a major/minor release.
28 set(REGRESSIONTEST_VERSION "4.6.4")
29 set(CUSTOM_VERSION_STRING ""
30     CACHE STRING "Custom version string (if empty, use hard-coded default)")
31 mark_as_advanced(CUSTOM_VERSION_STRING)
32 if (CUSTOM_VERSION_STRING)
33     set(PROJECT_VERSION ${CUSTOM_VERSION_STRING})
34 endif (CUSTOM_VERSION_STRING)
35 set(SOVERSION 8)
36 # It is a bit irritating, but this has to be set separately for now!
37 SET(CPACK_PACKAGE_VERSION_MAJOR "5")
38 SET(CPACK_PACKAGE_VERSION_MINOR "0")
39 #SET(CPACK_PACKAGE_VERSION_PATCH "0")
40
41 # The numerical gromacs version. It is 40600 for 4.6.0.
42 # The #define GMX_VERSION in gmx_header_config_h is set to this value.
43 math(EXPR NUM_VERSION 
44     "${CPACK_PACKAGE_VERSION_MAJOR}*10000 + ${CPACK_PACKAGE_VERSION_MINOR}*100")
45 if(CPACK_PACKAGE_VERSION_PATCH)
46     math(EXPR NUM_VERSION
47          "${NUM_VERSION} + ${CPACK_PACKAGE_VERSION_PATCH}")
48 endif()
49
50 # The API version tracks the numerical Gromacs version (for now).
51 # It is potentially different from the Gromacs version in the future, if
52 # the programs/libraries diverge from the presumably more stable API.
53 # The #define GMX_API_VERSION in version.h is set to this value to
54 # provide backward compatibility of software written against the Gromacs API.
55 set(API_VERSION ${NUM_VERSION})
56
57 if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT AND UNIX)
58     set(CMAKE_INSTALL_PREFIX "/usr/local/gromacs" CACHE STRING "Installation prefix (installation will need write permissions here)" FORCE)
59 endif()
60
61 set(GMX_INSTALL_PREFIX "" CACHE STRING "Prefix gets appended to CMAKE_INSTALL_PREFIX. For cpack it sets the root folder of the archive.")
62 mark_as_advanced(GMX_INSTALL_PREFIX)
63
64 include(gmxBuildTypeReference)
65
66 if(NOT CMAKE_BUILD_TYPE)
67     set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel Reference." FORCE)
68     # Set the possible values of build type for cmake-gui
69     set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release"
70         "MinSizeRel" "RelWithDebInfo")
71 endif(NOT CMAKE_BUILD_TYPE)
72
73 enable_language(C)
74 enable_language(CXX)
75
76 set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION})
77 set(CPACK_PACKAGE_VENDOR "gromacs.org")
78 set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Gromacs - a toolkit for high-performance molecular simulation")
79 set(CPACK_RESOURCE_FILE_WELCOME "${CMAKE_SOURCE_DIR}/admin/InstallWelcome.txt")
80 # Its GPL/LGPL, so they do not have to agree to a license for mere usage, but some installers require this...
81 set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/COPYING")
82 set(CPACK_RESOURCE_FILE_README "${CMAKE_SOURCE_DIR}/admin/InstallInfo.txt")
83 set(CPACK_SOURCE_IGNORE_FILES "\\\\.isreposource$;\\\\.git/;\\\\.gitignore$")
84 set(CPACK_PROJECT_CONFIG_FILE "${CMAKE_SOURCE_DIR}/CPackInit.cmake")
85 set(CPACK_SOURCE_INSTALLED_DIRECTORIES "${CMAKE_SOURCE_DIR};/;${CMAKE_BINARY_DIR}/share/man;share/man")
86 set(CPACK_PACKAGE_CONTACT "gmx-users@gromacs.org")
87
88 #must come after all cpack settings!
89 include(CPack)
90
91 # Set a default valgrind suppression file.
92 # This unfortunately needs to duplicate information from CTest to work as
93 # expected...
94 set(MEMORYCHECK_SUPPRESSIONS_FILE
95     "${CMAKE_SOURCE_DIR}/cmake/legacy_and_external.supp"
96     CACHE FILEPATH
97     "File that contains suppressions for the memory checker")
98 include(CTest)
99
100 set(SOURCE_IS_GIT_REPOSITORY OFF)
101 set(SOURCE_IS_SOURCE_DISTRIBUTION OFF)
102 if(EXISTS "${CMAKE_SOURCE_DIR}/.git")
103     set(SOURCE_IS_GIT_REPOSITORY ON)
104 endif()
105 if(NOT EXISTS "${CMAKE_SOURCE_DIR}/admin/.isreposource")
106     set(SOURCE_IS_SOURCE_DISTRIBUTION ON)
107 endif()
108
109 ########################################################################
110 # Check and warn if cache generated on a different host is being reused
111 ########################################################################
112 if(CMAKE_HOST_UNIX)
113     execute_process(COMMAND hostname
114                     OUTPUT_VARIABLE TMP_HOSTNAME
115                     OUTPUT_STRIP_TRAILING_WHITESPACE)
116     if(GMX_BUILD_HOSTNAME AND NOT "${GMX_BUILD_HOSTNAME}" STREQUAL "${TMP_HOSTNAME}")
117         message(WARNING "
118             The CMake cache, probably generated on a different host (${GMX_BUILD_HOSTNAME}),
119             is being reused! This could lead to inconsitencies; therefore, it is
120             recommended to regenerate the cache!")
121     endif()
122     set(GMX_BUILD_HOSTNAME "${TMP_HOSTNAME}" CACHE INTERNAL
123             "Hostname of the machine where the cache was generated.")
124 endif()
125
126 ########################################################################
127 # User input options                                                   #
128 ########################################################################
129 include(gmxOptionUtilities)
130
131 set(CMAKE_PREFIX_PATH "" CACHE STRING "Extra locations to search for external libraries and tools (give directory without lib, bin, or include)")
132
133 option(GMX_DOUBLE "Use double precision (much slower, use only if you really need it)" OFF)
134 option(GMX_MPI    "Build a parallel (message-passing) version of GROMACS" OFF)
135 option(GMX_THREAD_MPI  "Build a thread-MPI-based multithreaded version of GROMACS (not compatible with MPI)" ON)
136 gmx_dependent_option(
137     GMX_MPI_IN_PLACE
138     "Enable MPI_IN_PLACE for MPIs that have it defined"
139     ON
140     GMX_MPI)
141 mark_as_advanced(GMX_MPI_IN_PLACE)
142 option(GMX_SOFTWARE_INVSQRT "Use GROMACS software 1/sqrt" ON)
143 mark_as_advanced(GMX_SOFTWARE_INVSQRT)
144 option(GMX_FAHCORE "Build a library with mdrun functionality" OFF)
145 mark_as_advanced(GMX_FAHCORE)
146
147 option(GMX_COOL_QUOTES "Enable Gromacs cool quotes" ON)
148 mark_as_advanced(GMX_COOL_QUOTES)
149 gmx_add_cache_dependency(GMX_COOL_QUOTES BOOL "NOT GMX_FAHCORE" OFF)
150
151 # decide on GPU settings based on user-settings and GPU/CUDA detection
152 include(gmxManageGPU)
153
154 # Detect the architecture the compiler is targetting, detect
155 # acceleration possibilities on that hardware, suggest an acceleration
156 # to use if none is specified, and populate the cache option for CPU
157 # accleration.
158 include(gmxDetectTargetArchitecture)
159 gmx_detect_target_architecture()
160 include(gmxDetectAcceleration)
161 gmx_detect_acceleration(GMX_SUGGESTED_CPU_ACCELERATION)
162
163 gmx_option_multichoice(
164     GMX_CPU_ACCELERATION
165     "Acceleration for CPU kernels and compiler optimization"
166     "${GMX_SUGGESTED_CPU_ACCELERATION}"
167     None SSE2 SSE4.1 AVX_128_FMA AVX_256 IBM_QPX Sparc64_HPC_ACE)
168
169 gmx_option_multichoice(
170     GMX_FFT_LIBRARY
171     "FFT library"
172     "fftw3"
173     fftw3 mkl "fftpack[built-in]")
174 gmx_dependent_option(
175     GMX_BUILD_OWN_FFTW
176     "Download and build FFTW 3 during the GROMACS build process, rather than fall back on the really slow fftpack."
177     OFF
178     "GMX_FFT_LIBRARY STREQUAL FFTW3")
179 gmx_dependent_option(
180     GMX_DISABLE_FFTW_MEASURE
181     "Do not optimize FFTW setups (not needed with SSE)"
182     OFF
183     "GMX_FFT_LIBRARY STREQUAL FFTW3")
184 mark_as_advanced(GMX_BUILD_OWN_FFTW)
185 mark_as_advanced(GMX_DISABLE_FFTW_MEASURE)
186
187 gmx_option_multichoice(
188     GMX_QMMM_PROGRAM
189     "QM package for QM/MM"
190     None
191     none gaussian mopac gamess orca)
192
193 option(GMX_BROKEN_CALLOC "Work around broken calloc()" OFF)
194 mark_as_advanced(GMX_BROKEN_CALLOC)
195 option(GMX_LOAD_PLUGINS "Compile with plugin support, needed to read VMD supported file formats" ON)
196 mark_as_advanced(GMX_LOAD_PLUGINS)
197
198 option(GMX_GPU  "Enable GPU acceleration" ON)
199 option(GMX_OPENMP "Enable OpenMP-based multithreading" ON)
200
201 option(GMX_GIT_VERSION_INFO "Generate git version information" ${SOURCE_IS_GIT_REPOSITORY})
202 mark_as_advanced(GMX_GIT_VERSION_INFO)
203
204 if(UNIX)
205     option(GMX_SYMLINK_OLD_BINARY_NAMES "Create symbolic links for pre-5.0 binary names" ON)
206 endif()
207 option(GMX_BUILD_MDRUN_ONLY "Build and install only the mdrun binary" OFF)
208
209 option(GMX_CYCLE_SUBCOUNTERS "Enable cycle subcounters to get a more detailed cycle timings" OFF)
210 mark_as_advanced(GMX_CYCLE_SUBCOUNTERS)
211
212 option(GMX_SKIP_DEFAULT_CFLAGS "Don't automatically add suggested/required Compiler flags." OFF)
213 mark_as_advanced(GMX_SKIP_DEFAULT_CFLAGS)
214
215 option(GMX_BUILD_FOR_COVERAGE
216        "Tune build for better code coverage metrics (e.g., disable asserts)"
217        OFF)
218 mark_as_advanced(GMX_BUILD_FOR_COVERAGE)
219
220 ######################################################################
221 # Compiler tests
222 # These need to be done early (before further tests).
223 #####################################################################
224
225 # The cmake/Check{C,CXX}CompilerFlag.cmake files in the GROMACS distribution
226 # are used with permission from CMake v2.8.9 so that GROMACS can detect
227 # invalid options with the Intel Compilers.
228 # These files should be removed from the source tree when a CMake version that
229 # includes the features in question becomes required for building GROMACS.
230 include(CheckCCompilerFlag)
231 include(CheckCXXCompilerFlag)
232
233 # Get compiler version information, needs to be done early as check that depend
234 # on compiler verison follow below.
235 include(gmxGetCompilerInfo)
236 get_compiler_version()
237
238 # First exclude compilers known to not work with OpenMP although claim to support it:
239 # gcc 4.2.1 and gcc-llvm 4.2.1 (also claims to be 4.2.1) on Mac OS X
240 # This fixes redmine 900 and needs to run before OpenMP flags are set below.
241 if (CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND
242     (CMAKE_COMPILER_IS_GNUCC AND C_COMPILER_VERSION AND C_COMPILER_VERSION VERSION_LESS 4.3))
243     message(STATUS "OpenMP multithreading not supported with gcc/llvm-gcc 4.2 on Mac OS X, disabled")
244     set(GMX_OPENMP OFF CACHE BOOL
245         "OpenMP multithreading not not supported with gcc/llvm-gcc 4.2 on Mac OS X, disabled!" FORCE)
246 endif()
247
248 # OpenMP check must come before other CFLAGS!
249 if(GMX_OPENMP)
250     find_package(OpenMP)
251     if(OPENMP_FOUND)
252         # CMake on Windows doesn't support linker flags passed to target_link_libraries
253         # (i.e. it treats /openmp as \openmp library file). Also, no OpenMP linker flags are needed.
254         if(NOT (WIN32 AND NOT CYGWIN))
255             if(CMAKE_COMPILER_IS_GNUCC AND GMX_PREFER_STATIC_OPENMP AND NOT APPLE)
256                 set(OpenMP_LINKER_FLAGS "-Wl,-static -lgomp -lrt -Wl,-Bdynamic -lpthread")
257                 set(OpenMP_SHARED_LINKER_FLAGS "")
258             else()
259                 # Only set a linker flag if the user didn't set them manually
260                 if(NOT DEFINED OpenMP_LINKER_FLAGS)
261                     set(OpenMP_LINKER_FLAGS "${OpenMP_C_FLAGS}")
262                 endif()
263                 if(NOT DEFINED OpenMP_SHARED_LINKER_FLAGS)
264                     set(OpenMP_SHARED_LINKER_FLAGS "${OpenMP_C_FLAGS}")
265                 endif()
266             endif()
267         endif()
268     else(OPENMP_FOUND)
269         message(WARNING
270                 "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.")
271         set(GMX_OPENMP OFF CACHE STRING "Whether GROMACS will use OpenMP parallelism." FORCE)
272     endif(OPENMP_FOUND)
273 endif()
274
275
276 include(gmxCFlags)
277 gmx_c_flags()
278
279 # This variable should be used for additional compiler flags which are not
280 # generated in gmxCFlags nor are acceleration or MPI related.
281 set(EXTRA_C_FLAGS "")
282 set(EXTRA_CXX_FLAGS "")
283
284 # gcc 4.4.x is buggy and crashes when compiling some files with O3 and OpenMP on.
285 # Detect here whether applying a workaround is needed and will apply it later
286 # on the affected files.
287 include(gmxGCC44O3BugWorkaround)
288 gmx_check_gcc44_bug_workaround_needed(GMX_USE_GCC44_BUG_WORKAROUND)
289
290 # clang 3.0 is buggy for some unknown reason detected during adding
291 # the SSE2 group kernels for GROMACS 4.6. If we ever work out what
292 # that is, we should replace these tests with a compiler feature test,
293 # update GROMACS Redmine task #1039 and perhaps report a clang bug.
294 #
295 # In the meantime, until we require CMake 2.8.10 we cannot rely on it to detect
296 # the compiler version for us. So we need a manual check for clang 3.0.
297 include(gmxDetectClang30)
298 gmx_detect_clang_3_0(COMPILER_IS_CLANG_3_0)
299 if(COMPILER_IS_CLANG_3_0)
300     message(FATAL_ERROR "Your compiler is clang version 3.0, which is known to be buggy for GROMACS. Use a different compiler.")
301 endif()
302
303 # clang <=3.2 contains a bug that causes incorrect code to be generated for the
304 # vfmaddps instruction and therefore the bug is triggered with AVX_128_FMA.
305 # (see: http://llvm.org/bugs/show_bug.cgi?id=15040).
306 # We can work around this by not using the integrated assembler (except on OS X
307 # which has an outdated assembler that does not support AVX instructions).
308 if (${CMAKE_C_COMPILER_ID} MATCHES "Clang" AND C_COMPILER_VERSION VERSION_LESS "3.3")
309     set(GMX_USE_CLANG_C_FMA_BUG_WORKAROUND TRUE)
310 endif()
311 if (${CMAKE_CXX_COMPILER_ID} MATCHES "Clang" AND CXX_COMPILER_VERSION VERSION_LESS "3.3")
312     set(GMX_USE_CLANG_CXX_FMA_BUG_WORKAROUND TRUE)
313 endif()
314
315 if (CMAKE_C_COMPILER_ID STREQUAL "PGI")
316     message(WARNING "All tested PGI compiler versions (up to 12.9.0) generate binaries which produce incorrect results, or even fail to compile Gromacs. Highly recommended to use a different compiler. If you choose to use PGI, make sure to run the regressiontests.")
317 endif()
318
319 if(CMAKE_C_COMPILER_ID MATCHES "Intel" AND C_COMPILER_VERSION VERSION_LESS "12.0.0")
320     message(WARNING "Intel compilers before 12.0.0 are not routinely tested, so there may be problems. Version 11.1 with SSE4.1 is known to produce incorrect results. It is highly recommended to use a more up-to-date compiler. If you choose to use this version, make sure you run the regressiontests.")
321 endif()
322
323 set(PKG_CFLAGS "")
324 if(GMX_DOUBLE)
325     set(PKG_CFLAGS "${PKG_CFLAGS} -DGMX_DOUBLE")
326 endif(GMX_DOUBLE)
327 if(GMX_SOFTWARE_INVSQRT)
328   set(PKG_CFLAGS "${PKG_CFLAGS} -DGMX_SOFTWARE_INVSQRT")
329 endif(GMX_SOFTWARE_INVSQRT)
330
331
332
333 ########################################################################
334 # Basic system tests (standard libraries, headers, functions, types)   #
335 ########################################################################
336 include(CheckIncludeFiles)
337 include(CheckIncludeFileCXX)
338 check_include_files(unistd.h     HAVE_UNISTD_H)
339 check_include_files(pwd.h        HAVE_PWD_H)
340 check_include_files(dirent.h     HAVE_DIRENT_H)
341 check_include_files(time.h       HAVE_TIME_H)
342 check_include_files(sys/time.h   HAVE_SYS_TIME_H)
343 check_include_files(io.h         HAVE_IO_H)
344 check_include_files(sched.h      HAVE_SCHED_H)
345
346 check_include_files(regex.h      HAVE_POSIX_REGEX)
347 check_include_file_cxx(regex     HAVE_CXX11_REGEX)
348 # TODO: It could be nice to inform the user if no regex support is found,
349 # as selections won't be fully functional.
350
351 include(CheckFunctionExists)
352 check_function_exists(posix_memalign    HAVE_POSIX_MEMALIGN)
353 check_function_exists(memalign          HAVE_MEMALIGN)
354 check_function_exists(_aligned_malloc   HAVE__ALIGNED_MALLOC)
355 check_function_exists(gettimeofday      HAVE_GETTIMEOFDAY)
356 check_function_exists(fsync             HAVE_FSYNC)
357 check_function_exists(_fileno           HAVE__FILENO)
358 check_function_exists(fileno            HAVE_FILENO)
359 check_function_exists(_commit           HAVE__COMMIT)
360 check_function_exists(sigaction         HAVE_SIGACTION)
361 check_function_exists(sysconf           HAVE_SYSCONF)
362 check_function_exists(sched_setaffinity HAVE_SCHED_SETAFFINITY)
363 check_function_exists(sched_getaffinity HAVE_SCHED_GETAFFINITY)
364 check_function_exists(rsqrt             HAVE_RSQRT)
365 check_function_exists(rsqrtf            HAVE_RSQRTF)
366 check_function_exists(sqrtf             HAVE_SQRTF)
367
368 include(CheckLibraryExists)
369 check_library_exists(m sqrt "" HAVE_LIBM)
370 check_library_exists(rt clock_gettime "" HAVE_CLOCK_GETTIME)
371
372
373 include(CheckTypeSize)
374
375 check_type_size("int"           SIZEOF_INT)
376 check_type_size("long int"      SIZEOF_LONG_INT)
377 check_type_size("long long int" SIZEOF_LONG_LONG_INT)
378 check_type_size("off_t"         SIZEOF_OFF_T)
379 check_type_size("void *"        SIZEOF_VOIDP)
380
381 include(TestBigEndian)
382 test_big_endian(GMX_INTEGER_BIG_ENDIAN)
383
384 # Management of GROMACS options for specific toolchains should go
385 # here. Because the initial settings for some of the main options have
386 # already happened, but things like library detection and MPI compiler
387 # feature detection have not, the docstrings for any over-rides of
388 # GROMACS defaults or user settings will make sense. Also, any
389 # toolchain-related reasons for choosing whether to detect various
390 # things can be sorted out now, before the detection takes place.
391 if(${CMAKE_SYSTEM_NAME} MATCHES BlueGene)
392     include(gmxManageBlueGene)
393 endif()
394
395 ########################################################################
396 #Process MPI settings
397 ########################################################################
398 include(gmxManageMPI)
399
400 ########################################################################
401 # Shared/static library settings
402 ########################################################################
403 # Determine the defaults (this block has no effect if the variables have
404 # already been set)
405 if(APPLE OR CYGWIN OR ${CMAKE_SYSTEM_NAME} MATCHES "Linux|.*BSD")
406     # Maybe Solaris should be here? Patch this if you know!
407     SET(SHARED_LIBS_DEFAULT ON)
408 elseif(WIN32 OR ${CMAKE_SYSTEM_NAME} MATCHES "BlueGene")
409     # Support for shared libs on native Windows is a bit new. Its
410     # default might change later if/when we sort things out. Also,
411     # Cray should go here. What variable value can detect it?
412     SET(SHARED_LIBS_DEFAULT OFF)
413 else()
414     if (NOT DEFINED BUILD_SHARED_LIBS)
415         message(STATUS "Defaulting to building static libraries")
416     endif()
417     SET(SHARED_LIBS_DEFAULT OFF)
418 endif()
419 if (GMX_PREFER_STATIC_LIBS)
420     if (NOT DEFINED BUILD_SHARED_LIBS AND SHARED_LIBS_DEFAULT)
421         message("Searching for static libraries requested, so the GROMACS libraries will also be built statically (BUILD_SHARED_LIBS=OFF)")
422     endif()
423     set(SHARED_LIBS_DEFAULT OFF)
424 endif()
425 set(GMX_PREFER_STATIC_LIBS_DEFAULT OFF)
426 if (WIN32 AND NOT CYGWIN AND NOT BUILD_SHARED_LIBS)
427     set(GMX_PREFER_STATIC_LIBS_DEFAULT ON)
428 endif()
429
430 # Declare the user-visible options
431 option(BUILD_SHARED_LIBS "Enable shared libraries (can be problematic e.g. with MPI, or on some HPC systems)" ${SHARED_LIBS_DEFAULT})
432 if (UNIX)
433     set(GMX_PREFER_STATIC_LIBS_DESCRIPTION
434         "When finding libraries prefer static archives (it will only work if static versions of external dependencies are available and found)")
435 elseif (WIN32 AND NOT CYGWIN)
436     set(GMX_PREFER_STATIC_LIBS_DESCRIPTION
437         "When finding libraries prefer static system libraries (MT instead of MD)")
438 endif()
439 option(GMX_PREFER_STATIC_LIBS "${GMX_PREFER_STATIC_LIBS_DESCRIPTION}"
440        ${GMX_PREFER_STATIC_LIBS_DEFAULT})
441 mark_as_advanced(GMX_PREFER_STATIC_LIBS)
442
443 # Act on the set values
444 if (UNIX AND GMX_PREFER_STATIC_LIBS)
445     if(BUILD_SHARED_LIBS)
446         # Warn the user about the combination. But don't overwrite the request.
447         message(WARNING "Searching for static libraries requested, and building shared Gromacs libraries requested. This might cause problems linking later.")
448     endif()
449     # On Linux .a is the static library suffix, on Mac OS X .lib can also
450     # be used, so we'll add both to the preference list.
451     SET(CMAKE_FIND_LIBRARY_SUFFIXES ".lib;.a" ${CMAKE_FIND_LIBRARY_SUFFIXES})
452 endif()
453 IF( WIN32 AND NOT CYGWIN)
454   if (NOT BUILD_SHARED_LIBS)
455       if(NOT GMX_PREFER_STATIC_LIBS)
456           message(WARNING "Shared system libraries requested, and static Gromacs libraries requested.")
457       endif()
458   else()
459       message(FATAL_ERROR "BUILD_SHARED_LIBS=ON not yet working for Windows in the master branch")
460       if(GMX_PREFER_STATIC_LIBS)
461           #this combination segfaults (illegal passing of file handles)
462           message(FATAL_ERROR "Static system libraries requested, and shared Gromacs libraries requested.")
463       endif()
464       add_definitions(-DUSE_VISIBILITY -DTMPI_USE_VISIBILITY)
465       set(PKG_CFLAGS "$PKG_CFLAGS -DUSE_VISIBILITY -DTMPI_USE_VISIBILITY")
466   endif()
467
468   IF (GMX_PREFER_STATIC_LIBS)
469       #Only setting Debug and Release flags. Others configurations are current not used.
470       STRING(REPLACE /MD /MT CMAKE_C_FLAGS_RELEASE ${CMAKE_C_FLAGS_RELEASE})
471       STRING(REPLACE /MD /MT CMAKE_C_FLAGS_DEBUG ${CMAKE_C_FLAGS_DEBUG})
472       STRING(REPLACE /MD /MT CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE})
473       STRING(REPLACE /MD /MT CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG})
474   ENDIF()
475   IF( CMAKE_C_COMPILER_ID MATCHES "Intel" )
476     if(BUILD_SHARED_LIBS) #not sure why incremental building with shared libs doesn't work
477         STRING(REPLACE "/INCREMENTAL:YES" "" CMAKE_SHARED_LINKER_FLAGS ${CMAKE_SHARED_LINKER_FLAGS})
478     endif()
479   ENDIF()
480 ENDIF()
481
482 ########################################################################
483 # Find external packages                                               #
484 ########################################################################
485
486 # Unconditionally find the package, as it is also required for unit tests
487 find_package(LibXml2)
488 option(GMX_XML "Use libxml2 to parse xml files (currently has no effect)" ${LIBXML2_FOUND})
489 set(PKG_XML "")
490 mark_as_advanced(GMX_XML)
491 # Don't actually do anything, since libxml2 is currently not used by libgromacs
492 #if(GMX_XML AND NOT LIBXML2_FOUND)
493 #    message(FATAL_ERROR "libxml2 not found. Set GMX_XML=OFF to compile without XML support")
494 #endif()
495 #if(GMX_XML)
496 #    include_directories(${LIBXML2_INCLUDE_DIR})
497 #    set(PKG_XML libxml-2.0)
498 #    set(XML_LIBRARIES ${LIBXML2_LIBRARIES})
499 #endif(GMX_XML)
500
501 option(GMX_GSL "Add support for gsl" OFF)
502 if (GMX_GSL)
503   find_package(GSL)
504   set(PKG_GSL "")
505   if(GSL_FOUND)
506     include_directories(${GSL_INCLUDE_DIR})
507     set(PKG_GSL gsl)
508     set(HAVE_LIBGSL 1)
509   endif(GSL_FOUND)
510 endif (GMX_GSL)
511
512 option(GMX_X11 "Use X window system" OFF)
513 if (GMX_X11)
514     find_package(X11)
515     # X11 includes/libraries are only set in the ngmx subdirectory!
516     if(NOT X11_FOUND)
517         message(FATAL_ERROR
518                 "X11 include files and/or libraries were not found. "
519                 "Set GMX_X11=OFF to compile without X11 support. "
520                 "gmx view will not be available.")
521     endif()
522     include_directories(${X11_INCLUDE_DIR})
523 endif(GMX_X11)
524
525 include(ThreadMPI)
526 set(THREAD_MPI_LIB thread_mpi)
527 # Enable core threading facilities
528 tmpi_enable_core("${CMAKE_SOURCE_DIR}/src/gromacs/legacyheaders")
529 # Enable tMPI C++ support
530 tmpi_enable_cxx()
531 if(GMX_THREAD_MPI)
532     # enable MPI functions
533     tmpi_enable()
534     set(PKG_CFLAGS "${PKG_CFLAGS} -DGMX_THREAD_MPI")
535     set(GMX_MPI 1)
536 endif(GMX_THREAD_MPI)
537 tmpi_get_source_list(THREAD_MPI_SRC)
538
539 if(GMX_GPU)
540     # now that we have detected the dependencies, do the second configure pass
541     gmx_gpu_setup()
542 endif(GMX_GPU)
543
544 if(CYGWIN)
545     set(GMX_CYGWIN 1)
546 endif(CYGWIN)
547
548 if(WIN32 AND NOT CYGWIN)
549     set(GMX_NATIVE_WINDOWS 1)
550     # This makes windows.h not declare min/max as macros that would break
551     # C++ code using std::min/std::max.
552     add_definitions(-DNOMINMAX)
553 endif()
554
555 # only bother with finding git and using version.h if the source is a git repo
556 if(GMX_GIT_VERSION_INFO)
557     if (NOT SOURCE_IS_GIT_REPOSITORY)
558         message(FATAL_ERROR
559             "Cannot generate git version information from source tree not under git. "
560             "Set GMX_GIT_VERSION_INFO=OFF to proceed.")
561     endif ()
562     # We need at least git v1.5.3 be able to parse git's date output. If not
563     # found or the version is too small, we can't generate version information.
564     find_package(Git)
565
566     # Find out the git version
567     if(GIT_FOUND AND NOT GIT_VERSION)
568       execute_process(COMMAND ${GIT_EXECUTABLE} "--version"
569         OUTPUT_VARIABLE _exec_out
570         OUTPUT_STRIP_TRAILING_WHITESPACE)
571       string(REGEX REPLACE "git version (.*)" "\\1" GIT_VERSION ${_exec_out})
572       set(GIT_VERSION ${GIT_VERSION} CACHE STRING "Git version")
573       mark_as_advanced(GIT_VERSION)
574     endif()
575
576     if(NOT GIT_FOUND OR GIT_VERSION VERSION_LESS "1.5.3")
577         message(FATAL_ERROR
578             "No compatible git version found (>= 1.5.3 required). "
579             "Won't be able to generate development version information. "
580             "Set GMX_GIT_VERSION_INFO=OFF to proceed.")
581     endif()
582 endif()
583
584 # Detect boost unless GMX_EXTERNAL_BOOST is explicitly OFF
585 # Used for default if GMX_EXTERNAL_BOOST is not defined (first CMake pass)
586 if(NOT DEFINED GMX_EXTERNAL_BOOST OR GMX_EXTERNAL_BOOST)
587     find_package(Boost 1.44.0)
588     if(Boost_FOUND AND Boost_VERSION VERSION_LESS "104400")
589         set(Boost_FOUND FALSE)
590     endif()
591     # Print the notification only on first run, when determining the default
592     if(NOT DEFINED GMX_EXTERNAL_BOOST AND NOT Boost_FOUND)
593         message("Boost >= 1.44 not found. Using minimal internal version. "
594                 "This may cause trouble if you plan on compiling/linking other "
595                 "software that uses Boost against Gromacs.")
596     endif()
597 endif()
598 option(GMX_EXTERNAL_BOOST "Use external Boost instead of minimal built-in version"
599        ${Boost_FOUND})
600 if(GMX_EXTERNAL_BOOST AND NOT Boost_FOUND)
601     message(FATAL_ERROR
602         "Boost >= 1.44 not found. "
603         "You can set GMX_EXTERNAL_BOOST=OFF to compile against minimal "
604         "version of Boost included with Gromacs.")
605 endif()
606
607 option(GMX_BUILD_UNITTESTS "Build unit tests with BUILD_TESTING (uses Google C++ Testing and Mocking Frameworks, requires libxml2)" ${LIBXML2_FOUND})
608 mark_as_advanced(GMX_BUILD_UNITTESTS)
609 gmx_add_cache_dependency(GMX_BUILD_UNITTESTS BOOL BUILD_TESTING OFF)
610 if (GMX_BUILD_UNITTESTS AND NOT LIBXML2_FOUND)
611     message(FATAL_ERROR
612         "Cannot build unit tests without libxml2. "
613         "Either set GMX_BUILD_UNITTESTS=OFF or tell CMake how to find libxml2.")
614 endif()
615
616 ########################################################################
617 # Generate development version info for cache
618 ########################################################################
619 # set(GEN_VERSION_INFO_INTERNAL "ON")
620 # include(gmxGenerateVersionString)
621
622 ########################################################################
623 # Our own GROMACS tests
624 ########################################################################
625
626 add_definitions( -DHAVE_CONFIG_H )
627 include_directories(${CMAKE_SOURCE_DIR}/src)
628 # Required for config.h, maybe should only be set in src/CMakeLists.txt
629 include_directories(${CMAKE_BINARY_DIR}/src)
630 # Required for gmx_header_config_gen.h to be found before installation
631 include_directories(${CMAKE_BINARY_DIR}/src/gromacs/utility)
632 # Required for now to make old code compile
633 include_directories(${CMAKE_SOURCE_DIR}/src/gromacs/legacyheaders)
634
635 include(gmxTestInlineASM)
636 gmx_test_inline_asm_gcc_x86(GMX_X86_GCC_INLINE_ASM)
637
638 include(gmxSetBuildInformation)
639 gmx_set_build_information()
640 if(BUILD_CPU_FEATURES MATCHES "rdtscp" AND NOT GMX_DISTRIBUTABLE_BUILD)
641     set(HAVE_RDTSCP 1)
642 endif(BUILD_CPU_FEATURES MATCHES "rdtscp" AND NOT GMX_DISTRIBUTABLE_BUILD)
643
644 include(gmxTestFloatFormat)
645 gmx_test_float_format(GMX_FLOAT_FORMAT_IEEE754
646                       GMX_IEEE754_BIG_ENDIAN_BYTE_ORDER
647                       GMX_IEEE754_BIG_ENDIAN_WORD_ORDER)
648
649 include(gmxTestLargeFiles)
650 gmx_test_large_files(GMX_LARGEFILES)
651
652 include(gmxTestSignal)
653 gmx_test_sigusr1(HAVE_SIGUSR1)
654
655 include(gmxTestInline)
656 gmx_test_inline(INLINE_KEYWORD)
657
658 include(gmxTestRestrict)
659 gmx_test_restrict(RESTRICT_KEYWORD)
660
661 include(gmxTestPipes)
662 gmx_test_pipes(HAVE_PIPES)
663
664 include(gmxTestIsfinite)
665 gmx_test_isfinite(HAVE_ISFINITE)
666 gmx_test__isfinite(HAVE__ISFINITE)
667 gmx_test__finite(HAVE__FINITE)
668
669 include(gmxTestCXX11)
670 gmx_test_cxx11(GMX_CXX11 GMX_CXX11_FLAGS)
671 if(CXX11_FLAG AND GMX_GPU)
672     #FIXME: add proper solution for progate all but cxx11 flag
673     set(CUDA_PROPAGATE_HOST_FLAGS no)
674     message(WARNING "Please manually add compiler flags to CUDA_NVCC_FLAGS. Automatic propogation temporary not working.")
675 endif()
676
677 include(gmxTestXDR)
678 gmx_test_xdr(GMX_SYSTEM_XDR)
679 if(NOT GMX_SYSTEM_XDR)
680     set(GMX_INTERNAL_XDR 1)
681     set(PKG_CFLAGS "${PKG_CFLAGS} -DGMX_INTERNAL_XDR")
682 endif(NOT GMX_SYSTEM_XDR)
683
684 # include avx test source, used if the AVX flags are set below
685 include(gmxTestAVXMaskload)
686
687 # Process nonbonded accelerated kernels settings
688 #
689 # Note that for the backward-compatible x86 SIMD architectures, the
690 # GMX_CPU_ACCELERATION determines the maximum level of the instruction
691 # set used (e.g. GMX_CPU_ACCLERATION=SSE4.1 implies
692 # SSE2). Accordingly, there are a set of CMake variables
693 # GMX_<arch>_<feature-set> that are exported to the C code to specify
694 # CPU features that should be used. This means that the logic for
695 # requiring such backward compatibility is all located here.
696 if(${GMX_CPU_ACCELERATION} STREQUAL "NONE")
697     # nothing to do
698     set(ACCELERATION_STATUS_MESSAGE "CPU acceleration disabled")
699
700 elseif(${GMX_CPU_ACCELERATION} STREQUAL "SSE2")
701
702     GMX_TEST_CFLAG(GNU_SSE2_CFLAG "-msse2" ACCELERATION_C_FLAGS)
703     if(NOT GNU_SSE2_CFLAG AND GMX_NATIVE_WINDOWS)
704         GMX_TEST_CFLAG(MSVC_SSE2_CFLAG "/arch:SSE2" ACCELERATION_C_FLAGS)
705     endif(NOT GNU_SSE2_CFLAG AND GMX_NATIVE_WINDOWS)
706
707     GMX_TEST_CXXFLAG(GNU_SSE2_CXXFLAG "-msse2" ACCELERATION_CXX_FLAGS)
708     if(NOT GNU_SSE2_CXXFLAG AND GMX_NATIVE_WINDOWS)
709         GMX_TEST_CXXFLAG(MSVC_SSE2_CXXFLAG "/arch:SSE2" ACCELERATION_CXX_FLAGS)
710     endif(NOT GNU_SSE2_CXXFLAG AND GMX_NATIVE_WINDOWS)
711
712     # We dont warn for lacking SSE2 flag support, since that is probably standard today.
713
714     # Only test the include after we have tried to add the correct flag for SSE2 support
715     check_include_file(emmintrin.h  HAVE_EMMINTRIN_H ${ACCELERATION_C_FLAGS})
716
717     if(NOT HAVE_EMMINTRIN_H)
718         message(FATAL_ERROR "Cannot find emmintrin.h, which is required for SSE2 intrinsics support.")
719     endif(NOT HAVE_EMMINTRIN_H)
720
721     set(GMX_CPU_ACCELERATION_X86_SSE2 1)
722     # The user should not be able to set this orthogonally to the acceleration
723     set(GMX_X86_SSE2 1)
724     set(ACCELERATION_STATUS_MESSAGE
725         "Enabling SSE2 Gromacs acceleration")
726
727 elseif(${GMX_CPU_ACCELERATION} STREQUAL "SSE4.1")
728
729     GMX_TEST_CFLAG(GNU_SSE4_CFLAG "-msse4.1" ACCELERATION_C_FLAGS)
730     if (NOT GNU_SSE4_CFLAG AND GMX_NATIVE_WINDOWS)
731         GMX_TEST_CFLAG(MSVC_SSE4_CFLAG "/arch:SSE4.1" ACCELERATION_C_FLAGS)
732     endif(NOT GNU_SSE4_CFLAG AND GMX_NATIVE_WINDOWS)
733     if (NOT GNU_SSE4_CFLAG AND NOT MSVC_SSE4_CFLAG)
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 first.
736         if (GMX_NATIVE_WINDOWS)
737             GMX_TEST_CFLAG(MSVC_SSE2_CFLAG "/arch:SSE2" ACCELERATION_C_FLAGS)
738             message(WARNING "Neither SSE4.1 or SSE2 seems to be supported by your Windows compiler. Something is likely broken.")
739         else()
740             message(WARNING "No C SSE4.1 flag found. Consider a newer compiler, or use SSE2 for slightly lower performance")
741         endif()
742     endif(NOT GNU_SSE4_CFLAG AND NOT MSVC_SSE4_CFLAG)
743
744     GMX_TEST_CXXFLAG(GNU_SSE4_CXXFLAG "-msse4.1" ACCELERATION_CXX_FLAGS)
745     if (NOT GNU_SSE4_CXXFLAG AND GMX_NATIVE_WINDOWS)
746         GMX_TEST_CXXFLAG(MSVC_SSE4_CXXFLAG "/arch:SSE4.1" ACCELERATION_CXX_FLAGS)
747     endif(NOT GNU_SSE4_CXXFLAG AND GMX_NATIVE_WINDOWS)
748     if (NOT GNU_SSE4_CXXFLAG AND NOT MSVC_SSE4_CXXFLAG)
749         message(WARNING "No C++ SSE4.1 flag found. Consider a newer compiler, or use SSE2 for slightly lower performance.")
750         # Not surprising if we end up here! MSVC current does not support the SSE4.1 flag. However, it appears to accept SSE4.1
751         # intrinsics when SSE2 support is enabled, so we try that instead.
752         if (GMX_NATIVE_WINDOWS)
753             GMX_TEST_CXXFLAG(MSVC_SSE2_CXXFLAG "/arch:SSE2" ACCELERATION_CXX_FLAGS)
754         endif()
755     endif(NOT GNU_SSE4_CXXFLAG AND NOT MSVC_SSE4_CXXFLAG)
756
757     # This must come after we have added the -msse4.1 flag on some platforms.
758     check_include_file(smmintrin.h  HAVE_SMMINTRIN_H ${ACCELERATION_C_FLAGS})
759
760     if(NOT HAVE_SMMINTRIN_H)
761         message(FATAL_ERROR "Cannot find smmintrin.h, which is required for SSE4.1 intrinsics support.")
762     endif(NOT HAVE_SMMINTRIN_H)
763
764     if(CMAKE_C_COMPILER_ID MATCHES "Intel" AND C_COMPILER_VERSION VERSION_EQUAL "11.1")
765         message(FATAL_ERROR "You are using Intel compiler version 11.1, and that compiler is known to produce incorrect results with SSE4.1 acceleration. You need to use another compiler (e.g. icc 12 or newer) or different acceleration (probably slower simulations).")
766     endif()
767
768     set(GMX_CPU_ACCELERATION_X86_SSE4_1 1)
769     # The user should not be able to set this orthogonally to the acceleration
770     set(GMX_X86_SSE4_1 1)
771     set(GMX_X86_SSE2   1)
772     set(ACCELERATION_STATUS_MESSAGE
773         "Enabling SSE4.1 Gromacs acceleration")
774
775 elseif(${GMX_CPU_ACCELERATION} STREQUAL "AVX_128_FMA" OR ${GMX_CPU_ACCELERATION} STREQUAL "AVX_256")
776
777     # Set the AVX compiler flag for both these choices!
778
779     GMX_TEST_CFLAG(GNU_AVX_CFLAG "-mavx" ACCELERATION_C_FLAGS)
780     if (NOT GNU_AVX_CFLAG AND GMX_NATIVE_WINDOWS)
781         GMX_TEST_CFLAG(MSVC_AVX_CFLAG "/arch:AVX" ACCELERATION_C_FLAGS)
782     endif (NOT GNU_AVX_CFLAG AND GMX_NATIVE_WINDOWS)
783     if (NOT GNU_AVX_CFLAG AND NOT MSVC_AVX_CFLAG)
784         message(WARNING "No C AVX flag found. Consider a newer compiler, or try SSE4.1 (lower performance) giving the -DGMX_CPU_ACCELERATION=SSE4.1 to cmake.")
785     endif (NOT GNU_AVX_CFLAG AND NOT MSVC_AVX_CFLAG)
786
787     GMX_TEST_CXXFLAG(GNU_AVX_CXXFLAG "-mavx" ACCELERATION_CXX_FLAGS)
788     if (NOT GNU_AVX_CXXFLAG AND GMX_NATIVE_WINDOWS)
789         GMX_TEST_CXXFLAG(MSVC_AVX_CXXFLAG "/arch:AVX" ACCELERATION_CXX_FLAGS)
790     endif (NOT GNU_AVX_CXXFLAG AND GMX_NATIVE_WINDOWS)
791     if (NOT GNU_AVX_CXXFLAG AND NOT MSVC_AVX_CXXFLAG)
792         message(WARNING "No C++ AVX flag found. Consider a newer compiler, or try SSE4.1 (lower performance) giving the -DGMX_CPU_ACCELERATION=SSE4.1 to cmake.")
793     endif (NOT GNU_AVX_CXXFLAG AND NOT MSVC_AVX_CXXFLAG)
794
795     # Set the FMA4 flags (MSVC doesn't require any)
796     if(${GMX_CPU_ACCELERATION} STREQUAL "AVX_128_FMA" AND NOT MSVC)
797         GMX_TEST_CFLAG(GNU_FMA_CFLAG "-mfma4" ACCELERATION_C_FLAGS)
798         if (NOT GNU_FMA_CFLAG)
799             message(WARNING "No C FMA4 flag found. Consider a newer compiler, or try SSE4.1 (lower performance).")
800         endif(NOT GNU_FMA_CFLAG)
801         GMX_TEST_CFLAG(GNU_XOP_CFLAG "-mxop" ACCELERATION_C_FLAGS)
802         # No big deal if we do not have xop, so no point yelling warnings about it.
803         GMX_TEST_CXXFLAG(GNU_FMA_CXXFLAG "-mfma4" ACCELERATION_CXX_FLAGS)
804         if (NOT GNU_FMA_CXXFLAG)
805             message(WARNING "No C++ FMA flag found. Consider a newer compiler, or try SSE4.1 (lower performance).")
806         endif (NOT GNU_FMA_CXXFLAG)
807         GMX_TEST_CXXFLAG(GNU_XOP_CXXFLAG "-mxop" ACCELERATION_CXX_FLAGS)
808         # No big deal if we do not have xop, so no point yelling warnings about it.
809     endif()
810
811     # Only test the header after we have tried to add the flag for AVX support
812     check_include_file(immintrin.h  HAVE_IMMINTRIN_H ${ACCELERATION_C_FLAGS})
813
814     if(NOT HAVE_IMMINTRIN_H)
815         message(FATAL_ERROR "Cannot find immintrin.h, which is required for AVX intrinsics support. Consider switching compiler.")
816     endif(NOT HAVE_IMMINTRIN_H)
817
818     if(${GMX_CPU_ACCELERATION} STREQUAL "AVX_256")
819         try_compile(TEST_AVX ${CMAKE_BINARY_DIR}
820             "${CMAKE_SOURCE_DIR}/cmake/TestAVX.c"
821             COMPILE_DEFINITIONS "${ACCELERATION_C_FLAGS}")
822         if(NOT TEST_AVX)
823             message(FATAL_ERROR "Cannot compile AVX intrinsics. Consider switching compiler.")
824         endif()
825     endif()
826
827     # GCC requires x86intrin.h for FMA support. MSVC 2010 requires intrin.h for FMA support.
828     check_include_file(x86intrin.h HAVE_X86INTRIN_H ${ACCELERATION_C_FLAGS})
829     check_include_file(intrin.h HAVE_INTRIN_H ${ACCELERATION_C_FLAGS})
830
831     # The user should not be able to set this orthogonally to the acceleration
832     set(GMX_X86_SSE4_1 1)
833     set(GMX_X86_SSE2   1)
834
835     # But just enable one of the choices internally...
836     if(${GMX_CPU_ACCELERATION} STREQUAL "AVX_128_FMA")
837         # We don't have the full compiler version string yet (BUILD_C_COMPILER),
838         # so we can't distinguish vanilla and Apple clang, but catering for AMD
839         # hackintoshes is not worth the effort.
840         if (APPLE AND (${CMAKE_C_COMPILER_ID} STREQUAL "Clang" OR
841                     ${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang"))
842             message(WARNING "Due to a known compiler bug, Clang up to version 3.2 (and Apple Clang up to version 4.1) produces incorrect code with AVX_128_FMA acceleration. As we can not work around this bug on OS X, you will have to select a different compiler or CPU acceleration.")
843         endif()
844
845         if (GMX_USE_CLANG_C_FMA_BUG_WORKAROUND)
846             # we assume that we have an external assembler that supports AVX
847             message(STATUS "Clang ${C_COMPILER_VERSION} detected, enabling FMA bug workaround")
848             set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -no-integrated-as")
849         endif()
850         if (GMX_USE_CLANG_CXX_FMA_BUG_WORKAROUND)
851             # we assume that we have an external assembler that supports AVX
852             message(STATUS "Clang ${CXX_COMPILER_VERSION} detected, enabling FMA bug workaround")
853             set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -no-integrated-as")
854         endif()
855
856         set(GMX_CPU_ACCELERATION_X86_AVX_128_FMA 1)
857         set(GMX_X86_AVX_128_FMA 1)
858         set(ACCELERATION_STATUS_MESSAGE
859             "Enabling 128-bit AVX Gromacs acceleration (with fused-multiply add)")
860
861     else()
862         # If we are not doing AVX_128, it must be AVX_256...
863         set(GMX_CPU_ACCELERATION_X86_AVX_256 1)
864         set(GMX_X86_AVX_256 1)
865         set(ACCELERATION_STATUS_MESSAGE
866             "Enabling 256-bit AVX Gromacs acceleration")
867     endif()
868
869     # Unfortunately gcc-4.5.2 and gcc-4.6.0 has a bug where they use the wrong datatype for the formal
870     # parameter of the mask for maskload/maskstore arguments. Check if this is present, since we can work around it.
871     gmx_test_avx_gcc_maskload_bug(${ACCELERATION_C_FLAGS} GMX_X86_AVX_GCC_MASKLOAD_BUG)
872
873 elseif(${GMX_CPU_ACCELERATION} STREQUAL "IBM_QPX")
874     try_compile(TEST_QPX ${CMAKE_BINARY_DIR}
875         "${CMAKE_SOURCE_DIR}/cmake/TestQPX.c")
876
877     if (TEST_QPX)
878         message(WARNING "IBM QPX acceleration was selected. This will work, but SIMD-accelerated kernels are only available for the Verlet cut-off scheme. The plain C kernels that are used for the group cut-off scheme kernels will be slow, so please consider using the Verlet cut-off scheme.")
879         set(GMX_CPU_ACCELERATION_IBM_QPX 1)
880     else()
881         message(FATAL_ERROR "Cannot compile the requested IBM QPX intrinsics. If you are compiling for BlueGene/Q with the XL compilers, use 'cmake .. -DCMAKE_TOOLCHAIN_FILE=Platform/BlueGeneQ-static-XL-C' to set up the tool chain.")
882     endif()
883 elseif(${GMX_CPU_ACCELERATION} STREQUAL "SPARC64_HPC_ACE")
884     set(GMX_CPU_ACCELERATION_SPARC64_HPC_ACE 1)
885 else()
886     gmx_invalid_option_value(GMX_CPU_ACCELERATION)
887 endif()
888 gmx_check_if_changed(ACCELERATION_CHANGED GMX_CPU_ACCELERATION)
889 if (ACCELERATION_CHANGED AND DEFINED ACCELERATION_STATUS_MESSAGE)
890     message(STATUS "${ACCELERATION_STATUS_MESSAGE}")
891 endif()
892
893 # Process QM/MM Settings
894 if(${GMX_QMMM_PROGRAM} STREQUAL "GAUSSIAN")
895     set(GMX_QMMM_GAUSSIAN 1)
896 elseif(${GMX_QMMM_PROGRAM} STREQUAL "MOPAC")
897     set(GMX_QMMM_MOPAC 1)
898 elseif(${GMX_QMMM_PROGRAM} STREQUAL "GAMESS")
899     set(GMX_QMMM_GAMESS 1)
900 elseif(${GMX_QMMM_PROGRAM} STREQUAL "ORCA")
901     set(GMX_QMMM_ORCA 1)
902 elseif(${GMX_QMMM_PROGRAM} STREQUAL "NONE")
903     # nothing to do
904 else()
905     gmx_invalid_option_value(GMX_QMMM_PROGRAM)
906 endif()
907
908 # Process FFT library settings
909 set(PKG_FFT "")
910 set(PKG_FFT_LIBS "")
911 # Intel 11 and up makes life somewhat easy if you just want to use
912 # all their stuff. It's not easy if you only want some of their
913 # stuff...
914 set(MKL_MANUALLY FALSE)
915 if (GMX_FFT_LIBRARY STREQUAL "MKL" AND
916     NOT (CMAKE_C_COMPILER_ID MATCHES "Intel" AND C_COMPILER_VERSION VERSION_GREATER "11"))
917     # The user will have to provide the set of magic libraries in
918     # MKL_LIBRARIES (see below), which we cache (non-advanced), so that they
919     # don't have to keep specifying it, and can easily see that
920     # CMake is still using that information.
921     set(MKL_MANUALLY TRUE)
922 endif()
923 set(MKL_LIBRARIES_FORMAT_DESCRIPTION "Use full paths to library files, in the right order, and separated by semicolons.")
924 gmx_dependent_cache_variable(
925     MKL_LIBRARIES
926     "List of libraries for linking to MKL. ${MKL_LIBRARIES_FORMAT_DESCRIPTION}"
927     STRING ""
928     MKL_MANUALLY)
929 gmx_dependent_cache_variable(
930     MKL_INCLUDE_DIR
931     "Path to mkl.h (non-inclusive)."
932     PATH ""
933     MKL_MANUALLY)
934 if(${GMX_FFT_LIBRARY} STREQUAL "FFTW3")
935     if(GMX_DOUBLE)
936         set(FFTW fftw)
937     else()
938         set(FFTW fftwf)
939     endif()
940
941     if(GMX_BUILD_OWN_FFTW)
942       add_subdirectory(src/contrib/fftw)
943     else()
944       find_package(FFTW COMPONENTS ${FFTW})
945     endif()
946
947     string(TOUPPER "${FFTW}" FFTW)
948     if(NOT ${FFTW}_FOUND)
949       MESSAGE(FATAL_ERROR "Cannot find FFTW 3 (with correct precision - libfftw3f for single-precision GROMACS or libfftw3 for double-precision GROMACS). Either choose the right precision, choose another FFT(W) library (-DGMX_FFT_LIBRARY), enable the advanced option to let GROMACS build FFTW 3 for you (-DGMX_BUILD_OWN_FFTW=ON) , or use the really slow GROMACS built-in fftpack library (-DGMX_FFT_LIBRARY=fftpack).")
950     endif()
951
952     set(PKG_FFT "${${FFTW}_PKG}")
953     include_directories(${${FFTW}_INCLUDE_DIRS})
954     set(FFT_LIBRARIES ${${FFTW}_LIBRARIES})
955     set(GMX_FFT_FFTW3 1)
956
957     if ((${GMX_CPU_ACCELERATION} MATCHES "SSE" OR ${GMX_CPU_ACCELERATION} MATCHES "AVX") AND NOT ${FFTW}_HAVE_SIMD)
958       message(WARNING "The fftw library found is compiled without SIMD support, which makes it slow. Consider recompiling it or contact your admin")
959     endif()
960
961     if((${GMX_CPU_ACCELERATION} MATCHES "SSE" OR ${GMX_CPU_ACCELERATION} MATCHES "AVX") AND ${FFTW}_HAVE_AVX)
962         # If we're not doing CPU acceleration, we don't care about FFTW performance on x86 either
963         message(WARNING "The FFTW library was compiled with --enable-avx to enable AVX SIMD instructions. That might sound like a good idea for your processor, but for FFTW versions up to 3.3.3, these are slower than the SSE/SSE2 SIMD instructions for the way GROMACS uses FFTs. Limitations in the way FFTW allows GROMACS to measure performance make it awkward for either GROMACS or FFTW to make the decision for you based on runtime performance. You should compile a different FFTW library with --enable-sse or --enable-sse2. If you have a more recent FFTW, you may like to compare the performance of GROMACS with FFTW libraries compiled with and without --enable-avx. However, the GROMACS developers do not really expect the FFTW AVX optimization to help, because the performance is limited by memory access, not computation.")
964     endif()
965
966     set(FFT_STATUS_MESSAGE "Using external FFT library - FFTW3")
967 elseif(${GMX_FFT_LIBRARY} STREQUAL "MKL")
968     # Intel 11 and up makes life somewhat easy if you just want to use
969     # all their stuff. It's not easy if you only want some of their
970     # stuff...
971     if (NOT MKL_MANUALLY)
972         # The next line takes care of everything for MKL
973         if (WIN32)
974             set(FFT_LINKER_FLAGS "/Qmkl=sequential")
975         else()
976             set(FFT_LINKER_FLAGS "-mkl=sequential")
977         endif()
978         # Some versions of icc require this in order that mkl.h can be
979         # found at compile time.
980         set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} ${FFT_LINKER_FLAGS}")
981
982         set(MKL_ERROR_MESSAGE "Make sure you have configured your compiler so that ${FFT_LINKER_FLAGS} will work.")
983     else()
984         include_directories(${MKL_INCLUDE_DIR})
985         set(FFT_LIBRARIES "${MKL_LIBRARIES}")
986         set(MKL_ERROR_MESSAGE "The include path to mkl.h in MKL_INCLUDE_DIR, and the link libraries in MKL_LIBRARIES=${MKL_LIBRARIES} need to match what the MKL documentation says you need for your system. ${MKL_LIBRARIES_FORMAT_DESCRIPTION}")
987         # Convert the semi-colon separated list to a list of
988         # command-line linker arguments so that code using our
989         # pkgconfig setup can use it.
990         string(REGEX REPLACE ";" " " PKG_FFT_LIBS "${MKL_LIBRARIES}")
991     endif()
992
993     # Check MKL works. If we were in a non-global scope, we wouldn't
994     # have to play nicely.
995     set(old_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
996     set(CMAKE_REQUIRED_FLAGS "${FFT_LINKER_FLAGS}")
997     set(old_CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES}")
998     set(CMAKE_REQUIRED_LIBRARIES "${FFT_LIBRARIES}")
999
1000     check_function_exists(DftiCreateDescriptor TEST_MKL)
1001
1002     set(CMAKE_REQUIRED_FLAGS "${old_CMAKE_REQUIRED_FLAGS}")
1003     set(CMAKE_REQUIRED_LIBRARIES "${old_CMAKE_REQUIRED_LIBRARIES}")
1004
1005     if(NOT TEST_MKL)
1006         # Hack to help the user vary MKL settings until they work.
1007         # TODO Make this logic more useful.
1008         unset(TEST_MKL CACHE)
1009         message(FATAL_ERROR "Linking with MKL was requested, but was not successful. ${MKL_ERROR_MESSAGE}")
1010     endif()
1011
1012     # Set variables to signal that we have MKL available and should use it for FFTs.
1013     set(GMX_FFT_MKL 1)
1014     set(HAVE_LIBMKL 1)
1015
1016     set(FFT_STATUS_MESSAGE "Using external FFT library - Intel MKL")
1017 elseif(${GMX_FFT_LIBRARY} STREQUAL "FFTPACK")
1018     set(GMX_FFT_FFTPACK 1)
1019     set(FFT_STATUS_MESSAGE "Using internal FFT library - fftpack")
1020 else(${GMX_FFT_LIBRARY} STREQUAL "FFTW3")
1021     gmx_invalid_option_value(GMX_FFT_LIBRARY)
1022 endif(${GMX_FFT_LIBRARY} STREQUAL "FFTW3")
1023 gmx_check_if_changed(FFT_CHANGED GMX_FFT_LIBRARY)
1024 if (FFT_CHANGED)
1025     message(STATUS "${FFT_STATUS_MESSAGE}")
1026 endif()
1027
1028 # enable threaded fftw3 if we've found it
1029 if(FFTW3_THREADS OR FFTW3F_THREADS)
1030     add_definitions(-DFFT5D_FFTW_THREADS)
1031 endif()
1032
1033 include(gmxManageLinearAlgebraLibraries)
1034
1035 # Whether GROMACS will really try to compile support for VMD plugins
1036 set(GMX_USE_PLUGINS OFF)
1037
1038 if(GMX_LOAD_PLUGINS)
1039   if(CYGWIN OR NOT WIN32)
1040     # Native Windows does not have, nor need dlopen
1041     # Note that WIN32 is set with Cygwin, but Cygwin needs dlopen to use plug-ins
1042     include(gmxTestdlopen)
1043     gmx_test_dlopen(HAVE_DLOPEN)
1044   endif()
1045
1046   # so, should we use plug-ins?
1047   if((WIN32 AND NOT CYGWIN) OR (HAVE_DLOPEN AND BUILD_SHARED_LIBS))
1048     if(NOT VMD_QUIETLY)
1049       MESSAGE(STATUS
1050           "Found the ability to use plug-ins when building shared libaries, "
1051           "so will compile to use plug-ins (e.g. to read VMD-supported file "
1052           "formats).")
1053     endif()
1054     if(NOT GMX_VMD_PLUGIN_PATH)
1055       find_package(VMD)
1056     endif()
1057     set(GMX_USE_PLUGINS ON)
1058     list(APPEND GMX_EXTRA_LIBRARIES ${CMAKE_DL_LIBS}) # magic cross-platform pre-set variable for dlopen library
1059     set(PKG_DL_LIBS "-l${CMAKE_DL_LIBS}")
1060   else()
1061     set(PKG_DL_LIBS)
1062   endif()
1063 endif(GMX_LOAD_PLUGINS)
1064 set(VMD_QUIETLY TRUE CACHE INTERNAL "")
1065
1066 # Link real-time library for POSIX timers. The check for clock_gettime
1067 # confirms the linkability of rt.
1068 if(HAVE_TIME_H AND HAVE_UNISTD_H AND HAVE_CLOCK_GETTIME)
1069     list(APPEND GMX_EXTRA_LIBRARIES rt)
1070 endif()
1071
1072 # Math and thread libraries must often come after all others when linking...
1073 if(HAVE_LIBM)
1074     list(APPEND GMX_EXTRA_LIBRARIES m)
1075 endif(HAVE_LIBM)
1076 if (${CMAKE_SYSTEM_NAME} MATCHES "BlueGene")
1077     check_library_exists(mass_simd atan2f4 "" HAVE_MASS_SIMD)
1078     if(HAVE_MASS_SIMD)
1079         list(APPEND GMX_EXTRA_LIBRARIES mass_simd)
1080     else()
1081         message(FATAL_ERROR "Could not link to the SIMD version of the IBM MASS library. Please adjust your CMAKE_PREFIX_PATH to contain it")
1082     endif()
1083 endif()
1084
1085 if(GMX_FAHCORE)
1086   set(COREWRAP_INCLUDE_DIR "${CMAKE_SOURCE_DIR}/../corewrap" CACHE STRING
1087       "Path to swindirect.h")
1088   include_directories(${COREWRAP_INCLUDE_DIR})
1089 endif(GMX_FAHCORE)
1090
1091 # # # # # # # # # # NO MORE TESTS AFTER THIS LINE! # # # # # # # # # # #
1092 # these are set after everything else
1093 if (NOT GMX_SKIP_DEFAULT_CFLAGS)
1094     set(CMAKE_C_FLAGS "${ACCELERATION_C_FLAGS} ${MPI_COMPILE_FLAGS} ${EXTRA_C_FLAGS} ${CMAKE_C_FLAGS}")
1095     set(CMAKE_CXX_FLAGS "${ACCELERATION_CXX_FLAGS} ${MPI_COMPILE_FLAGS} ${GMX_CXX11_FLAGS} ${EXTRA_CXX_FLAGS} ${CMAKE_CXX_FLAGS}")
1096     set(CMAKE_EXE_LINKER_FLAGS "${FFT_LINKER_FLAGS} ${MPI_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS}")
1097     set(CMAKE_SHARED_LINKER_FLAGS "${MPI_LINKER_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS}")
1098 else()
1099     message("Recommended flags which are not added because GMX_SKIP_DEFAULT_CFLAGS=yes:")
1100     message("CMAKE_C_FLAGS: ${ACCELERATION_C_FLAGS} ${MPI_COMPILE_FLAGS} ${EXTRA_C_FLAGS} ${GMXC_CFLAGS}")
1101     message("CMAKE_C_FLAGS_RELEASE: ${GMXC_CFLAGS_RELEASE}")
1102     message("CMAKE_C_FLAGS_DEBUG: ${GMXC_CFLAGS_DEBUG}")
1103     message("CMAKE_CXX_FLAGS: ${ACCELERATION_CXX_FLAGS} ${MPI_COMPILE_FLAGS} ${GMX_CXX11_FLAGS} ${EXTRA_CXX_FLAGS} ${GMXC_CXXFLAGS}")
1104     message("CMAKE_CXX_FLAGS_RELEASE: ${GMXC_CXXFLAGS_RELEASE}")
1105     message("CMAKE_CXX_FLAGS_DEBUG: ${GMXC_CXXFLAGS_DEBUG}")
1106     message("CMAKE_EXE_LINKER_FLAGS: ${FFT_LINKER_FLAGS} ${MPI_LINKER_FLAGS}")
1107     message("CMAKE_SHARED_LINKER_FLAGS: ${MPI_LINKER_FLAGS}")
1108 endif()
1109
1110 if(NOT GMX_OPENMP)
1111     #Unset all OpenMP flags in case OpenMP was disabled either by the user
1112     #or because it was only partially detected (e.g. only for C but not C++ compiler)
1113     unset(OpenMP_C_FLAGS CACHE) 
1114     unset(OpenMP_CXX_FLAGS CACHE)
1115 else()
1116     set(GMX_EXE_LINKER_FLAGS ${GMX_EXE_LINKER_FLAGS} ${OpenMP_LINKER_FLAGS})
1117     set(GMX_SHARED_LINKER_FLAGS ${GMX_SHARED_LINKER_FLAGS} ${OpenMP_SHARED_LINKER_FLAGS})
1118 endif()
1119 set(PKG_CFLAGS "${PKG_CFLAGS} ${OpenMP_C_FLAGS}")
1120
1121 ######################################
1122 # Output compiler and CFLAGS used
1123 ######################################
1124 get_compiler_info(C BUILD_C_COMPILER BUILD_CFLAGS)
1125 get_compiler_info(CXX BUILD_CXX_COMPILER BUILD_CXXFLAGS)
1126 if(GMX_GPU)
1127     get_cuda_compiler_info(CUDA_NVCC_COMPILER_INFO CUDA_NVCC_COMPILER_FLAGS)
1128 endif(GMX_GPU)
1129
1130 ########################################################################
1131 # Specify install locations
1132 ########################################################################
1133 set(GMX_LIB_INSTALL_DIR lib CACHE STRING
1134     "Library installation directory (default: lib)")
1135 set(GMX_DATA_INSTALL_DIR gromacs CACHE STRING
1136     "Data installation directory under share/ (default: gromacs)")
1137 mark_as_advanced(GMX_LIB_INSTALL_DIR GMX_DATA_INSTALL_DIR)
1138
1139 set(LIB_INSTALL_DIR  ${GMX_INSTALL_PREFIX}${GMX_LIB_INSTALL_DIR})
1140 set(BIN_INSTALL_DIR  ${GMX_INSTALL_PREFIX}bin)
1141 set(DATA_INSTALL_DIR ${GMX_INSTALL_PREFIX}share/${GMX_DATA_INSTALL_DIR})
1142 set(MAN_INSTALL_DIR  ${GMX_INSTALL_PREFIX}share/man)
1143 set(INCL_INSTALL_DIR ${GMX_INSTALL_PREFIX}include)
1144
1145 set(GMXLIB_SEARCH_DIR share/${GMX_DATA_INSTALL_DIR}/top)
1146 set(GMXLIB_FALLBACK   ${CMAKE_INSTALL_PREFIX}/${DATA_INSTALL_DIR}/top)
1147
1148 ########################################################################
1149 # Set up binary and library suffixing
1150 ########################################################################
1151 option(
1152     GMX_DEFAULT_SUFFIX
1153     "Use default suffixes for GROMACS binaries and libs (_d for double, _mpi for MPI; rerun cmake after changing to see relevant options)"
1154     ON)
1155 gmx_dependent_cache_variable(
1156     GMX_BINARY_SUFFIX
1157     "Suffix for GROMACS binaries (default: _d for double, _mpi for MPI, _mpi_d for MPI and double)."
1158     STRING ""
1159     "NOT GMX_DEFAULT_SUFFIX")
1160 gmx_dependent_cache_variable(
1161     GMX_LIBS_SUFFIX
1162     "Suffix for GROMACS libraries (default: _d for double, _mpi for MPI, _mpi_d for MPI and double)."
1163     STRING ""
1164     "NOT GMX_DEFAULT_SUFFIX")
1165 if (GMX_DEFAULT_SUFFIX)
1166   gmx_check_if_changed(SUFFIXES_CHANGED GMX_DEFAULT_SUFFIX)
1167   set(GMX_BINARY_SUFFIX "")
1168   set(GMX_LIBS_SUFFIX "")
1169   if (GMX_LIB_MPI)
1170     set(GMX_BINARY_SUFFIX "_mpi")
1171     set(GMX_LIBS_SUFFIX "_mpi")
1172   endif()
1173   if (GMX_DOUBLE)
1174     set (GMX_BINARY_SUFFIX "${GMX_BINARY_SUFFIX}_d")
1175     set (GMX_LIBS_SUFFIX "${GMX_LIBS_SUFFIX}_d")
1176   endif(GMX_DOUBLE)
1177   if (SUFFIXES_CHANGED)
1178     message(STATUS "Using default binary suffix: \"${GMX_BINARY_SUFFIX}\"")
1179     message(STATUS "Using default library suffix: \"${GMX_LIBS_SUFFIX}\"")
1180   endif ()
1181 else(GMX_DEFAULT_SUFFIX)
1182   gmx_check_if_changed(SUFFIXES_CHANGED
1183                        GMX_DEFAULT_SUFFIX GMX_BINARY_SUFFIX GMX_LIBS_SUFFIX)
1184   if (SUFFIXES_CHANGED)
1185     message(STATUS "Using manually set binary suffix: \"${GMX_BINARY_SUFFIX}\"")
1186     message(STATUS "Using manually set library suffix: \"${GMX_LIBS_SUFFIX}\"")
1187   endif ()
1188 endif(GMX_DEFAULT_SUFFIX)
1189 if (GMX_BUILD_MDRUN_ONLY)
1190     set(GMX_LIBS_SUFFIX "_mdrun${GMX_LIBS_SUFFIX}")
1191 endif ()
1192
1193 ##################################################################
1194 # Shared library settings
1195 ##################################################################
1196 if(NOT CMAKE_SYSTEM_NAME STREQUAL "Darwin")
1197     set(CMAKE_SKIP_BUILD_RPATH  FALSE)
1198     set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
1199     set(CMAKE_INSTALL_RPATH "\\\$ORIGIN/../${GMXLIB}")
1200     set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
1201 else()
1202     if(CMAKE_SYSTEM_VERSION VERSION_GREATER 8.0) #rpath supported for >10.4
1203         set(CMAKE_INSTALL_NAME_DIR "@rpath")
1204         set(GMX_EXE_LINKER_FLAGS ${GMX_EXE_LINKER_FLAGS} "-Wl,-rpath,@executable_path/../lib")
1205     else()
1206         set(CMAKE_INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/${LIB_INSTALL_DIR}")
1207     endif()
1208 endif()
1209
1210 #COPYING file: Only necessary for binary distributions.
1211 #Simpler to always install.
1212 install(FILES COPYING DESTINATION ${DATA_INSTALL_DIR} COMPONENT data)
1213
1214 if(GMX_EXTERNAL_BOOST)
1215     include_directories(${Boost_INCLUDE_DIRS})
1216 else()
1217     include_directories(${CMAKE_SOURCE_DIR}/src/external/boost)
1218     # typeid not supported for minimal internal version
1219     # (would add significant amount of code)
1220     add_definitions(-DBOOST_NO_TYPEID)
1221     # TODO: Propagate the above settings to the installed CMakeFiles.txt template
1222     # (from share/template/)
1223     set(PKG_CFLAGS "${PKG_CFLAGS} -DBOOST_NO_TYPEID -I${INCL_INSTALL_DIR}/gromacs/external/boost")
1224     if (NOT GMX_BUILD_MDRUN_ONLY)
1225         install(DIRECTORY ${CMAKE_SOURCE_DIR}/src/external/boost/boost
1226                 DESTINATION ${INCL_INSTALL_DIR}/gromacs/external/boost
1227                 COMPONENT development)
1228     endif ()
1229 endif()
1230
1231 if (GMX_BUILD_FOR_COVERAGE)
1232     # Code heavy with asserts makes conditional coverage close to useless metric,
1233     # as by design most of the false branches are impossible to trigger in
1234     # correctly functioning code.  And the benefit of testing those that could
1235     # be triggered by using an API against its specification isn't usually
1236     # worth the effort.
1237     add_definitions(-DNDEBUG -DBOOST_DISABLE_ASSERTS -DGMX_DISABLE_ASSERTS)
1238 endif ()
1239
1240 if (NOT GMX_BUILD_MDRUN_ONLY)
1241     add_subdirectory(doxygen)
1242     add_subdirectory(share)
1243     add_subdirectory(scripts)
1244 endif ()
1245 add_subdirectory(src)
1246
1247 # Issue a warning if NVIDIA GPUs were detected, but CUDA was not found.
1248 # Don't bother the user after the first configure pass.
1249 if ((CUDA_NOTFOUND_AUTO AND GMX_DETECT_GPU_AVAILABLE) AND NOT GMX_GPU_DETECTION_DONE)
1250     message(WARNING "${CUDA_NOTFOUND_MESSAGE}")
1251 endif()
1252 set(GMX_GPU_DETECTION_DONE TRUE CACHE INTERNAL "Whether GPU detection has already been done")
1253
1254 #######################
1255 ## uninstall target
1256 #######################
1257     CONFIGURE_FILE(
1258                    "${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in"
1259                    "${CMAKE_CURRENT_BINARY_DIR}/cmake/cmake_uninstall.cmake"
1260                    IMMEDIATE @ONLY)
1261 ###########################
1262 ADD_CUSTOM_TARGET(uninstall
1263                   "${CMAKE_COMMAND}" -P
1264                   "${CMAKE_CURRENT_BINARY_DIR}/cmake/cmake_uninstall.cmake")
1265 ###########################
1266
1267 ########################################################################
1268 # Tests                                                                #
1269 ########################################################################
1270
1271 IF(BUILD_TESTING)
1272     enable_testing()
1273     #"check" target builds and runs all tests
1274     add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} --output-on-failure)
1275     add_dependencies(check tests)
1276     # TODO: This would be better within tests/CMakeLists.txt
1277     if (NOT GMX_BUILD_MDRUN_ONLY)
1278         #gmxtests target builds all binaries required for running gmxtest
1279         add_custom_target(gmxtests DEPENDS gmx links)
1280         add_dependencies(check gmxtests)
1281         add_subdirectory(tests)
1282     endif()
1283     #TODO: Add warning if NOT REGRESSIONTEST_PATH OR NOT GMX_XML that regression/unit tests are not run.
1284 ENDIF()
1285
1286 ########################################################################
1287 # Manual                                                               #
1288 ########################################################################
1289
1290 option(GMX_BUILD_MANUAL "Whether to try to configure to build the PDF manual" OFF)
1291 mark_as_advanced(GMX_BUILD_MANUAL)
1292 if(GMX_BUILD_MANUAL)
1293     # Make sure we only do detection of manual-building dependencies
1294     # when the user opted in for that.
1295     add_subdirectory(manual)
1296 endif()