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(WARNING "X11 include files and/or libraries were not found. Will not build the GROMACS X11-binaries, such as ngmx")
518     else()
519         set(HAVE_X11 1)
520         include_directories(${X11_INCLUDE_DIR})
521     endif()
522 endif(GMX_X11)
523
524 include(ThreadMPI)
525 set(THREAD_MPI_LIB thread_mpi)
526 # Enable core threading facilities
527 tmpi_enable_core("${CMAKE_SOURCE_DIR}/src/gromacs/legacyheaders")
528 # Enable tMPI C++ support
529 tmpi_enable_cxx()
530 if(GMX_THREAD_MPI)
531     # enable MPI functions
532     tmpi_enable()
533     set(PKG_CFLAGS "${PKG_CFLAGS} -DGMX_THREAD_MPI")
534     set(GMX_MPI 1)
535 endif(GMX_THREAD_MPI)
536 tmpi_get_source_list(THREAD_MPI_SRC)
537
538 if(GMX_GPU)
539     # now that we have detected the dependencies, do the second configure pass
540     gmx_gpu_setup()
541 endif(GMX_GPU)
542
543 if(CYGWIN)
544     set(GMX_CYGWIN 1)
545 endif(CYGWIN)
546
547 if(WIN32 AND NOT CYGWIN)
548     set(GMX_NATIVE_WINDOWS 1)
549     # This makes windows.h not declare min/max as macros that would break
550     # C++ code using std::min/std::max.
551     add_definitions(-DNOMINMAX)
552 endif()
553
554 # only bother with finding git and using version.h if the source is a git repo
555 if(GMX_GIT_VERSION_INFO)
556     if (NOT SOURCE_IS_GIT_REPOSITORY)
557         message(FATAL_ERROR
558             "Cannot generate git version information from source tree not under git. "
559             "Set GMX_GIT_VERSION_INFO=OFF to proceed.")
560     endif ()
561     # We need at least git v1.5.3 be able to parse git's date output. If not
562     # found or the version is too small, we can't generate version information.
563     find_package(Git)
564
565     # Find out the git version
566     if(GIT_FOUND AND NOT GIT_VERSION)
567       execute_process(COMMAND ${GIT_EXECUTABLE} "--version"
568         OUTPUT_VARIABLE _exec_out
569         OUTPUT_STRIP_TRAILING_WHITESPACE)
570       string(REGEX REPLACE "git version (.*)" "\\1" GIT_VERSION ${_exec_out})
571       set(GIT_VERSION ${GIT_VERSION} CACHE STRING "Git version")
572       mark_as_advanced(GIT_VERSION)
573     endif()
574
575     if(NOT GIT_FOUND OR GIT_VERSION VERSION_LESS "1.5.3")
576         message(FATAL_ERROR
577             "No compatible git version found (>= 1.5.3 required). "
578             "Won't be able to generate development version information. "
579             "Set GMX_GIT_VERSION_INFO=OFF to proceed.")
580     endif()
581 endif()
582
583 # Detect boost unless GMX_EXTERNAL_BOOST is explicitly OFF
584 # Used for default if GMX_EXTERNAL_BOOST is not defined (first CMake pass)
585 if(NOT DEFINED GMX_EXTERNAL_BOOST OR GMX_EXTERNAL_BOOST)
586     find_package(Boost 1.44.0)
587     if(Boost_FOUND AND Boost_VERSION VERSION_LESS "104400")
588         set(Boost_FOUND FALSE)
589     endif()
590     # Print the notification only on first run, when determining the default
591     if(NOT DEFINED GMX_EXTERNAL_BOOST AND NOT Boost_FOUND)
592         message("Boost >= 1.44 not found. Using minimal internal version. "
593                 "This may cause trouble if you plan on compiling/linking other "
594                 "software that uses Boost against Gromacs.")
595     endif()
596 endif()
597 option(GMX_EXTERNAL_BOOST "Use external Boost instead of minimal built-in version"
598        ${Boost_FOUND})
599 if(GMX_EXTERNAL_BOOST AND NOT Boost_FOUND)
600     message(FATAL_ERROR
601         "Boost >= 1.44 not found. "
602         "You can set GMX_EXTERNAL_BOOST=OFF to compile against minimal "
603         "version of Boost included with Gromacs.")
604 endif()
605
606 option(GMX_BUILD_UNITTESTS "Build unit tests with BUILD_TESTING (uses Google C++ Testing and Mocking Frameworks, requires libxml2)" ${LIBXML2_FOUND})
607 mark_as_advanced(GMX_BUILD_UNITTESTS)
608 gmx_add_cache_dependency(GMX_BUILD_UNITTESTS BOOL BUILD_TESTING OFF)
609 if (GMX_BUILD_UNITTESTS AND NOT LIBXML2_FOUND)
610     message(FATAL_ERROR
611         "Cannot build unit tests without libxml2. "
612         "Either set GMX_BUILD_UNITTESTS=OFF or tell CMake how to find libxml2.")
613 endif()
614
615 ########################################################################
616 # Generate development version info for cache
617 ########################################################################
618 # set(GEN_VERSION_INFO_INTERNAL "ON")
619 # include(gmxGenerateVersionString)
620
621 ########################################################################
622 # Our own GROMACS tests
623 ########################################################################
624
625 add_definitions( -DHAVE_CONFIG_H )
626 include_directories(${CMAKE_SOURCE_DIR}/src)
627 # Required for config.h, maybe should only be set in src/CMakeLists.txt
628 include_directories(${CMAKE_BINARY_DIR}/src)
629 # Required for gmx_header_config_gen.h to be found before installation
630 include_directories(${CMAKE_BINARY_DIR}/src/gromacs/utility)
631 # Required for now to make old code compile
632 include_directories(${CMAKE_SOURCE_DIR}/src/gromacs/legacyheaders)
633
634 include(gmxTestInlineASM)
635 gmx_test_inline_asm_gcc_x86(GMX_X86_GCC_INLINE_ASM)
636
637 include(gmxSetBuildInformation)
638 gmx_set_build_information()
639 if(BUILD_CPU_FEATURES MATCHES "rdtscp" AND NOT GMX_DISTRIBUTABLE_BUILD)
640     set(HAVE_RDTSCP 1)
641 endif(BUILD_CPU_FEATURES MATCHES "rdtscp" AND NOT GMX_DISTRIBUTABLE_BUILD)
642
643 include(gmxTestFloatFormat)
644 gmx_test_float_format(GMX_FLOAT_FORMAT_IEEE754
645                       GMX_IEEE754_BIG_ENDIAN_BYTE_ORDER
646                       GMX_IEEE754_BIG_ENDIAN_WORD_ORDER)
647
648 include(gmxTestLargeFiles)
649 gmx_test_large_files(GMX_LARGEFILES)
650
651 include(gmxTestSignal)
652 gmx_test_sigusr1(HAVE_SIGUSR1)
653
654 include(gmxTestInline)
655 gmx_test_inline(INLINE_KEYWORD)
656
657 include(gmxTestRestrict)
658 gmx_test_restrict(RESTRICT_KEYWORD)
659
660 include(gmxTestPipes)
661 gmx_test_pipes(HAVE_PIPES)
662
663 include(gmxTestIsfinite)
664 gmx_test_isfinite(HAVE_ISFINITE)
665 gmx_test__isfinite(HAVE__ISFINITE)
666 gmx_test__finite(HAVE__FINITE)
667
668 include(gmxTestCXX11)
669 gmx_test_cxx11(GMX_CXX11 GMX_CXX11_FLAGS)
670 if(CXX11_FLAG AND GMX_GPU)
671     #FIXME: add proper solution for progate all but cxx11 flag
672     set(CUDA_PROPAGATE_HOST_FLAGS no)
673     message(WARNING "Please manually add compiler flags to CUDA_NVCC_FLAGS. Automatic propogation temporary not working.")
674 endif()
675
676 include(gmxTestXDR)
677 gmx_test_xdr(GMX_SYSTEM_XDR)
678 if(NOT GMX_SYSTEM_XDR)
679     set(GMX_INTERNAL_XDR 1)
680     set(PKG_CFLAGS "${PKG_CFLAGS} -DGMX_INTERNAL_XDR")
681 endif(NOT GMX_SYSTEM_XDR)
682
683 # include avx test source, used if the AVX flags are set below
684 include(gmxTestAVXMaskload)
685
686 # Process nonbonded accelerated kernels settings
687 #
688 # Note that for the backward-compatible x86 SIMD architectures, the
689 # GMX_CPU_ACCELERATION determines the maximum level of the instruction
690 # set used (e.g. GMX_CPU_ACCLERATION=SSE4.1 implies
691 # SSE2). Accordingly, there are a set of CMake variables
692 # GMX_<arch>_<feature-set> that are exported to the C code to specify
693 # CPU features that should be used. This means that the logic for
694 # requiring such backward compatibility is all located here.
695 if(${GMX_CPU_ACCELERATION} STREQUAL "NONE")
696     # nothing to do
697     set(ACCELERATION_STATUS_MESSAGE "CPU acceleration disabled")
698
699 elseif(${GMX_CPU_ACCELERATION} STREQUAL "SSE2")
700
701     GMX_TEST_CFLAG(GNU_SSE2_CFLAG "-msse2" ACCELERATION_C_FLAGS)
702     if(NOT GNU_SSE2_CFLAG AND GMX_NATIVE_WINDOWS)
703         GMX_TEST_CFLAG(MSVC_SSE2_CFLAG "/arch:SSE2" ACCELERATION_C_FLAGS)
704     endif(NOT GNU_SSE2_CFLAG AND GMX_NATIVE_WINDOWS)
705
706     GMX_TEST_CXXFLAG(GNU_SSE2_CXXFLAG "-msse2" ACCELERATION_CXX_FLAGS)
707     if(NOT GNU_SSE2_CXXFLAG AND GMX_NATIVE_WINDOWS)
708         GMX_TEST_CXXFLAG(MSVC_SSE2_CXXFLAG "/arch:SSE2" ACCELERATION_CXX_FLAGS)
709     endif(NOT GNU_SSE2_CXXFLAG AND GMX_NATIVE_WINDOWS)
710
711     # We dont warn for lacking SSE2 flag support, since that is probably standard today.
712
713     # Only test the include after we have tried to add the correct flag for SSE2 support
714     check_include_file(emmintrin.h  HAVE_EMMINTRIN_H ${ACCELERATION_C_FLAGS})
715
716     if(NOT HAVE_EMMINTRIN_H)
717         message(FATAL_ERROR "Cannot find emmintrin.h, which is required for SSE2 intrinsics support.")
718     endif(NOT HAVE_EMMINTRIN_H)
719
720     set(GMX_CPU_ACCELERATION_X86_SSE2 1)
721     # The user should not be able to set this orthogonally to the acceleration
722     set(GMX_X86_SSE2 1)
723     set(ACCELERATION_STATUS_MESSAGE
724         "Enabling SSE2 Gromacs acceleration")
725
726 elseif(${GMX_CPU_ACCELERATION} STREQUAL "SSE4.1")
727
728     GMX_TEST_CFLAG(GNU_SSE4_CFLAG "-msse4.1" ACCELERATION_C_FLAGS)
729     if (NOT GNU_SSE4_CFLAG AND GMX_NATIVE_WINDOWS)
730         GMX_TEST_CFLAG(MSVC_SSE4_CFLAG "/arch:SSE4.1" ACCELERATION_C_FLAGS)
731     endif(NOT GNU_SSE4_CFLAG AND GMX_NATIVE_WINDOWS)
732     if (NOT GNU_SSE4_CFLAG AND NOT MSVC_SSE4_CFLAG)
733         # Not surprising if we end up here! MSVC current does not support the SSE4.1 flag. However, it appears to accept SSE4.1
734         # intrinsics when SSE2 support is enabled, so we try that instead first.
735         if (GMX_NATIVE_WINDOWS)
736             GMX_TEST_CFLAG(MSVC_SSE2_CFLAG "/arch:SSE2" ACCELERATION_C_FLAGS)
737             message(WARNING "Neither SSE4.1 or SSE2 seems to be supported by your Windows compiler. Something is likely broken.")
738         else()
739             message(WARNING "No C SSE4.1 flag found. Consider a newer compiler, or use SSE2 for slightly lower performance")
740         endif()
741     endif(NOT GNU_SSE4_CFLAG AND NOT MSVC_SSE4_CFLAG)
742
743     GMX_TEST_CXXFLAG(GNU_SSE4_CXXFLAG "-msse4.1" ACCELERATION_CXX_FLAGS)
744     if (NOT GNU_SSE4_CXXFLAG AND GMX_NATIVE_WINDOWS)
745         GMX_TEST_CXXFLAG(MSVC_SSE4_CXXFLAG "/arch:SSE4.1" ACCELERATION_CXX_FLAGS)
746     endif(NOT GNU_SSE4_CXXFLAG AND GMX_NATIVE_WINDOWS)
747     if (NOT GNU_SSE4_CXXFLAG AND NOT MSVC_SSE4_CXXFLAG)
748         message(WARNING "No C++ SSE4.1 flag found. Consider a newer compiler, or use SSE2 for slightly lower performance.")
749         # Not surprising if we end up here! MSVC current does not support the SSE4.1 flag. However, it appears to accept SSE4.1
750         # intrinsics when SSE2 support is enabled, so we try that instead.
751         if (GMX_NATIVE_WINDOWS)
752             GMX_TEST_CXXFLAG(MSVC_SSE2_CXXFLAG "/arch:SSE2" ACCELERATION_CXX_FLAGS)
753         endif()
754     endif(NOT GNU_SSE4_CXXFLAG AND NOT MSVC_SSE4_CXXFLAG)
755
756     # This must come after we have added the -msse4.1 flag on some platforms.
757     check_include_file(smmintrin.h  HAVE_SMMINTRIN_H ${ACCELERATION_C_FLAGS})
758
759     if(NOT HAVE_SMMINTRIN_H)
760         message(FATAL_ERROR "Cannot find smmintrin.h, which is required for SSE4.1 intrinsics support.")
761     endif(NOT HAVE_SMMINTRIN_H)
762
763     if(CMAKE_C_COMPILER_ID MATCHES "Intel" AND C_COMPILER_VERSION VERSION_EQUAL "11.1")
764         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).")
765     endif()
766
767     set(GMX_CPU_ACCELERATION_X86_SSE4_1 1)
768     # The user should not be able to set this orthogonally to the acceleration
769     set(GMX_X86_SSE4_1 1)
770     set(GMX_X86_SSE2   1)
771     set(ACCELERATION_STATUS_MESSAGE
772         "Enabling SSE4.1 Gromacs acceleration")
773
774 elseif(${GMX_CPU_ACCELERATION} STREQUAL "AVX_128_FMA" OR ${GMX_CPU_ACCELERATION} STREQUAL "AVX_256")
775
776     # Set the AVX compiler flag for both these choices!
777
778     GMX_TEST_CFLAG(GNU_AVX_CFLAG "-mavx" ACCELERATION_C_FLAGS)
779     if (NOT GNU_AVX_CFLAG AND GMX_NATIVE_WINDOWS)
780         GMX_TEST_CFLAG(MSVC_AVX_CFLAG "/arch:AVX" ACCELERATION_C_FLAGS)
781     endif (NOT GNU_AVX_CFLAG AND GMX_NATIVE_WINDOWS)
782     if (NOT GNU_AVX_CFLAG AND NOT MSVC_AVX_CFLAG)
783         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.")
784     endif (NOT GNU_AVX_CFLAG AND NOT MSVC_AVX_CFLAG)
785
786     GMX_TEST_CXXFLAG(GNU_AVX_CXXFLAG "-mavx" ACCELERATION_CXX_FLAGS)
787     if (NOT GNU_AVX_CXXFLAG AND GMX_NATIVE_WINDOWS)
788         GMX_TEST_CXXFLAG(MSVC_AVX_CXXFLAG "/arch:AVX" ACCELERATION_CXX_FLAGS)
789     endif (NOT GNU_AVX_CXXFLAG AND GMX_NATIVE_WINDOWS)
790     if (NOT GNU_AVX_CXXFLAG AND NOT MSVC_AVX_CXXFLAG)
791         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.")
792     endif (NOT GNU_AVX_CXXFLAG AND NOT MSVC_AVX_CXXFLAG)
793
794     # Set the FMA4 flags (MSVC doesn't require any)
795     if(${GMX_CPU_ACCELERATION} STREQUAL "AVX_128_FMA" AND NOT MSVC)
796         GMX_TEST_CFLAG(GNU_FMA_CFLAG "-mfma4" ACCELERATION_C_FLAGS)
797         if (NOT GNU_FMA_CFLAG)
798             message(WARNING "No C FMA4 flag found. Consider a newer compiler, or try SSE4.1 (lower performance).")
799         endif(NOT GNU_FMA_CFLAG)
800         GMX_TEST_CFLAG(GNU_XOP_CFLAG "-mxop" ACCELERATION_C_FLAGS)
801         # No big deal if we do not have xop, so no point yelling warnings about it.
802         GMX_TEST_CXXFLAG(GNU_FMA_CXXFLAG "-mfma4" ACCELERATION_CXX_FLAGS)
803         if (NOT GNU_FMA_CXXFLAG)
804             message(WARNING "No C++ FMA flag found. Consider a newer compiler, or try SSE4.1 (lower performance).")
805         endif (NOT GNU_FMA_CXXFLAG)
806         GMX_TEST_CXXFLAG(GNU_XOP_CXXFLAG "-mxop" ACCELERATION_CXX_FLAGS)
807         # No big deal if we do not have xop, so no point yelling warnings about it.
808     endif()
809
810     # Only test the header after we have tried to add the flag for AVX support
811     check_include_file(immintrin.h  HAVE_IMMINTRIN_H ${ACCELERATION_C_FLAGS})
812
813     if(NOT HAVE_IMMINTRIN_H)
814         message(FATAL_ERROR "Cannot find immintrin.h, which is required for AVX intrinsics support. Consider switching compiler.")
815     endif(NOT HAVE_IMMINTRIN_H)
816
817     if(${GMX_CPU_ACCELERATION} STREQUAL "AVX_256")
818         try_compile(TEST_AVX ${CMAKE_BINARY_DIR}
819             "${CMAKE_SOURCE_DIR}/cmake/TestAVX.c"
820             COMPILE_DEFINITIONS "${ACCELERATION_C_FLAGS}")
821         if(NOT TEST_AVX)
822             message(FATAL_ERROR "Cannot compile AVX intrinsics. Consider switching compiler.")
823         endif()
824     endif()
825
826     # GCC requires x86intrin.h for FMA support. MSVC 2010 requires intrin.h for FMA support.
827     check_include_file(x86intrin.h HAVE_X86INTRIN_H ${ACCELERATION_C_FLAGS})
828     check_include_file(intrin.h HAVE_INTRIN_H ${ACCELERATION_C_FLAGS})
829
830     # The user should not be able to set this orthogonally to the acceleration
831     set(GMX_X86_SSE4_1 1)
832     set(GMX_X86_SSE2   1)
833
834     # But just enable one of the choices internally...
835     if(${GMX_CPU_ACCELERATION} STREQUAL "AVX_128_FMA")
836         # We don't have the full compiler version string yet (BUILD_C_COMPILER),
837         # so we can't distinguish vanilla and Apple clang, but catering for AMD
838         # hackintoshes is not worth the effort.
839         if (APPLE AND (${CMAKE_C_COMPILER_ID} STREQUAL "Clang" OR
840                     ${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang"))
841             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.")
842         endif()
843
844         if (GMX_USE_CLANG_C_FMA_BUG_WORKAROUND)
845             # we assume that we have an external assembler that supports AVX
846             message(STATUS "Clang ${C_COMPILER_VERSION} detected, enabling FMA bug workaround")
847             set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -no-integrated-as")
848         endif()
849         if (GMX_USE_CLANG_CXX_FMA_BUG_WORKAROUND)
850             # we assume that we have an external assembler that supports AVX
851             message(STATUS "Clang ${CXX_COMPILER_VERSION} detected, enabling FMA bug workaround")
852             set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -no-integrated-as")
853         endif()
854
855         set(GMX_CPU_ACCELERATION_X86_AVX_128_FMA 1)
856         set(GMX_X86_AVX_128_FMA 1)
857         set(ACCELERATION_STATUS_MESSAGE
858             "Enabling 128-bit AVX Gromacs acceleration (with fused-multiply add)")
859
860     else()
861         # If we are not doing AVX_128, it must be AVX_256...
862         set(GMX_CPU_ACCELERATION_X86_AVX_256 1)
863         set(GMX_X86_AVX_256 1)
864         set(ACCELERATION_STATUS_MESSAGE
865             "Enabling 256-bit AVX Gromacs acceleration")
866     endif()
867
868     # Unfortunately gcc-4.5.2 and gcc-4.6.0 has a bug where they use the wrong datatype for the formal
869     # parameter of the mask for maskload/maskstore arguments. Check if this is present, since we can work around it.
870     gmx_test_avx_gcc_maskload_bug(${ACCELERATION_C_FLAGS} GMX_X86_AVX_GCC_MASKLOAD_BUG)
871
872 elseif(${GMX_CPU_ACCELERATION} STREQUAL "IBM_QPX")
873     try_compile(TEST_QPX ${CMAKE_BINARY_DIR}
874         "${CMAKE_SOURCE_DIR}/cmake/TestQPX.c")
875
876     if (TEST_QPX)
877         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.")
878         set(GMX_CPU_ACCELERATION_IBM_QPX 1)
879     else()
880         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.")
881     endif()
882 elseif(${GMX_CPU_ACCELERATION} STREQUAL "SPARC64_HPC_ACE")
883     set(GMX_CPU_ACCELERATION_SPARC64_HPC_ACE 1)
884 else()
885     gmx_invalid_option_value(GMX_CPU_ACCELERATION)
886 endif()
887 gmx_check_if_changed(ACCELERATION_CHANGED GMX_CPU_ACCELERATION)
888 if (ACCELERATION_CHANGED AND DEFINED ACCELERATION_STATUS_MESSAGE)
889     message(STATUS "${ACCELERATION_STATUS_MESSAGE}")
890 endif()
891
892 # Process QM/MM Settings
893 if(${GMX_QMMM_PROGRAM} STREQUAL "GAUSSIAN")
894     set(GMX_QMMM_GAUSSIAN 1)
895 elseif(${GMX_QMMM_PROGRAM} STREQUAL "MOPAC")
896     set(GMX_QMMM_MOPAC 1)
897 elseif(${GMX_QMMM_PROGRAM} STREQUAL "GAMESS")
898     set(GMX_QMMM_GAMESS 1)
899 elseif(${GMX_QMMM_PROGRAM} STREQUAL "ORCA")
900     set(GMX_QMMM_ORCA 1)
901 elseif(${GMX_QMMM_PROGRAM} STREQUAL "NONE")
902     # nothing to do
903 else()
904     gmx_invalid_option_value(GMX_QMMM_PROGRAM)
905 endif()
906
907 # Process FFT library settings
908 set(PKG_FFT "")
909 set(PKG_FFT_LIBS "")
910 # Intel 11 and up makes life somewhat easy if you just want to use
911 # all their stuff. It's not easy if you only want some of their
912 # stuff...
913 set(MKL_MANUALLY FALSE)
914 if (GMX_FFT_LIBRARY STREQUAL "MKL" AND
915     NOT (CMAKE_C_COMPILER_ID MATCHES "Intel" AND C_COMPILER_VERSION VERSION_GREATER "11"))
916     # The user will have to provide the set of magic libraries in
917     # MKL_LIBRARIES (see below), which we cache (non-advanced), so that they
918     # don't have to keep specifying it, and can easily see that
919     # CMake is still using that information.
920     set(MKL_MANUALLY TRUE)
921 endif()
922 set(MKL_LIBRARIES_FORMAT_DESCRIPTION "Use full paths to library files, in the right order, and separated by semicolons.")
923 gmx_dependent_cache_variable(
924     MKL_LIBRARIES
925     "List of libraries for linking to MKL. ${MKL_LIBRARIES_FORMAT_DESCRIPTION}"
926     STRING ""
927     MKL_MANUALLY)
928 gmx_dependent_cache_variable(
929     MKL_INCLUDE_DIR
930     "Path to mkl.h (non-inclusive)."
931     PATH ""
932     MKL_MANUALLY)
933 if(${GMX_FFT_LIBRARY} STREQUAL "FFTW3")
934     if(GMX_DOUBLE)
935         set(FFTW fftw)
936     else()
937         set(FFTW fftwf)
938     endif()
939
940     if(GMX_BUILD_OWN_FFTW)
941       add_subdirectory(src/contrib/fftw)
942     else()
943       find_package(FFTW COMPONENTS ${FFTW})
944     endif()
945
946     string(TOUPPER "${FFTW}" FFTW)
947     if(NOT ${FFTW}_FOUND)
948       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).")
949     endif()
950
951     set(PKG_FFT "${${FFTW}_PKG}")
952     include_directories(${${FFTW}_INCLUDE_DIRS})
953     set(FFT_LIBRARIES ${${FFTW}_LIBRARIES})
954     set(GMX_FFT_FFTW3 1)
955
956     if ((${GMX_CPU_ACCELERATION} MATCHES "SSE" OR ${GMX_CPU_ACCELERATION} MATCHES "AVX") AND NOT ${FFTW}_HAVE_SIMD)
957       message(WARNING "The fftw library found is compiled without SIMD support, which makes it slow. Consider recompiling it or contact your admin")
958     endif()
959
960     if((${GMX_CPU_ACCELERATION} MATCHES "SSE" OR ${GMX_CPU_ACCELERATION} MATCHES "AVX") AND ${FFTW}_HAVE_AVX)
961         # If we're not doing CPU acceleration, we don't care about FFTW performance on x86 either
962         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.")
963     endif()
964
965     set(FFT_STATUS_MESSAGE "Using external FFT library - FFTW3")
966 elseif(${GMX_FFT_LIBRARY} STREQUAL "MKL")
967     # Intel 11 and up makes life somewhat easy if you just want to use
968     # all their stuff. It's not easy if you only want some of their
969     # stuff...
970     if (NOT MKL_MANUALLY)
971         # The next line takes care of everything for MKL
972         if (WIN32)
973             set(FFT_LINKER_FLAGS "/Qmkl=sequential")
974         else()
975             set(FFT_LINKER_FLAGS "-mkl=sequential")
976         endif()
977         # Some versions of icc require this in order that mkl.h can be
978         # found at compile time.
979         set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} ${FFT_LINKER_FLAGS}")
980
981         set(MKL_ERROR_MESSAGE "Make sure you have configured your compiler so that ${FFT_LINKER_FLAGS} will work.")
982     else()
983         include_directories(${MKL_INCLUDE_DIR})
984         set(FFT_LIBRARIES "${MKL_LIBRARIES}")
985         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}")
986         # Convert the semi-colon separated list to a list of
987         # command-line linker arguments so that code using our
988         # pkgconfig setup can use it.
989         string(REGEX REPLACE ";" " " PKG_FFT_LIBS "${MKL_LIBRARIES}")
990     endif()
991
992     # Check MKL works. If we were in a non-global scope, we wouldn't
993     # have to play nicely.
994     set(old_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
995     set(CMAKE_REQUIRED_FLAGS "${FFT_LINKER_FLAGS}")
996     set(old_CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES}")
997     set(CMAKE_REQUIRED_LIBRARIES "${FFT_LIBRARIES}")
998
999     check_function_exists(DftiCreateDescriptor TEST_MKL)
1000
1001     set(CMAKE_REQUIRED_FLAGS "${old_CMAKE_REQUIRED_FLAGS}")
1002     set(CMAKE_REQUIRED_LIBRARIES "${old_CMAKE_REQUIRED_LIBRARIES}")
1003
1004     if(NOT TEST_MKL)
1005         # Hack to help the user vary MKL settings until they work.
1006         # TODO Make this logic more useful.
1007         unset(TEST_MKL CACHE)
1008         message(FATAL_ERROR "Linking with MKL was requested, but was not successful. ${MKL_ERROR_MESSAGE}")
1009     endif()
1010
1011     # Set variables to signal that we have MKL available and should use it for FFTs.
1012     set(GMX_FFT_MKL 1)
1013     set(HAVE_LIBMKL 1)
1014
1015     set(FFT_STATUS_MESSAGE "Using external FFT library - Intel MKL")
1016 elseif(${GMX_FFT_LIBRARY} STREQUAL "FFTPACK")
1017     set(GMX_FFT_FFTPACK 1)
1018     set(FFT_STATUS_MESSAGE "Using internal FFT library - fftpack")
1019 else(${GMX_FFT_LIBRARY} STREQUAL "FFTW3")
1020     gmx_invalid_option_value(GMX_FFT_LIBRARY)
1021 endif(${GMX_FFT_LIBRARY} STREQUAL "FFTW3")
1022 gmx_check_if_changed(FFT_CHANGED GMX_FFT_LIBRARY)
1023 if (FFT_CHANGED)
1024     message(STATUS "${FFT_STATUS_MESSAGE}")
1025 endif()
1026
1027 # enable threaded fftw3 if we've found it
1028 if(FFTW3_THREADS OR FFTW3F_THREADS)
1029     add_definitions(-DFFT5D_FFTW_THREADS)
1030 endif()
1031
1032 include(gmxManageLinearAlgebraLibraries)
1033
1034 # Whether GROMACS will really try to compile support for VMD plugins
1035 set(GMX_USE_PLUGINS OFF)
1036
1037 if(GMX_LOAD_PLUGINS)
1038   if(CYGWIN OR NOT WIN32)
1039     # Native Windows does not have, nor need dlopen
1040     # Note that WIN32 is set with Cygwin, but Cygwin needs dlopen to use plug-ins
1041     include(gmxTestdlopen)
1042     gmx_test_dlopen(HAVE_DLOPEN)
1043   endif()
1044
1045   # so, should we use plug-ins?
1046   if((WIN32 AND NOT CYGWIN) OR (HAVE_DLOPEN AND BUILD_SHARED_LIBS))
1047     if(NOT VMD_QUIETLY)
1048       MESSAGE(STATUS
1049           "Found the ability to use plug-ins when building shared libaries, "
1050           "so will compile to use plug-ins (e.g. to read VMD-supported file "
1051           "formats).")
1052     endif()
1053     if(NOT GMX_VMD_PLUGIN_PATH)
1054       find_package(VMD)
1055     endif()
1056     set(GMX_USE_PLUGINS ON)
1057     list(APPEND GMX_EXTRA_LIBRARIES ${CMAKE_DL_LIBS}) # magic cross-platform pre-set variable for dlopen library
1058     set(PKG_DL_LIBS "-l${CMAKE_DL_LIBS}")
1059   else()
1060     set(PKG_DL_LIBS)
1061   endif()
1062 endif(GMX_LOAD_PLUGINS)
1063 set(VMD_QUIETLY TRUE CACHE INTERNAL "")
1064
1065 # Link real-time library for POSIX timers. The check for clock_gettime
1066 # confirms the linkability of rt.
1067 if(HAVE_TIME_H AND HAVE_UNISTD_H AND HAVE_CLOCK_GETTIME)
1068     list(APPEND GMX_EXTRA_LIBRARIES rt)
1069 endif()
1070
1071 # Math and thread libraries must often come after all others when linking...
1072 if(HAVE_LIBM)
1073     list(APPEND GMX_EXTRA_LIBRARIES m)
1074 endif(HAVE_LIBM)
1075 if (${CMAKE_SYSTEM_NAME} MATCHES "BlueGene")
1076     check_library_exists(mass_simd atan2f4 "" HAVE_MASS_SIMD)
1077     if(HAVE_MASS_SIMD)
1078         list(APPEND GMX_EXTRA_LIBRARIES mass_simd)
1079     else()
1080         message(FATAL_ERROR "Could not link to the SIMD version of the IBM MASS library. Please adjust your CMAKE_PREFIX_PATH to contain it")
1081     endif()
1082 endif()
1083
1084 if(GMX_FAHCORE)
1085   set(COREWRAP_INCLUDE_DIR "${CMAKE_SOURCE_DIR}/../corewrap" CACHE STRING
1086       "Path to swindirect.h")
1087   include_directories(${COREWRAP_INCLUDE_DIR})
1088 endif(GMX_FAHCORE)
1089
1090 # # # # # # # # # # NO MORE TESTS AFTER THIS LINE! # # # # # # # # # # #
1091 # these are set after everything else
1092 if (NOT GMX_SKIP_DEFAULT_CFLAGS)
1093     set(CMAKE_C_FLAGS "${ACCELERATION_C_FLAGS} ${MPI_COMPILE_FLAGS} ${EXTRA_C_FLAGS} ${CMAKE_C_FLAGS}")
1094     set(CMAKE_CXX_FLAGS "${ACCELERATION_CXX_FLAGS} ${MPI_COMPILE_FLAGS} ${GMX_CXX11_FLAGS} ${EXTRA_CXX_FLAGS} ${CMAKE_CXX_FLAGS}")
1095     set(CMAKE_EXE_LINKER_FLAGS "${FFT_LINKER_FLAGS} ${MPI_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS}")
1096     set(CMAKE_SHARED_LINKER_FLAGS "${MPI_LINKER_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS}")
1097 else()
1098     message("Recommended flags which are not added because GMX_SKIP_DEFAULT_CFLAGS=yes:")
1099     message("CMAKE_C_FLAGS: ${ACCELERATION_C_FLAGS} ${MPI_COMPILE_FLAGS} ${EXTRA_C_FLAGS} ${GMXC_CFLAGS}")
1100     message("CMAKE_C_FLAGS_RELEASE: ${GMXC_CFLAGS_RELEASE}")
1101     message("CMAKE_C_FLAGS_DEBUG: ${GMXC_CFLAGS_DEBUG}")
1102     message("CMAKE_CXX_FLAGS: ${ACCELERATION_CXX_FLAGS} ${MPI_COMPILE_FLAGS} ${GMX_CXX11_FLAGS} ${EXTRA_CXX_FLAGS} ${GMXC_CXXFLAGS}")
1103     message("CMAKE_CXX_FLAGS_RELEASE: ${GMXC_CXXFLAGS_RELEASE}")
1104     message("CMAKE_CXX_FLAGS_DEBUG: ${GMXC_CXXFLAGS_DEBUG}")
1105     message("CMAKE_EXE_LINKER_FLAGS: ${FFT_LINKER_FLAGS} ${MPI_LINKER_FLAGS}")
1106     message("CMAKE_SHARED_LINKER_FLAGS: ${MPI_LINKER_FLAGS}")
1107 endif()
1108
1109 if(NOT GMX_OPENMP)
1110     #Unset all OpenMP flags in case OpenMP was disabled either by the user
1111     #or because it was only partially detected (e.g. only for C but not C++ compiler)
1112     unset(OpenMP_C_FLAGS CACHE) 
1113     unset(OpenMP_CXX_FLAGS CACHE)
1114 else()
1115     set(GMX_EXE_LINKER_FLAGS ${GMX_EXE_LINKER_FLAGS} ${OpenMP_LINKER_FLAGS})
1116     set(GMX_SHARED_LINKER_FLAGS ${GMX_SHARED_LINKER_FLAGS} ${OpenMP_SHARED_LINKER_FLAGS})
1117 endif()
1118 set(PKG_CFLAGS "${PKG_CFLAGS} ${OpenMP_C_FLAGS}")
1119
1120 ######################################
1121 # Output compiler and CFLAGS used
1122 ######################################
1123 get_compiler_info(C BUILD_C_COMPILER BUILD_CFLAGS)
1124 get_compiler_info(CXX BUILD_CXX_COMPILER BUILD_CXXFLAGS)
1125 if(GMX_GPU)
1126     get_cuda_compiler_info(CUDA_NVCC_COMPILER_INFO CUDA_NVCC_COMPILER_FLAGS)
1127 endif(GMX_GPU)
1128
1129 ########################################################################
1130 # Specify install locations
1131 ########################################################################
1132 set(GMX_LIB_INSTALL_DIR lib CACHE STRING
1133     "Library installation directory (default: lib)")
1134 set(GMX_DATA_INSTALL_DIR gromacs CACHE STRING
1135     "Data installation directory under share/ (default: gromacs)")
1136 mark_as_advanced(GMX_LIB_INSTALL_DIR GMX_DATA_INSTALL_DIR)
1137
1138 set(LIB_INSTALL_DIR  ${GMX_INSTALL_PREFIX}${GMX_LIB_INSTALL_DIR})
1139 set(BIN_INSTALL_DIR  ${GMX_INSTALL_PREFIX}bin)
1140 set(DATA_INSTALL_DIR ${GMX_INSTALL_PREFIX}share/${GMX_DATA_INSTALL_DIR})
1141 set(MAN_INSTALL_DIR  ${GMX_INSTALL_PREFIX}share/man)
1142 set(INCL_INSTALL_DIR ${GMX_INSTALL_PREFIX}include)
1143
1144 set(GMXLIB_SEARCH_DIR share/${GMX_DATA_INSTALL_DIR}/top)
1145 set(GMXLIB_FALLBACK   ${CMAKE_INSTALL_PREFIX}/${DATA_INSTALL_DIR}/top)
1146
1147 ########################################################################
1148 # Set up binary and library suffixing
1149 ########################################################################
1150 option(
1151     GMX_DEFAULT_SUFFIX
1152     "Use default suffixes for GROMACS binaries and libs (_d for double, _mpi for MPI; rerun cmake after changing to see relevant options)"
1153     ON)
1154 gmx_dependent_cache_variable(
1155     GMX_BINARY_SUFFIX
1156     "Suffix for GROMACS binaries (default: _d for double, _mpi for MPI, _mpi_d for MPI and double)."
1157     STRING ""
1158     "NOT GMX_DEFAULT_SUFFIX")
1159 gmx_dependent_cache_variable(
1160     GMX_LIBS_SUFFIX
1161     "Suffix for GROMACS libraries (default: _d for double, _mpi for MPI, _mpi_d for MPI and double)."
1162     STRING ""
1163     "NOT GMX_DEFAULT_SUFFIX")
1164 if (GMX_DEFAULT_SUFFIX)
1165   gmx_check_if_changed(SUFFIXES_CHANGED GMX_DEFAULT_SUFFIX)
1166   set(GMX_BINARY_SUFFIX "")
1167   set(GMX_LIBS_SUFFIX "")
1168   if (GMX_LIB_MPI)
1169     set(GMX_BINARY_SUFFIX "_mpi")
1170     set(GMX_LIBS_SUFFIX "_mpi")
1171   endif()
1172   if (GMX_DOUBLE)
1173     set (GMX_BINARY_SUFFIX "${GMX_BINARY_SUFFIX}_d")
1174     set (GMX_LIBS_SUFFIX "${GMX_LIBS_SUFFIX}_d")
1175   endif(GMX_DOUBLE)
1176   if (SUFFIXES_CHANGED)
1177     message(STATUS "Using default binary suffix: \"${GMX_BINARY_SUFFIX}\"")
1178     message(STATUS "Using default library suffix: \"${GMX_LIBS_SUFFIX}\"")
1179   endif ()
1180 else(GMX_DEFAULT_SUFFIX)
1181   gmx_check_if_changed(SUFFIXES_CHANGED
1182                        GMX_DEFAULT_SUFFIX GMX_BINARY_SUFFIX GMX_LIBS_SUFFIX)
1183   if (SUFFIXES_CHANGED)
1184     message(STATUS "Using manually set binary suffix: \"${GMX_BINARY_SUFFIX}\"")
1185     message(STATUS "Using manually set library suffix: \"${GMX_LIBS_SUFFIX}\"")
1186   endif ()
1187 endif(GMX_DEFAULT_SUFFIX)
1188 if (GMX_BUILD_MDRUN_ONLY)
1189     set(GMX_LIBS_SUFFIX "_mdrun${GMX_LIBS_SUFFIX}")
1190 endif ()
1191
1192 ##################################################################
1193 # Shared library settings
1194 ##################################################################
1195 if(NOT CMAKE_SYSTEM_NAME STREQUAL "Darwin")
1196     set(CMAKE_SKIP_BUILD_RPATH  FALSE)
1197     set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
1198     set(CMAKE_INSTALL_RPATH "\\\$ORIGIN/../${GMXLIB}")
1199     set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
1200 else()
1201     if(CMAKE_SYSTEM_VERSION VERSION_GREATER 8.0) #rpath supported for >10.4
1202         set(CMAKE_INSTALL_NAME_DIR "@rpath")
1203         set(GMX_EXE_LINKER_FLAGS ${GMX_EXE_LINKER_FLAGS} "-Wl,-rpath,@executable_path/../lib")
1204     else()
1205         set(CMAKE_INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/${LIB_INSTALL_DIR}")
1206     endif()
1207 endif()
1208
1209 #COPYING file: Only necessary for binary distributions.
1210 #Simpler to always install.
1211 install(FILES COPYING DESTINATION ${DATA_INSTALL_DIR} COMPONENT data)
1212
1213 if(GMX_EXTERNAL_BOOST)
1214     include_directories(${Boost_INCLUDE_DIRS})
1215 else()
1216     include_directories(${CMAKE_SOURCE_DIR}/src/external/boost)
1217     # typeid not supported for minimal internal version
1218     # (would add significant amount of code)
1219     add_definitions(-DBOOST_NO_TYPEID)
1220     # TODO: Propagate the above settings to the installed CMakeFiles.txt template
1221     # (from share/template/)
1222     set(PKG_CFLAGS "${PKG_CFLAGS} -DBOOST_NO_TYPEID -I${INCL_INSTALL_DIR}/gromacs/external/boost")
1223     if (NOT GMX_BUILD_MDRUN_ONLY)
1224         install(DIRECTORY ${CMAKE_SOURCE_DIR}/src/external/boost/boost
1225                 DESTINATION ${INCL_INSTALL_DIR}/gromacs/external/boost
1226                 COMPONENT development)
1227     endif ()
1228 endif()
1229
1230 if (GMX_BUILD_FOR_COVERAGE)
1231     # Code heavy with asserts makes conditional coverage close to useless metric,
1232     # as by design most of the false branches are impossible to trigger in
1233     # correctly functioning code.  And the benefit of testing those that could
1234     # be triggered by using an API against its specification isn't usually
1235     # worth the effort.
1236     add_definitions(-DNDEBUG -DBOOST_DISABLE_ASSERTS -DGMX_DISABLE_ASSERTS)
1237 endif ()
1238
1239 if (NOT GMX_BUILD_MDRUN_ONLY)
1240     add_subdirectory(doxygen)
1241     add_subdirectory(share)
1242     add_subdirectory(scripts)
1243 endif ()
1244 add_subdirectory(src)
1245
1246 # Issue a warning if NVIDIA GPUs were detected, but CUDA was not found.
1247 # Don't bother the user after the first configure pass.
1248 if ((CUDA_NOTFOUND_AUTO AND GMX_DETECT_GPU_AVAILABLE) AND NOT GMX_GPU_DETECTION_DONE)
1249     message(WARNING "${CUDA_NOTFOUND_MESSAGE}")
1250 endif()
1251 set(GMX_GPU_DETECTION_DONE TRUE CACHE INTERNAL "Whether GPU detection has already been done")
1252
1253 #######################
1254 ## uninstall target
1255 #######################
1256     CONFIGURE_FILE(
1257                    "${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in"
1258                    "${CMAKE_CURRENT_BINARY_DIR}/cmake/cmake_uninstall.cmake"
1259                    IMMEDIATE @ONLY)
1260 ###########################
1261 ADD_CUSTOM_TARGET(uninstall
1262                   "${CMAKE_COMMAND}" -P
1263                   "${CMAKE_CURRENT_BINARY_DIR}/cmake/cmake_uninstall.cmake")
1264 ###########################
1265
1266 ########################################################################
1267 # Tests                                                                #
1268 ########################################################################
1269
1270 IF(BUILD_TESTING)
1271     enable_testing()
1272     #"check" target builds and runs all tests
1273     add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} --output-on-failure)
1274     add_dependencies(check tests)
1275     # TODO: This would be better within tests/CMakeLists.txt
1276     if (NOT GMX_BUILD_MDRUN_ONLY)
1277         #gmxtests target builds all binaries required for running gmxtest
1278         add_custom_target(gmxtests DEPENDS gmx links)
1279         add_dependencies(check gmxtests)
1280         add_subdirectory(tests)
1281     endif()
1282     #TODO: Add warning if NOT REGRESSIONTEST_PATH OR NOT GMX_XML that regression/unit tests are not run.
1283 ENDIF()
1284
1285 ########################################################################
1286 # Manual                                                               #
1287 ########################################################################
1288
1289 option(GMX_BUILD_MANUAL "Whether to try to configure to build the PDF manual" OFF)
1290 mark_as_advanced(GMX_BUILD_MANUAL)
1291 if(GMX_BUILD_MANUAL)
1292     # Make sure we only do detection of manual-building dependencies
1293     # when the user opted in for that.
1294     add_subdirectory(manual)
1295 endif()