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