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