Adapted clang-AMD-FMA workaround for both C and C++
[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 # TODO: move OpenMM to contrib
131 option(GMX_OPENMM "Accelerated execution on GPUs through the OpenMM library (rerun cmake after changing to see relevant options)" OFF)
132 mark_as_advanced(GMX_OPENMM)
133
134 include(gmxDetectAcceleration)
135 if(NOT DEFINED GMX_CPU_ACCELERATION)
136     if(CMAKE_CROSSCOMPILING)
137         if("${CMAKE_SYSTEM_NAME}" MATCHES "BlueGeneQ")
138             set(GMX_SUGGESTED_CPU_ACCELERATION "IBM_QPX")
139         else()
140             set(GMX_SUGGESTED_CPU_ACCELERATION "None")
141         endif()
142     else(CMAKE_CROSSCOMPILING)
143         gmx_detect_acceleration(GMX_SUGGESTED_CPU_ACCELERATION)
144     endif(CMAKE_CROSSCOMPILING)
145 endif(NOT DEFINED GMX_CPU_ACCELERATION)
146
147 set(GMX_CPU_ACCELERATION "@GMX_SUGGESTED_CPU_ACCELERATION@"
148     CACHE STRING "Accelerated CPU kernels. Pick one of: None, SSE2, SSE4.1, AVX_128_FMA, AVX_256, IBM_QPX, Sparc64_HPC_ACE")
149
150 set(GMX_FFT_LIBRARY "fftw3" 
151     CACHE STRING "FFT library choices: fftw3,mkl,fftpack[built-in]")
152 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)
153 mark_as_advanced(GMX_BUILD_OWN_FFTW)
154 option(GMX_DISABLE_FFTW_MEASURE 
155        "Do not optimize FFTW setups (not needed with SSE)" OFF)
156 mark_as_advanced(GMX_DISABLE_FFTW_MEASURE)
157 set(GMX_QMMM_PROGRAM "none" 
158     CACHE STRING "QM package choices: none,gaussian,mopac,gamess,orca")
159 option(GMX_BROKEN_CALLOC "Work around broken calloc()" OFF)
160 mark_as_advanced(GMX_BROKEN_CALLOC)
161 option(GMX_MPI_IN_PLACE "Enable MPI_IN_PLACE for MPIs that have it defined" ON)
162 mark_as_advanced(GMX_MPI_IN_PLACE)
163 option(GMX_LOAD_PLUGINS "Compile with plugin support, needed to read VMD supported file formats" ON)
164 mark_as_advanced(GMX_LOAD_PLUGINS)
165
166 option(GMX_GPU  "Enable GPU acceleration" ON)
167 option(GMX_OPENMP "Enable OpenMP-based multithreading" ON)
168
169 option(GMX_GIT_VERSION_INFO "Generate git version information" ${SOURCE_IS_GIT_REPOSITORY})
170 mark_as_advanced(GMX_GIT_VERSION_INFO)
171
172 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)
173 if(UNIX)
174     option(GMX_SYMLINK_OLD_BINARY_NAMES "Create symbolic links for pre-5.0 binary names" ON)
175 endif()
176
177 if(UNIX)
178     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)
179     mark_as_advanced(GMX_PREFER_STATIC_LIBS)
180 endif()
181
182 option(GMX_CYCLE_SUBCOUNTERS "Enable cycle subcounters to get a more detailed cycle timings" OFF)
183 mark_as_advanced(GMX_CYCLE_SUBCOUNTERS)
184
185 option(GMX_SKIP_DEFAULT_CFLAGS "Don't automatically add suggested/required Compiler flags." OFF)
186 mark_as_advanced(GMX_SKIP_DEFAULT_CFLAGS)
187
188 ######################################################################
189 # Compiler tests
190 # These need to be done early (before further tests).
191 #####################################################################
192
193 # The cmake/Check{C,CXX}CompilerFlag.cmake files in the GROMACS distribution
194 # are used with permission from CMake v2.8.9 so that GROMACS can detect
195 # invalid options with the Intel Compilers.
196 # These files should be removed from the source tree when a CMake version that
197 # includes the features in question becomes required for building GROMACS.
198 include(CheckCCompilerFlag)
199 include(CheckCXXCompilerFlag)
200
201 # Get compiler version information, needs to be done early as check that depend
202 # on compiler verison follow below.
203 include(gmxGetCompilerInfo)
204 get_compiler_version()
205
206 # First exclude compilers known to not work with OpenMP although claim to support it:
207 # gcc 4.2.1 and gcc-llvm 4.2.1 (also claims to be 4.2.1) on Mac OS X
208 # This fixes redmine 900 and needs to run before OpenMP flags are set below.
209 if (CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND
210     (CMAKE_COMPILER_IS_GNUCC AND C_COMPILER_VERSION AND C_COMPILER_VERSION VERSION_LESS 4.3))
211     message(STATUS "OpenMP multithreading not supported with gcc/llvm-gcc 4.2 on Mac OS X, disabled")
212     set(GMX_OPENMP OFF CACHE BOOL
213         "OpenMP multithreading not not supported with gcc/llvm-gcc 4.2 on Mac OS X, disabled!" FORCE)
214 endif()
215
216 # OpenMP check must come before other CFLAGS!
217 if(GMX_OPENMP)
218     find_package(OpenMP)
219     if(OPENMP_FOUND)
220         # CMake on Windows doesn't support linker flags passed to target_link_libraries
221         # (i.e. it treats /openmp as \openmp library file). Also, no OpenMP linker flags are needed.
222         if(NOT (WIN32 AND NOT CYGWIN))
223             if(CMAKE_COMPILER_IS_GNUCC AND GMX_PREFER_STATIC_OPENMP AND NOT APPLE)
224                 set(OpenMP_LINKER_FLAGS "-Wl,-static -lgomp -lrt -Wl,-Bdynamic -lpthread")
225                 set(OpenMP_SHARED_LINKER_FLAGS "")
226             else()
227                 # Only set a linker flag if the user didn't set them manually
228                 if(NOT DEFINED OpenMP_LINKER_FLAGS)
229                     set(OpenMP_LINKER_FLAGS "${OpenMP_C_FLAGS}")
230                 endif()
231                 if(NOT DEFINED OpenMP_SHARED_LINKER_FLAGS)
232                     set(OpenMP_SHARED_LINKER_FLAGS "${OpenMP_C_FLAGS}")
233                 endif()
234             endif()
235         endif()
236     else(OPENMP_FOUND)
237         message(WARNING
238                 "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.")
239         set(GMX_OPENMP OFF CACHE STRING "Whether GROMACS will use OpenMP parallelism." FORCE)
240     endif(OPENMP_FOUND)
241 endif()
242
243
244 include(gmxCFlags)
245 gmx_c_flags()
246
247 # This variable should be used for additional compiler flags which are not
248 # generated in gmxCFlags nor are acceleration or MPI related.
249 set(EXTRA_C_FLAGS "")
250 set(EXTRA_CXX_FLAGS "")
251
252 # gcc 4.4.x is buggy and crashes when compiling some files with O3 and OpenMP on.
253 # Detect here whether applying a workaround is needed and will apply it later
254 # on the affected files.
255 include(gmxGCC44O3BugWorkaround)
256 gmx_check_gcc44_bug_workaround_needed(GMX_USE_GCC44_BUG_WORKAROUND)
257
258 # clang 3.0 is buggy for some unknown reason detected during adding
259 # the SSE2 group kernels for GROMACS 4.6. If we ever work out what
260 # that is, we should replace these tests with a compiler feature test,
261 # update GROMACS Redmine task #1039 and perhaps report a clang bug.
262 #
263 # In the meantime, until we require CMake 2.8.10 we cannot rely on it to detect
264 # the compiler version for us. So we need a manual check for clang 3.0.
265 include(gmxDetectClang30)
266 gmx_detect_clang_3_0(COMPILER_IS_CLANG_3_0)
267 if(COMPILER_IS_CLANG_3_0)
268     message(FATAL_ERROR "Your compiler is clang version 3.0, which is known to be buggy for GROMACS. Use a different compiler.")
269 endif()
270
271 # clang <=3.2 contains a bug that causes incorrect code to be generated for the
272 # vfmaddps instruction and therefore the bug is triggered with AVX_128_FMA.
273 # (see: http://llvm.org/bugs/show_bug.cgi?id=15040).
274 # We can work around this by not using the integrated assembler (except on OS X
275 # which has an outdated assembler that does not support AVX instructions).
276 if (${CMAKE_C_COMPILER_ID} MATCHES "Clang" AND C_COMPILER_VERSION VERSION_LESS "3.3")
277     set(GMX_USE_CLANG_C_FMA_BUG_WORKAROUND TRUE)
278 endif()
279 if (${CMAKE_CXX_COMPILER_ID} MATCHES "Clang" AND CXX_COMPILER_VERSION VERSION_LESS "3.3")
280     set(GMX_USE_CLANG_CXX_FMA_BUG_WORKAROUND TRUE)
281 endif()
282
283 if (CMAKE_C_COMPILER_ID STREQUAL "PGI")
284     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.")
285 endif()
286
287 if(CMAKE_C_COMPILER_ID MATCHES "Intel" AND C_COMPILER_VERSION VERSION_LESS "12.0.0")
288     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.")
289 endif()
290
291 ########################################################################
292 # Set up binary and library suffixing 
293 ########################################################################
294 set(GMX_BINARY_SUFFIX "" CACHE STRING "Suffix for GROMACS binaries (default: _d for double, _mpi for MPI, _mpi_d for MPI and double).")
295 set(GMX_LIBS_SUFFIX "" 
296   CACHE STRING "Suffix for GROMACS libs (default: _d for double, _mpi for MPI, _mpi_d for MPI and double).")
297 if (GMX_DEFAULT_SUFFIX)
298   set(GMX_BINARY_SUFFIX "")
299   set(GMX_LIBS_SUFFIX "")
300   if (GMX_MPI)
301     set(GMX_BINARY_SUFFIX "_mpi")
302     set(GMX_LIBS_SUFFIX "_mpi")
303   endif(GMX_MPI)
304   if (GMX_DOUBLE)
305     set (GMX_BINARY_SUFFIX "${GMX_BINARY_SUFFIX}_d")
306     set (GMX_LIBS_SUFFIX "${GMX_LIBS_SUFFIX}_d")
307   endif(GMX_DOUBLE)
308   mark_as_advanced(FORCE GMX_BINARY_SUFFIX GMX_LIBS_SUFFIX)
309   if (NOT SUFFIX_QUIETLY)
310     message(STATUS "Using default binary suffix: \"${GMX_BINARY_SUFFIX}\"")
311     message(STATUS "Using default library suffix: \"${GMX_LIBS_SUFFIX}\"")
312   endif (NOT SUFFIX_QUIETLY)
313 else(GMX_DEFAULT_SUFFIX)
314   mark_as_advanced(CLEAR GMX_BINARY_SUFFIX GMX_LIBS_SUFFIX)
315   if (NOT SUFFIX_QUIETLY)
316     message(STATUS "Using manually set binary suffix: \"${GMX_BINARY_SUFFIX}\"")
317     message(STATUS "Using manually set library suffix: \"${GMX_LIBS_SUFFIX}\"")
318   endif (NOT SUFFIX_QUIETLY)
319 endif(GMX_DEFAULT_SUFFIX)
320 set(SUFFIX_QUIETLY TRUE CACHE INTERNAL "")
321
322 set(PKG_CFLAGS "")
323 if(GMX_DOUBLE)
324     set(PKG_CFLAGS "${PKG_CFLAGS} -DGMX_DOUBLE")
325 endif(GMX_DOUBLE)
326 if(GMX_SOFTWARE_INVSQRT)
327   set(PKG_CFLAGS "${PKG_CFLAGS} -DGMX_SOFTWARE_INVSQRT")
328 endif(GMX_SOFTWARE_INVSQRT)
329
330
331
332 ########################################################################
333 # Basic system tests (standard libraries, headers, functions, types)   #
334 ########################################################################
335 include(CheckIncludeFiles)
336 include(CheckIncludeFileCXX)
337 check_include_files(unistd.h     HAVE_UNISTD_H)
338 check_include_files(pwd.h        HAVE_PWD_H)
339 check_include_files(pthread.h    HAVE_PTHREAD_H)
340 check_include_files(dirent.h     HAVE_DIRENT_H)
341 check_include_files(sys/time.h   HAVE_SYS_TIME_H)
342 check_include_files(io.h                 HAVE_IO_H)
343 check_include_files(sched.h      HAVE_SCHED_H)
344
345 check_include_files(regex.h      HAVE_POSIX_REGEX)
346 check_include_file_cxx(regex     HAVE_CXX11_REGEX)
347 # TODO: It could be nice to inform the user if no regex support is found,
348 # as selections won't be fully functional.
349
350 include(CheckFunctionExists)
351 check_function_exists(strdup            HAVE_STRDUP)
352 check_function_exists(posix_memalign    HAVE_POSIX_MEMALIGN)
353 check_function_exists(memalign          HAVE_MEMALIGN)
354 check_function_exists(_aligned_malloc   HAVE__ALIGNED_MALLOC)
355 check_function_exists(gettimeofday      HAVE_GETTIMEOFDAY)
356 check_function_exists(fsync             HAVE_FSYNC)
357 check_function_exists(_fileno           HAVE__FILENO)
358 check_function_exists(fileno            HAVE_FILENO)
359 check_function_exists(_commit           HAVE__COMMIT)
360 check_function_exists(sigaction         HAVE_SIGACTION)
361 check_function_exists(sysconf           HAVE_SYSCONF)
362 check_function_exists(sched_setaffinity HAVE_SCHED_SETAFFINITY)
363 check_function_exists(sched_getaffinity HAVE_SCHED_GETAFFINITY)
364 check_function_exists(rsqrt             HAVE_RSQRT)
365 check_function_exists(rsqrtf            HAVE_RSQRTF)
366 check_function_exists(sqrtf             HAVE_SQRTF)
367
368 include(CheckLibraryExists)
369 check_library_exists(m sqrt "" HAVE_LIBM)
370 check_library_exists(m cbrt "" HAVE_CBRT)
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/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 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
1171 ########################################################################
1172 # Specify install locations
1173 ########################################################################
1174 if ( NOT DEFINED GMXLIB )
1175     set(GMXLIB lib)
1176 endif()
1177 set(LIB_INSTALL_DIR "${GMX_INSTALL_PREFIX}${GMXLIB}")
1178 set(BIN_INSTALL_DIR  ${GMX_INSTALL_PREFIX}bin)
1179 set(DATA_INSTALL_DIR ${GMX_INSTALL_PREFIX}share/gromacs)
1180 set(MAN_INSTALL_DIR  ${GMX_INSTALL_PREFIX}share/man)
1181 set(INCL_INSTALL_DIR ${GMX_INSTALL_PREFIX}include)
1182
1183 set(GMXLIBDIR        ${DATA_INSTALL_DIR}/top)
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     install(DIRECTORY ${CMAKE_SOURCE_DIR}/src/external/boost/boost
1217             DESTINATION ${INCL_INSTALL_DIR}/gromacs/external/boost
1218             COMPONENT development)
1219 endif()
1220
1221 add_subdirectory(doxygen)
1222 add_subdirectory(share)
1223 add_subdirectory(src)
1224 add_subdirectory(scripts)
1225
1226 # Issue a warning if NVIDIA GPUs were detected, but CUDA was not found.
1227 # Don't bother the user after the first configure pass.
1228 if ((CUDA_NOTFOUND_AUTO AND GMX_DETECT_GPU_AVAILABLE) AND NOT GMX_GPU_DETECTION_DONE)
1229     message(WARNING "${CUDA_NOTFOUND_MESSAGE}")
1230     unset(CUDA_NOTFOUND_AUTO)
1231     unset(CUDA_NOTFOUND_MESSAGE)
1232 endif()
1233 set(GMX_GPU_DETECTION_DONE TRUE CACHE INTERNAL "Whether GPU detection has already been done")
1234
1235 #######################
1236 ## uninstall target
1237 #######################
1238     CONFIGURE_FILE(
1239                    "${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in"
1240                    "${CMAKE_CURRENT_BINARY_DIR}/cmake/cmake_uninstall.cmake"
1241                    IMMEDIATE @ONLY)
1242 ###########################
1243 ADD_CUSTOM_TARGET(uninstall
1244                   "${CMAKE_COMMAND}" -P 
1245                   "${CMAKE_CURRENT_BINARY_DIR}/cmake/cmake_uninstall.cmake")
1246 ###########################
1247
1248 ########################################################################
1249 # Tests                                                                #
1250 ########################################################################
1251
1252 include(CTest)
1253 mark_as_advanced(BUILD_TESTING)
1254 #gmxtests target builds all binaries required for running gmxtest
1255 add_custom_target(gmxtests DEPENDS grompp mdrun pdb2gmx gmxcheck gmx links)
1256 IF(BUILD_TESTING)
1257     enable_testing()
1258     add_subdirectory(tests)
1259     #"check" target builds and runs all tests
1260     add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} --output-on-failure)
1261     add_dependencies(check gmxtests tests)
1262     #TODO: Add warning if NOT REGRESSIONTEST_PATH OR NOT GMX_XML that regression/unit tests are not run.
1263 ENDIF()
1264