Merge release-4-6 into master
[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 # override bugs on OS X where Cmake picks gcc (GNU) for C instead of system default cc (Clang).
6 if(APPLE)
7     set(CMAKE_C_COMPILER_INIT "cc")
8 endif(APPLE)
9
10 project(Gromacs)
11 include(Dart)
12 mark_as_advanced(DART_ROOT)
13
14 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
15 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
16 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
17
18 # PROJECT_VERSION should have the following structure: 
19 # VERSION-dev[-SUFFIX] where the VERSION should have the for: vMajor.vMinor.vPatch
20 #
21 # The "-dev" suffix is important to keep because it makes possible to distinguish 
22 # between a build from official release and a build from git release branch on a 
23 # machine with no git. 
24 #
25 # NOTE: when releasing the "-dev" suffix needs to be stripped off!
26 set(PROJECT_VERSION "5.0-dev")
27 set(CUSTOM_VERSION_STRING ""
28     CACHE STRING "Custom version string (if empty, use hard-coded default)")
29 mark_as_advanced(CUSTOM_VERSION_STRING)
30 if (CUSTOM_VERSION_STRING)
31     set(PROJECT_VERSION ${CUSTOM_VERSION_STRING})
32 endif (CUSTOM_VERSION_STRING)
33 set(SOVERSION 6)
34 # It is a bit irritating, but this has to be set separately for now!
35 SET(CPACK_PACKAGE_VERSION_MAJOR "5")
36 SET(CPACK_PACKAGE_VERSION_MINOR "0")
37 #SET(CPACK_PACKAGE_VERSION_PATCH "0")
38
39 # The numerical gromacs version. It is 40600 for 4.6.0.
40 # The #define GMX_VERSION in gmx_header_config_h is set to this value.
41 math(EXPR NUM_VERSION 
42     "${CPACK_PACKAGE_VERSION_MAJOR}*10000 + ${CPACK_PACKAGE_VERSION_MINOR}*100")
43 if(CPACK_PACKAGE_VERSION_PATCH)
44     math(EXPR NUM_VERSION 
45          "${NUM_VERSION} + ${CPACK_PACKAGE_VERSION_PATCH}")
46 endif()
47
48 # The API version tracks the numerical Gromacs version (for now).
49 # It is potentially different from the Gromacs version in the future, if
50 # the programs/libraries diverge from the presumably more stable API.
51 # The #define GMX_API_VERSION in version.h is set to this value to
52 # provide backward compatibility of software written against the Gromacs API.
53 set(API_VERSION ${NUM_VERSION})
54
55 # Cmake modules/macros are in a subdirectory to keep this file cleaner
56 set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
57
58 if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT AND UNIX)
59     set(CMAKE_INSTALL_PREFIX "/usr/local/gromacs" CACHE STRING "Installation prefix (installation will need write permissions here)" FORCE)
60 endif()
61
62 set(GMX_INSTALL_PREFIX "" CACHE STRING "Prefix gets appended to CMAKE_INSTALL_PREFIX. For cpack it sets the root folder of the archive.")
63 mark_as_advanced(GMX_INSTALL_PREFIX)
64
65 include(gmxBuildTypeReference)
66
67 if(NOT CMAKE_BUILD_TYPE)
68     set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel Reference." FORCE)
69 endif(NOT CMAKE_BUILD_TYPE)
70
71 enable_language(C)
72 enable_language(CXX)
73
74 set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION})
75 set(CPACK_PACKAGE_VENDOR "gromacs.org")
76 set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Gromacs - a toolkit for high-performance molecular simulation")
77 set(CPACK_RESOURCE_FILE_WELCOME "${CMAKE_SOURCE_DIR}/admin/InstallWelcome.txt")
78 # Its GPL/LGPL, so they do not have to agree to a license for mere usage, but some installers require this...
79 set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/COPYING")
80 set(CPACK_RESOURCE_FILE_README "${CMAKE_SOURCE_DIR}/admin/InstallInfo.txt")
81 set(CPACK_SOURCE_IGNORE_FILES "\\\\.isreposource$;\\\\.git/;\\\\.gitignore$")
82 set(CPACK_PROJECT_CONFIG_FILE "${CMAKE_SOURCE_DIR}/CPackInit.cmake")
83 SET(CPACK_SOURCE_INSTALLED_DIRECTORIES "${CMAKE_SOURCE_DIR};/;${CMAKE_BINARY_DIR}/man;man")
84 set(CPACK_PACKAGE_CONTACT "gmx-users@gromacs.org")
85
86 #must come after all cpack settings!
87 include(CPack)
88
89 set(SOURCE_IS_GIT_REPOSITORY OFF)
90 if(EXISTS "${CMAKE_SOURCE_DIR}/.git")
91     set(SOURCE_IS_GIT_REPOSITORY ON)
92 endif()
93
94 ########################################################################
95 # Check and warn if cache generated on a different host is being reused
96 ########################################################################
97 if(CMAKE_HOST_UNIX)
98     execute_process(COMMAND hostname
99                     OUTPUT_VARIABLE TMP_HOSTNAME
100                     OUTPUT_STRIP_TRAILING_WHITESPACE)
101     if(GMX_BUILD_HOSTNAME AND NOT "${GMX_BUILD_HOSTNAME}" STREQUAL "${TMP_HOSTNAME}")
102         message(WARNING "
103             The CMake cache, probably generated on a different host (${GMX_BUILD_HOSTNAME}),
104             is being reused! This could lead to inconsitencies; therefore, it is
105             recommended to regenerate the cache!")
106     endif()
107     set(GMX_BUILD_HOSTNAME "${TMP_HOSTNAME}" CACHE INTERNAL
108             "Hostname of the machine where the cache was generated.")
109 endif()
110
111 ########################################################################
112 set(CMAKE_PREFIX_PATH "" CACHE STRING "Extra locations to search for external libraries and tools (give directory without lib, bin, or include)")
113 # Fix stupid flags on Windows
114 ########################################################################
115 SET(SHARED_LIBS_DEFAULT ON) 
116 IF( WIN32 AND NOT CYGWIN)
117   option(GMX_PREFER_STATIC_LIBS "When finding libraries prefer static system libraries (MT instead of MD)!" ON)
118   mark_as_advanced(GMX_PREFER_STATIC_LIBS)
119   SET(SHARED_LIBS_DEFAULT OFF)  #is currently not working on Windows
120   # This makes windows.h not declare min/max as macros that would break
121   # C++ code using std::min/std::max.
122   add_definitions(-DNOMINMAX)
123
124   IF (GMX_PREFER_STATIC_LIBS)
125     #Only setting Debug and Release flags. Others configurations current not used.
126     STRING(REPLACE /MD /MT CMAKE_C_FLAGS_RELEASE ${CMAKE_C_FLAGS_RELEASE})
127     SET(CMAKE_C_FLAGS_RELEASE ${CMAKE_C_FLAGS_RELEASE} CACHE STRING "" FORCE)
128     STRING(REPLACE /MD /MT CMAKE_C_FLAGS_DEBUG ${CMAKE_C_FLAGS_DEBUG})
129     SET(CMAKE_C_FLAGS_DEBUG ${CMAKE_C_FLAGS_DEBUG} CACHE STRING "" FORCE)
130     STRING(REPLACE /MD /MT CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE})
131     SET(CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE} CACHE STRING "" FORCE)
132     STRING(REPLACE /MD /MT CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG})
133     SET(CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG} CACHE STRING "" FORCE)
134   ENDIF()
135
136   #Workaround for cmake bug 13174. Replace deprecated options.
137   IF( CMAKE_C_COMPILER_ID MATCHES "Intel" )
138     STRING(REPLACE /GZ /RTC1 CMAKE_C_FLAGS_DEBUG ${CMAKE_C_FLAGS_DEBUG})
139     SET(CMAKE_C_FLAGS_DEBUG ${CMAKE_C_FLAGS_DEBUG} CACHE STRING "" FORCE)
140   ENDIF()
141   IF( CMAKE_CXX_COMPILER_ID MATCHES "Intel" )
142     STRING(REPLACE /GZ /RTC1 CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG})
143     STRING(REPLACE /GX /EHsc CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG})
144     SET(CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG} CACHE STRING "" FORCE)
145
146     STRING(REPLACE /GX /EHsc CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE})
147     SET(CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE} CACHE STRING "" FORCE)
148   ENDIF()
149 ENDIF()
150
151
152 ########################################################################
153 # User input options                                                   #
154 ########################################################################
155 option(GMX_DOUBLE "Use double precision (much slower, use only if you really need it)" OFF)
156 option(GMX_MPI    "Build a parallel (message-passing) version of GROMACS" OFF)
157 option(GMX_THREAD_MPI  "Build a thread-MPI-based multithreaded version of GROMACS (not compatible with MPI)" ON)
158 option(GMX_SOFTWARE_INVSQRT "Use GROMACS software 1/sqrt" ON)
159 mark_as_advanced(GMX_SOFTWARE_INVSQRT)
160 option(GMX_POWERPC_INVSQRT "Use PowerPC hardware 1/sqrt" OFF)
161 mark_as_advanced(GMX_POWERPC_INVSQRT)
162 option(GMX_FAHCORE "Build a library with mdrun functionality" OFF)
163 mark_as_advanced(GMX_FAHCORE)
164
165 # decide on GPU settings based on user-settings and GPU/CUDA detection
166 include(gmxManageGPU)
167
168 option(GMX_OPENMM "Accelerated execution on GPUs through the OpenMM library (rerun cmake after changing to see relevant options)" OFF)
169
170 include(gmxDetectAcceleration)
171 if(NOT DEFINED GMX_CPU_ACCELERATION)
172     if(CMAKE_CROSSCOMPILING)
173         set(GMX_SUGGESTED_CPU_ACCELERATION "None")
174     else(CMAKE_CROSSCOMPILING)
175         gmx_detect_acceleration(GMX_SUGGESTED_CPU_ACCELERATION)
176     endif(CMAKE_CROSSCOMPILING)
177 endif(NOT DEFINED GMX_CPU_ACCELERATION)
178
179 set(GMX_CPU_ACCELERATION "@GMX_SUGGESTED_CPU_ACCELERATION@"
180     CACHE STRING "Accelerated CPU kernels. Pick one of: None, SSE2, SSE4.1, AVX_128_FMA, AVX_256, BlueGene, Power6, Fortran")
181
182 set(GMX_FFT_LIBRARY "fftw3" 
183     CACHE STRING "FFT library choices: fftw3,mkl,fftpack[built-in]")
184 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)
185 mark_as_advanced(GMX_BUILD_OWN_FFTW)
186 option(GMX_DISABLE_FFTW_MEASURE 
187        "Do not optimize FFTW setups (not needed with SSE)" OFF)
188 mark_as_advanced(GMX_DISABLE_FFTW_MEASURE)
189 set(GMX_QMMM_PROGRAM "none" 
190     CACHE STRING "QM package choices: none,gaussian,mopac,gamess,orca")
191 option(GMX_BROKEN_CALLOC "Work around broken calloc()" OFF)
192 mark_as_advanced(GMX_BROKEN_CALLOC)
193 option(GMX_MPI_IN_PLACE "Enable MPI_IN_PLACE for MPIs that have it defined" ON)
194 mark_as_advanced(GMX_MPI_IN_PLACE)
195 option(GMX_LOAD_PLUGINS "Compile with plugin support, needed to read VMD supported file formats" ON)
196 mark_as_advanced(GMX_LOAD_PLUGINS)
197
198 option(GMX_GPU  "Enable GPU acceleration" ON)
199 option(GMX_OPENMP "Enable OpenMP-based multithreading" ON)
200
201 option(GMX_GIT_VERSION_INFO "Generate git version information" ${SOURCE_IS_GIT_REPOSITORY})
202 mark_as_advanced(GMX_GIT_VERSION_INFO)
203
204 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)
205 if(UNIX)
206     option(GMX_SYMLINK_OLD_BINARY_NAMES "Create symbolic links for pre-5.0 binary names" ON)
207 endif()
208
209 if(UNIX)
210     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)
211     mark_as_advanced(GMX_PREFER_STATIC_LIBS)
212 endif()
213
214 option(GMX_CYCLE_SUBCOUNTERS "Enable cycle subcounters to get a more detailed cycle timings" OFF)
215 mark_as_advanced(GMX_CYCLE_SUBCOUNTERS)
216
217 ######################################################################
218 # Compiler tests
219 # These need to be done early (before further tests).
220 #####################################################################
221
222 # The cmake/Check{C,CXX}CompilerFlag.cmake files in the GROMACS distribution
223 # are used with permission from CMake v2.8.9 so that GROMACS can detect
224 # invalid options with the Intel Compilers.
225 # These files should be removed from the source tree when a CMake version that
226 # includes the features in question becomes required for building GROMACS.
227 include(CheckCCompilerFlag)
228 include(CheckCXXCompilerFlag)
229
230 # OpenMP check must come before other CFLAGS!
231 if(GMX_OPENMP)
232     find_package(OpenMP)
233     if(OPENMP_FOUND)
234         # CMake on Windows doesn't support linker flags passed to target_link_libraries
235         # (i.e. it treats /openmp as \openmp library file). Also, no OpenMP linker flags are needed.
236         if(NOT (WIN32 AND NOT CYGWIN))
237             if(CMAKE_COMPILER_IS_GNUCC AND GMX_PREFER_STATIC_OPENMP AND NOT APPLE)
238                 set(OpenMP_LINKER_FLAGS "-Wl,-static -lgomp -lrt -Wl,-Bdynamic -lpthread")
239                 set(OpenMP_SHARED_LINKER_FLAGS "")
240             else()
241                 # Only set a linker flag if the user didn't set them manually
242                 if(NOT DEFINED OpenMP_LINKER_FLAGS)
243                     set(OpenMP_LINKER_FLAGS "${OpenMP_C_FLAGS}")
244                 endif()
245                 if(NOT DEFINED OpenMP_SHARED_LINKER_FLAGS)
246                     set(OpenMP_SHARED_LINKER_FLAGS "${OpenMP_C_FLAGS}")
247                 endif()
248             endif()
249         endif()
250     else(OPENMP_FOUND)
251         message(WARNING
252                 "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.")
253         set(GMX_OPENMP OFF CACHE STRING "Whether GROMACS will use OpenMP parallelism." FORCE)
254     endif(OPENMP_FOUND)
255 endif()
256
257
258 include(gmxCFlags)
259 gmx_c_flags()
260
261 include(gmxGetCompilerInfo)
262 get_compiler_version()
263
264 # gcc 4.4.x is buggy and crashes when compiling some files with O3 and OpenMP on.
265 # Detect here whether applying a workaround is needed and will apply it later
266 # on the affected files.
267 include(gmxGCC44O3BugWorkaround)
268 gmx_check_gcc44_bug_workaround_needed(GMX_USE_GCC44_BUG_WORKAROUND)
269
270 # clang 3.0 is buggy for some unknown reason detected during adding
271 # the SSE2 group kernels for GROMACS 4.6. If we ever work out what
272 # that is, we should replace these tests with a compiler feature test,
273 # update GROMACS Redmine task #1039 and perhaps report a clang bug.
274 #
275 # In the meantime, until we require CMake 2.8.10 we cannot rely on it to detect
276 # the compiler version for us. So we need a manual check for clang 3.0.
277 include(gmxDetectClang30)
278 gmx_detect_clang_3_0(COMPILER_IS_CLANG_3_0)
279 if(COMPILER_IS_CLANG_3_0)
280     message(FATAL_ERROR "Your compiler is clang version 3.0, which is known to be buggy for GROMACS. Use a different compiler.")
281 endif()
282
283 ########################################################################
284 # Set up binary and library suffixing 
285 ########################################################################
286 set(GMX_BINARY_SUFFIX "" CACHE STRING "Suffix for GROMACS binaries (default: _d for double, _mpi for MPI, _mpi_d for MPI and double).")
287 set(GMX_LIBS_SUFFIX "" 
288   CACHE STRING "Suffix for GROMACS libs (default: _d for double, _mpi for MPI, _mpi_d for MPI and double).")
289 if (GMX_DEFAULT_SUFFIX)
290   set(GMX_BINARY_SUFFIX "")
291   set(GMX_LIBS_SUFFIX "")
292   if (GMX_MPI)
293     set(GMX_BINARY_SUFFIX "_mpi")
294     set(GMX_LIBS_SUFFIX "_mpi")
295   endif(GMX_MPI)
296   if (GMX_DOUBLE)
297     set (GMX_BINARY_SUFFIX "${GMX_BINARY_SUFFIX}_d")
298     set (GMX_LIBS_SUFFIX "${GMX_LIBS_SUFFIX}_d")
299   endif(GMX_DOUBLE)
300   if (GMX_OPENMM)
301     set (GMX_BINARY_SUFFIX "-openmm")
302     set (GMX_LIBS_SUFFIX "_openmm")
303   endif(GMX_OPENMM)
304   mark_as_advanced(FORCE GMX_BINARY_SUFFIX GMX_LIBS_SUFFIX)
305   if (NOT SUFFIX_QUIETLY)
306     message(STATUS "Using default binary suffix: \"${GMX_BINARY_SUFFIX}\"")
307     message(STATUS "Using default library suffix: \"${GMX_LIBS_SUFFIX}\"")
308   endif (NOT SUFFIX_QUIETLY)
309 else(GMX_DEFAULT_SUFFIX)
310   mark_as_advanced(CLEAR GMX_BINARY_SUFFIX GMX_LIBS_SUFFIX)
311   if (NOT SUFFIX_QUIETLY)
312     message(STATUS "Using manually set binary suffix: \"${GMX_BINARY_SUFFIX}\"")
313     message(STATUS "Using manually set library suffix: \"${GMX_LIBS_SUFFIX}\"")
314   endif (NOT SUFFIX_QUIETLY)
315 endif(GMX_DEFAULT_SUFFIX)
316 set(SUFFIX_QUIETLY TRUE CACHE INTERNAL "")
317
318 set(PKG_CFLAGS "")
319 if(GMX_DOUBLE)
320     set(PKG_CFLAGS "${PKG_CFLAGS} -DGMX_DOUBLE")
321 endif(GMX_DOUBLE)
322 if(GMX_SOFTWARE_INVSQRT)
323   set(PKG_CFLAGS "${PKG_CFLAGS} -DGMX_SOFTWARE_INVSQRT")
324 endif(GMX_SOFTWARE_INVSQRT)
325 if(GMX_POWERPC_INVSQRT)
326   set(PKG_CFLAGS "${PKG_CFLAGS} -DGMX_POWERPC_INVSQRT")
327 endif(GMX_POWERPC_INVSQRT)
328
329 ########################################################################
330 #Process MPI settings
331 ########################################################################
332 include(gmxManageMPI)
333
334 #######################################################################
335 # Check for options incompatible with OpenMM build                    #
336 #######################################################################
337 if(GMX_OPENMM)
338     # we'll use the built-in fft to avoid unnecessary dependencies
339     string(TOUPPER ${GMX_FFT_LIBRARY} GMX_FFT_LIBRARY)
340     if(NOT ${GMX_FFT_LIBRARY} STREQUAL "FFTPACK")
341         message(STATUS "No external FFT libraries needed for the OpenMM build, switching to fftpack!")
342         set(GMX_FFT_LIBRARY "fftpack" CACHE STRING 
343                 "No external FFT libraries needed for the OpenMM build, switching to  fftpack!" FORCE)
344     endif()
345     if(GMX_MPI)
346         message(FATAL_ERROR "The OpenMM build is not compatible with MPI!")
347     endif(GMX_MPI)
348     if(GMX_THREAD_MPI)
349         message(STATUS "Thread-MPI not compatible with OpenMM, disabled!")
350         set(GMX_THREAD_MPI OFF CACHE BOOL
351                 "Thread-MPI not compatible with OpenMM build, disabled!" FORCE)
352     endif(GMX_THREAD_MPI)
353     if(GMX_OPENMP)
354         message(STATUS "OpenMP multithreading not compatible with OpenMM, disabled")
355         set(GMX_OPENMP OFF CACHE BOOL
356             "OpenMP multithreading not compatible with OpenMM, disabled!" FORCE)
357     endif()
358     if(GMX_SOFTWARE_INVSQRT)
359         set(GMX_SOFTWARE_INVSQRT OFF CACHE STRING 
360                 "The OpenMM build does not need GROMACS software 1/sqrt!" FORCE)
361     endif(GMX_SOFTWARE_INVSQRT)
362     string(TOUPPER ${GMX_CPU_ACCELERATION} GMX_CPU_ACCELERATION)
363     if(NOT GMX_CPU_ACCELERATION STREQUAL "NONE")
364         message(STATUS "Switching off CPU-based acceleration, the OpenMM build does not support/need any!")
365         set(GMX_CPU_ACCELERATION "None" CACHE STRING
366             "Switching off CPU-based acceleration, the OpenMM build does not support/need any!" FORCE)
367     endif()
368     if(GMX_FAHCORE)
369         message(FATAL_ERROR "The OpenMM build does not support FAH build!")
370     endif(GMX_FAHCORE)
371     if(GMX_DOUBLE)
372         message(FATAL_ERROR  "The OpenMM-build does not support double precision calculations!")
373     endif()
374     # mark as advanced the unused variables
375     mark_as_advanced(FORCE GMX_CPU_ACCELERATION GMX_MPI GMX_FFT_LIBRARY 
376         GMX_QMMM_PROGRAM GMX_THREAD_MPI GMX_DOUBLE)
377 else(GMX_OPENMM)
378      mark_as_advanced(CLEAR GMX_CPU_ACCELERATION GMX_MPI GMX_FFT_LIBRARY 
379         GMX_QMMM_PROGRAM GMX_THREAD_MPI GMX_DOUBLE)
380 endif(GMX_OPENMM)
381
382
383 ########################################################################
384 # Basic system tests (standard libraries, headers, functions, types)   #
385 ########################################################################
386 include(CheckIncludeFiles)
387 include(CheckIncludeFileCXX)
388 check_include_files(unistd.h     HAVE_UNISTD_H)
389 check_include_files(pwd.h        HAVE_PWD_H)
390 check_include_files(pthread.h    HAVE_PTHREAD_H)
391 check_include_files(dirent.h     HAVE_DIRENT_H)
392 check_include_files(sys/time.h   HAVE_SYS_TIME_H)
393 check_include_files(io.h                 HAVE_IO_H)
394 check_include_files(sched.h      HAVE_SCHED_H)
395
396 check_include_files(regex.h      HAVE_POSIX_REGEX)
397 check_include_file_cxx(regex     HAVE_CXX11_REGEX)
398 # TODO: It could be nice to inform the user if no regex support is found,
399 # as selections won't be fully functional.
400
401 include(CheckFunctionExists)
402 check_function_exists(strdup            HAVE_STRDUP)
403 check_function_exists(posix_memalign    HAVE_POSIX_MEMALIGN)
404 check_function_exists(memalign          HAVE_MEMALIGN)
405 check_function_exists(_aligned_malloc   HAVE__ALIGNED_MALLOC)
406 check_function_exists(gettimeofday      HAVE_GETTIMEOFDAY)
407 check_function_exists(fsync             HAVE_FSYNC)
408 check_function_exists(_fileno           HAVE__FILENO)
409 check_function_exists(fileno            HAVE_FILENO)
410 check_function_exists(_commit           HAVE__COMMIT)
411 check_function_exists(sigaction         HAVE_SIGACTION)
412 check_function_exists(sysconf           HAVE_SYSCONF)
413 check_function_exists(sched_setaffinity HAVE_SCHED_SETAFFINITY)
414 check_function_exists(sched_getaffinity HAVE_SCHED_GETAFFINITY)
415 check_function_exists(rsqrt             HAVE_RSQRT)
416 check_function_exists(rsqrtf            HAVE_RSQRTF)
417 check_function_exists(sqrtf             HAVE_SQRTF)
418
419 include(CheckLibraryExists)
420 check_library_exists(m sqrt "" HAVE_LIBM)
421 check_library_exists(m cbrt "" HAVE_CBRT)
422
423
424 include(CheckTypeSize)
425
426 check_type_size("int"           SIZEOF_INT) 
427 check_type_size("long int"      SIZEOF_LONG_INT) 
428 check_type_size("long long int" SIZEOF_LONG_LONG_INT) 
429 check_type_size("off_t"         SIZEOF_OFF_T)
430 check_type_size("void *"        SIZEOF_VOIDP)
431
432 if (CMAKE_C_SIZEOF_DATA_PTR EQUAL 8)
433     set(GMX_64_BIT TRUE)
434 else (CMAKE_C_SIZEOF_DATA_PTR EQUAL 8)
435     set(GMX_64_BIT FALSE)
436 endif (CMAKE_C_SIZEOF_DATA_PTR EQUAL 8)
437
438 include(TestBigEndian)
439 test_big_endian(GMX_INTEGER_BIG_ENDIAN)
440
441
442
443
444 ########################################################################
445 # Find external packages                                               #
446 ########################################################################
447 if(UNIX)
448     if(GMX_PREFER_STATIC_LIBS)
449         # On Linux .a is the static library suffix, on Mac OS X .lib can also
450         # be used, so we'll add both to the preference list.
451         SET(CMAKE_FIND_LIBRARY_SUFFIXES ".lib;.a" ${CMAKE_FIND_LIBRARY_SUFFIXES})
452         if(SHARED_LIBS_DEFAULT)
453             if(BUILD_SHARED_LIBS) #Warn the user about the combination. But don't overwrite the request.
454                 message(WARNING "Static libraries requested, and shared Gromacs libraries requested.")
455             elseif(NOT DEFINED BUILD_SHARED_LIBS) #Change default to OFF. Don't warn if it's already off.
456                 message(WARNING "Static libraries requested, the GROMACS libraries will also be build static (BUILD_SHARED_LIBS=OFF)")
457                 set(SHARED_LIBS_DEFAULT OFF)
458             endif()
459         endif()
460     endif()
461 endif()
462 option(BUILD_SHARED_LIBS "Enable shared libraries (can be problematic with MPI, Windows)" ${SHARED_LIBS_DEFAULT})
463
464 option(GMX_XML "Use libxml2 to parse xml files" ON)
465 if (GMX_XML)
466   find_package(LibXml2)
467   set(PKG_XML "")
468   if(LIBXML2_FOUND)
469     include_directories(${LIBXML2_INCLUDE_DIR})
470     set(PKG_XML libxml-2.0)
471     set(XML_LIBRARIES ${LIBXML2_LIBRARIES})
472   endif(LIBXML2_FOUND)
473 endif(GMX_XML)
474
475 option(GMX_GSL "Add support for gsl" OFF)
476 if (GMX_GSL)
477   find_package(gsl)
478   set(PKG_GSL "")
479   if(GSL_FOUND)
480     include_directories(${GSL_INCLUDE_DIR})
481     set(PKG_GSL gsl)
482     set(HAVE_LIBGSL 1)
483   endif(GSL_FOUND)
484 endif (GMX_GSL)
485
486 option(GMX_X11 "Use X window system" OFF)
487 if (GMX_X11)
488         find_package(X11)
489         # X11 includes/libraries are only set in the ngmx subdirectory!
490         if(X11_FOUND)
491         set(HAVE_X11 1)
492         endif(X11_FOUND)
493 endif(GMX_X11)
494
495 include(ThreadMPI)
496 set(THREAD_MPI_LIB thread_mpi)
497 if(GMX_THREAD_MPI)
498     tmpi_get_source_list(THREAD_MPI_SRC CXX)
499     set(PKG_CFLAGS "${PKG_CFLAGS} -DGMX_THREAD_MPI")
500     set(GMX_MPI 1)
501 else(GMX_THREAD_MPI)
502     tmpi_get_source_list(THREAD_MPI_SRC CXX NOMPI)
503 endif(GMX_THREAD_MPI)
504
505 if(GMX_OPENMM)
506     set(CUDA_BUILD_EMULATION OFF)
507     find_package(CUDA 3.1 REQUIRED)
508     add_definitions(-DGMX_OPENMM)
509     if(CMAKE_BUILD_TYPE STREQUAL "DEBUG")    
510         set(CUDA_VERBOSE_BUILD ON)
511     endif()
512     find_package(OpenMM) 
513 endif(GMX_OPENMM)
514
515 if(GMX_GPU)
516     # now that we have detected the dependencies, do the second configure pass
517     gmx_gpu_setup()
518 endif(GMX_GPU)
519
520 if(APPLE)
521    find_library(ACCELERATE_FRAMEWORK Accelerate)
522    list(APPEND GMX_EXTRA_LIBRARIES ${ACCELERATE_FRAMEWORK})
523 endif(APPLE)
524
525 if(CYGWIN)
526     set(GMX_CYGWIN 1)
527 endif(CYGWIN)
528
529 if(WIN32 AND NOT CYGWIN)
530     set(GMX_NATIVE_WINDOWS 1)
531 endif()
532
533 # only bother with finding git and using version.h if the source is a git repo
534 if(GMX_GIT_VERSION_INFO)
535     if (NOT SOURCE_IS_GIT_REPOSITORY)
536         message(FATAL_ERROR
537             "Cannot generate git version information from source tree not under git. "
538             "Set GMX_GIT_VERSION_INFO=OFF to proceed.")
539     endif ()
540     # We need at least git v1.5.3 be able to parse git's date output. If not
541     # found or the version is too small, we can't generate version information.
542     find_package(Git)
543
544     # Find out the git version
545     if(GIT_FOUND AND NOT GIT_VERSION)
546       execute_process(COMMAND ${GIT_EXECUTABLE} "--version"
547         OUTPUT_VARIABLE _exec_out
548         OUTPUT_STRIP_TRAILING_WHITESPACE)
549       string(REGEX REPLACE "git version (.*)" "\\1" GIT_VERSION ${_exec_out})
550       set(GIT_VERSION ${GIT_VERSION} CACHE STRING "Git version")
551       mark_as_advanced(GIT_VERSION)
552     endif()
553
554     if(NOT GIT_FOUND OR GIT_VERSION VERSION_LESS "1.5.3")
555         message(FATAL_ERROR
556             "No compatible git version found (>= 1.5.3 required). "
557             "Won't be able to generate development version information. "
558             "Set GMX_GIT_VERSION_INFO=OFF to proceed.")
559     endif()
560 endif()
561
562 option(GMX_INTERNAL_BOOST "Use minimal internal version of boost" OFF)
563 if ( NOT GMX_INTERNAL_BOOST )
564   find_package( Boost 1.44.0 )
565 else ( NOT GMX_INTERNAL_BOOST )
566   set (Boost_FOUND FALSE)
567 endif( NOT GMX_INTERNAL_BOOST )
568
569 if(Boost_FOUND AND NOT Boost_VERSION VERSION_LESS "104400" )
570   include_directories(${Boost_INCLUDE_DIRS})
571 else()
572   if(NOT BOOST_QUIETLY)
573     message("Boost >= 1.44 not found. Using minimal internal version. Not recommended if GROMACS is used as library!")
574   endif()
575   include_directories(${CMAKE_SOURCE_DIR}/src/external/boost)
576   add_definitions( -DBOOST_NO_TYPEID )  #TYPEID not supported for minimal internal version (would add significant more code)
577   # TODO: Propagate the above settings to the installed CMakeFiles.txt template
578   # (from share/template/)
579   # TODO: Reorder stuff such that INCL_INSTALL_DIR could be used here
580   set(PKG_CFLAGS "${PKG_CFLAGS} -DBOOST_NO_TYPEID -I${GMX_INSTALL_PREFIX}include/gromacs/external/boost")
581   install(DIRECTORY ${CMAKE_SOURCE_DIR}/src/external/boost/boost
582           DESTINATION ${GMX_INSTALL_PREFIX}include/gromacs/external/boost
583           COMPONENT development)
584 endif()
585 set(BOOST_QUIETLY TRUE CACHE INTERNAL "")
586
587 if (LIBXML2_FOUND)
588     option(GMX_BUILD_UNITTESTS "Build unit tests with BUILD_TESTING (uses Google C++ Testing and Mocking Frameworks, requires libxml2)" ON)
589 else (LIBXML2_FOUND)
590     set(GMX_BUILD_UNITTESTS OFF)
591 endif (LIBXML2_FOUND)
592 mark_as_advanced(GMX_BUILD_UNITTESTS)
593 set(MEMORYCHECK_SUPPRESSIONS_FILE ${CMAKE_SOURCE_DIR}/cmake/legacy_and_external.supp)
594
595 ########################################################################
596 # Generate development version info for cache
597 ########################################################################
598 # set(GEN_VERSION_INFO_INTERNAL "ON")
599 # include(gmxGenerateVersionString)
600
601 ########################################################################
602 # Our own GROMACS tests
603 ########################################################################
604
605 add_definitions( -DHAVE_CONFIG_H )
606 include_directories(${CMAKE_SOURCE_DIR}/src)
607 # Required for config.h, maybe should only be set in src/CMakeLists.txt
608 include_directories(${CMAKE_BINARY_DIR}/src)
609 # Required for gmx_header_config_gen.h to be found before installation
610 include_directories(${CMAKE_BINARY_DIR}/src/gromacs/utility)
611 # Required for now to make old code compile
612 include_directories(${CMAKE_SOURCE_DIR}/src/gromacs/legacyheaders)
613
614 include(gmxTestInlineASM)
615 gmx_test_inline_asm_gcc_x86(GMX_X86_GCC_INLINE_ASM)
616
617 include(gmxSetBuildInformation)
618 gmx_set_build_information()
619 if(BUILD_CPU_FEATURES MATCHES "rdtscp" AND NOT GMX_DISTRIBUTABLE_BUILD)
620     # The timestep counter headers do not include config.h
621     add_definitions(-DHAVE_RDTSCP)
622 endif(BUILD_CPU_FEATURES MATCHES "rdtscp" AND NOT GMX_DISTRIBUTABLE_BUILD)
623
624 include(gmxTestFloatFormat)
625 gmx_test_float_format(GMX_FLOAT_FORMAT_IEEE754 
626                       GMX_IEEE754_BIG_ENDIAN_BYTE_ORDER
627                       GMX_IEEE754_BIG_ENDIAN_WORD_ORDER)
628
629 include(gmxTestLargeFiles)
630 gmx_test_large_files(GMX_LARGEFILES)
631
632 include(gmxTestSignal)
633 gmx_test_sigusr1(HAVE_SIGUSR1)
634
635 include(gmxTestInline)
636 gmx_test_inline(INLINE_KEYWORD)
637
638 include(gmxTestRestrict)
639 gmx_test_restrict(RESTRICT_KEYWORD)
640
641 include(gmxTestPipes)
642 gmx_test_pipes(HAVE_PIPES)
643
644 include(gmxTestIsfinite)
645 gmx_test_isfinite(HAVE_ISFINITE)
646 gmx_test__isfinite(HAVE__ISFINITE)
647 gmx_test__finite(HAVE__FINITE)
648
649 include(gmxTestCXX11)
650 gmx_test_cxx11(GMX_CXX11 CXX11_FLAG)
651 set(GROMACS_CXX_FLAGS "${CXX11_FLAG} ${GROMACS_CXX_FLAGS}")
652 if(CXX11_FLAG AND GMX_GPU)
653     #FIXME: add proper solution for progate all but cxx11 flag
654     set(CUDA_PROPAGATE_HOST_FLAGS no)
655     message(WARNING "Please manually add compiler flags to CUDA_NVCC_FLAGS. Automatic propogation temporary not working.")
656 endif()
657
658 include(gmxTestXDR)
659 gmx_test_xdr(GMX_SYSTEM_XDR)
660 if(NOT GMX_SYSTEM_XDR)
661     set(GMX_INTERNAL_XDR 1)
662     set(PKG_CFLAGS "${PKG_CFLAGS} -DGMX_INTERNAL_XDR")
663 endif(NOT GMX_SYSTEM_XDR)
664
665 # Process nonbonded accelerated kernels settings
666 string(TOUPPER ${GMX_CPU_ACCELERATION} ${GMX_CPU_ACCELERATION})
667 if(${GMX_CPU_ACCELERATION} STREQUAL "NONE")
668     # nothing to do
669 elseif(${GMX_CPU_ACCELERATION} STREQUAL "SSE2")
670
671     GMX_TEST_CFLAG(GNU_SSE2_CFLAG "-msse2" GROMACS_C_FLAGS)
672     if(NOT GNU_SSE2_CFLAG)
673         GMX_TEST_CFLAG(MSVC_SSE2_CFLAG "/arch:SSE2" GROMACS_C_FLAGS)
674     endif(NOT GNU_SSE2_CFLAG)
675
676     GMX_TEST_CXXFLAG(GNU_SSE2_CXXFLAG "-msse2" GROMACS_CXX_FLAGS)
677     if(NOT GNU_SSE2_CXXFLAG)
678         GMX_TEST_CXXFLAG(MSVC_SSE2_CXXFLAG "/arch:SSE2" GROMACS_CXX_FLAGS)
679     endif(NOT GNU_SSE2_CXXFLAG)
680
681     # We dont warn for lacking SSE2 flag support, since that is probably standard today.
682
683     # Only test the include after we have tried to add the correct flag for SSE2 support
684     check_include_file(emmintrin.h  HAVE_EMMINTRIN_H ${GROMACS_C_FLAGS})
685
686     if(NOT HAVE_EMMINTRIN_H)
687         message(FATAL_ERROR "Cannot find emmintrin.h, which is required for SSE2 intrinsics support.")
688     endif(NOT HAVE_EMMINTRIN_H)
689
690     set(GMX_CPU_ACCELERATION_X86_SSE2 1)
691     # The user should not be able to set this orthogonally to the acceleration
692     set(GMX_X86_SSE2 1)
693     if (NOT ACCELERATION_QUIETLY)
694       message(STATUS "Enabling SSE2 Gromacs acceleration, and it will help compiler optimization.")
695     endif()
696
697 elseif(${GMX_CPU_ACCELERATION} STREQUAL "SSE4.1")
698
699     GMX_TEST_CFLAG(GNU_SSE4_CFLAG "-msse4.1" GROMACS_C_FLAGS)
700     if (NOT GNU_SSE4_CFLAG)
701         GMX_TEST_CFLAG(MSVC_SSE4_CFLAG "/arch:SSE4.1" GROMACS_C_FLAGS)
702     endif(NOT GNU_SSE4_CFLAG)
703     if (NOT GNU_SSE4_CFLAG AND NOT MSVC_SSE4_CFLAG)
704         message(WARNING "No C SSE4.1 flag found. Consider a newer compiler, or disable SSE4.1 for slightly lower performance.")
705         # Not surprising if we end up here! MSVC current does not support the SSE4.1 flag. However, it appears to accept SSE4.1
706         # intrinsics when SSE2 support is enabled, so we try that instead.
707         GMX_TEST_CFLAG(MSVC_SSE2_CFLAG "/arch:SSE2" GROMACS_C_FLAGS)
708     endif(NOT GNU_SSE4_CFLAG AND NOT MSVC_SSE4_CFLAG)
709
710     GMX_TEST_CXXFLAG(GNU_SSE4_CXXFLAG "-msse4.1" GROMACS_CXX_FLAG)
711     if (NOT GNU_SSE4_CXXFLAG)
712        GMX_TEST_CXXFLAG(MSVC_SSE4_CXXFLAG "/arch:SSE4.1" GROMACS_CXX_FLAGS)
713     endif(NOT GNU_SSE4_CXXFLAG)
714     if (NOT GNU_SSE4_CXXFLAG AND NOT MSVC_SSE4_CXXFLAG)
715         message(WARNING "No C++ SSE4.1 flag found. Consider a newer compiler, or disable SSE4.1 for slightly lower performance.")
716         # Not surprising if we end up here! MSVC current does not support the SSE4.1 flag. However, it appears to accept SSE4.1
717         # intrinsics when SSE2 support is enabled, so we try that instead.
718         GMX_TEST_CXXFLAG(MSVC_SSE2_CXXFLAG "/arch:SSE2" GROMACS_CXX_FLAGS)
719     endif(NOT GNU_SSE4_CXXFLAG AND NOT MSVC_SSE4_CXXFLAG)
720
721     # This must come after we have added the -msse4.1 flag on some platforms.
722     check_include_file(smmintrin.h  HAVE_SMMINTRIN_H ${GROMACS_C_FLAGS})
723
724     if(NOT HAVE_SMMINTRIN_H)
725         message(FATAL_ERROR "Cannot find smmintrin.h, which is required for SSE4.1 intrinsics support.")
726     endif(NOT HAVE_SMMINTRIN_H)
727
728     set(GMX_CPU_ACCELERATION_X86_SSE4_1 1)
729     # The user should not be able to set this orthogonally to the acceleration
730     set(GMX_X86_SSE4_1 1)
731     set(GMX_X86_SSE2   1)
732     if (NOT ACCELERATION_QUIETLY)
733       message(STATUS "Enabling SSE4.1 Gromacs acceleration, and it will help compiler optimization.")
734     endif()
735
736 elseif(${GMX_CPU_ACCELERATION} STREQUAL "AVX_128_FMA" OR ${GMX_CPU_ACCELERATION} STREQUAL "AVX_256")
737
738     # Set the AVX compiler flag for both these choices!
739
740     GMX_TEST_CFLAG(GNU_AVX_CFLAG "-mavx" GROMACS_C_FLAGS)
741     if (NOT GNU_AVX_CFLAG)
742         GMX_TEST_CFLAG(MSVC_AVX_CFLAG "/arch:AVX" GROMACS_C_FLAGS)
743     endif (NOT GNU_AVX_CFLAG)
744     if (NOT GNU_AVX_CFLAG AND NOT MSVC_AVX_CFLAG)
745         message(WARNING "No C AVX flag found. Consider a newer compiler, or try SSE4.1 (lower performance).")
746     endif (NOT GNU_AVX_CFLAG AND NOT MSVC_AVX_CFLAG)
747
748     GMX_TEST_CXXFLAG(GNU_AVX_CXXFLAG "-mavx" GROMACS_CXX_FLAGS)
749     if (NOT GNU_AVX_CXXFLAG)
750        GMX_TEST_CXXFLAG(MSVC_AVX_CXXFLAG "/arch:AVX" GROMACS_CXX_FLAGS)
751     endif (NOT GNU_AVX_CXXFLAG)
752     if (NOT GNU_AVX_CXXFLAG AND NOT MSVC_AVX_CXXFLAG)
753        message(WARNING "No C++ AVX flag found. Consider a newer compiler, or try SSE4.1 (lower performance).")
754     endif (NOT GNU_AVX_CXXFLAG AND NOT MSVC_AVX_CXXFLAG)
755
756     # Set the FMA4 flags (MSVC doesn't require any)
757     if(${GMX_CPU_ACCELERATION} STREQUAL "AVX_128_FMA" AND NOT MSVC)
758         GMX_TEST_CFLAG(GNU_FMA_CFLAG "-mfma4" GROMACS_C_FLAGS)
759         if (NOT GNU_FMA_CFLAG)
760             message(WARNING "No C FMA4 flag found. Consider a newer compiler, or try SSE4.1 (lower performance).")
761         endif(NOT GNU_FMA_CFLAG)
762         GMX_TEST_CFLAG(GNU_XOP_CFLAG "-mxop" GROMACS_C_FLAGS)
763         # No big deal if we do not have xop, so no point yelling warnings about it.
764         if (CMAKE_CXX_COMPILER_LOADED)
765             GMX_TEST_CXXFLAG(GNU_FMA_CXXFLAG "-mfma4" GROMACS_CXX_FLAGS)
766             if (NOT GNU_FMA_CXXFLAG)
767                 message(WARNING "No C++ FMA flag found. Consider a newer compiler, or try SSE4.1 (lower performance).")
768             endif (NOT GNU_FMA_CXXFLAG)
769             GMX_TEST_CXXFLAG(GNU_XOP_CXXFLAG "-mxop" GROMACS_CXX_FLAGS)
770             # No big deal if we do not have xop, so no point yelling warnings about it.
771         endif()
772     endif()
773
774     # Only test the header after we have tried to add the flag for AVX support
775     check_include_file(immintrin.h  HAVE_IMMINTRIN_H ${GROMACS_C_FLAGS})
776
777     if(NOT HAVE_IMMINTRIN_H)
778         message(FATAL_ERROR "Cannot find immintrin.h, which is required for AVX intrinsics support. Consider switching compiler.")
779     endif(NOT HAVE_IMMINTRIN_H)
780
781     if(${GMX_CPU_ACCELERATION} STREQUAL "AVX_256")
782         try_compile(TEST_AVX ${CMAKE_BINARY_DIR}
783             "${CMAKE_SOURCE_DIR}/cmake/TestAVX.c"
784             COMPILE_DEFINITIONS "${GROMACS_C_FLAGS}")
785         if(NOT TEST_AVX)
786             message(FATAL_ERROR "Cannot compile AVX intrinsics. Consider switching compiler.")
787         endif()
788     endif()
789
790     # GCC requires x86intrin.h for FMA support. MSVC 2010 requires intrin.h for FMA support.
791     check_include_file(x86intrin.h HAVE_X86INTRIN_H ${GROMACS_C_FLAGS})
792     check_include_file(intrin.h HAVE_INTRIN_H ${GROMACS_C_FLAGS})
793
794     # The user should not be able to set this orthogonally to the acceleration
795     set(GMX_X86_SSE4_1 1)
796     set(GMX_X86_SSE2   1)
797
798     # But just enable one of the choices internally...
799     if(${GMX_CPU_ACCELERATION} STREQUAL "AVX_128_FMA")
800         set(GMX_CPU_ACCELERATION_X86_AVX_128_FMA 1)
801         set(GMX_X86_AVX_128_FMA 1)
802         if (NOT ACCELERATION_QUIETLY)
803           message(STATUS "Enabling 128-bit AVX Gromacs acceleration (with fused-multiply add), and it will help compiler optimization.")
804         endif()
805     else()
806         # If we are not doing AVX_128, it must be AVX_256...
807         set(GMX_CPU_ACCELERATION_X86_AVX_256 1)
808         set(GMX_X86_AVX_256 1)
809         if (NOT ACCELERATION_QUIETLY)
810           message(STATUS "Enabling 256-bit AVX Gromacs acceleration, and it will help compiler optimization.")
811         endif()
812     endif()
813
814 elseif(${GMX_CPU_ACCELERATION} STREQUAL "FORTRAN")
815
816 #    Fortran is temporarily disabled while we push in nbNxN kernels.
817 #    We need to fake it a bit here to avoid jenkins build errors!
818 #    add_definitions(-DGMX_FORTRAN)
819
820 elseif(${GMX_CPU_ACCELERATION} STREQUAL "BLUEGENE")
821 # GMX_CPU_ACCELERATION=BlueGene should be set in the Toolchain-BlueGene?-???.cmake file
822     if (NOT ACCELERATION_QUIETLY)
823       message(STATUS "Configuring for BlueGene")
824     endif()
825     set(GMX_BLUEGENE 1)
826     if (${CMAKE_SYSTEM_NAME} STREQUAL "BlueGeneL")
827         set(SHARED_LIBS_DEFAULT OFF CACHE BOOL "Shared libraries not compatible with BlueGene/L, disabled!" FORCE)
828         set(BUILD_SHARED_LIBS OFF CACHE BOOL "Shared libraries not compatible with BlueGene/L, disabled!" FORCE)
829     endif (${CMAKE_SYSTEM_NAME} STREQUAL "BlueGeneL")
830     set(GMX_SOFTWARE_INVSQRT OFF CACHE BOOL "Do not use software reciprocal square root on BlueGene" FORCE)
831     set(GMX_POWERPC_INVSQRT ON CACHE BOOL "Use hardware reciprocal square root on BlueGene" FORCE)
832     set(GMX_X11 OFF CACHE BOOL "X11 not compatible with BlueGene, disabled!" FORCE)
833     set(GMX_THREAD_MPI OFF CACHE BOOL "Thread-MPI not compatible with BlueGene, disabled!" FORCE)
834     set(GMX_MPI ON CACHE BOOL "Use MPI on BlueGene" FORCE)
835 # Access to /etc/passwd is not available on the back end of BlueGene,
836 # despite being detected by CMake. This can cause linker warnings
837 # about harmless things in src/gmxlib/string2.h.
838     set(HAVE_PWD_H OFF)
839 # The automatic testing for endianness does not work for the BlueGene cross-compiler
840     set(GMX_IEEE754_BIG_ENDIAN_BYTE_ORDER 1 CACHE INTERNAL "BlueGene has big endian FP byte order (by default)" FORCE)
841     set(GMX_IEEE754_BIG_ENDIAN_WORD_ORDER 1 CACHE INTERNAL "BlueGene has big endian FP word order (by default)" FORCE)
842 elseif(${GMX_CPU_ACCELERATION} STREQUAL "POWER6")
843     set(GMX_POWER6 1)
844     set(GMX_SOFTWARE_INVSQRT OFF CACHE BOOL "Do not use software reciprocal square root on Power6" FORCE)
845     set(GMX_POWERPC_INVSQRT ON CACHE BOOL "Use hardware reciprocal square root on Power6" FORCE)
846 else(${GMX_CPU_ACCELERATION} STREQUAL "NONE")
847     MESSAGE(FATAL_ERROR "Unrecognized option for accelerated kernels: ${GMX_CPU_ACCELERATION}. Pick one of None, SSE2, SSE4.1, AVX_128_FMA, AVX_256, Fortran, BlueGene, Power6")
848 endif(${GMX_CPU_ACCELERATION} STREQUAL "NONE")
849 set(ACCELERATION_QUIETLY TRUE CACHE INTERNAL "")
850
851 if(GMX_FORTRAN OR GMX_POWER6)
852     if (GMX_THREAD_MPI)
853         message(FATAL_ERROR "FORTRAN/POWER6 is incompatible with thread-MPI and only provides a speed-up on certain IBM compilers. Disable FORTRAN (or threads if you really want to use FORTRAN kernels).")
854     endif(GMX_THREAD_MPI)
855     enable_language(Fortran)
856     include(FortranCInterface)
857     discover_fortran_mangling(prefix isupper suffix extra_under_score found)
858     if(extra_under_score)
859         set(extrasuffix "_")
860     endif(extra_under_score)
861     if(prefix)
862       set(prefix "${prefix} ##")
863     endif(prefix)
864     if(suffix)
865       set(suffix "## ${suffix}")
866       if(extrasuffix)
867         set(extrasuffix "${suffix}${extrasuffix}")
868       endif(extrasuffix)
869     else(suffix)
870       if(extrasuffix)
871         # Don't know if this is needed, but it can't hurt
872         set(extrasuffix "## ${extrasuffix}")
873       endif(extrasuffix)
874     endif(suffix)
875
876     if(isupper)
877         set(F77_FUNCDEF   "${prefix} NAME ${suffix}")
878         # The underscored versions are not currently used.
879         #set(F77_FUNCDEF_  "${prefix} NAME ${extrasuffix}")
880     else(isupper)
881         set(F77_FUNCDEF   "${prefix} name ${suffix}")
882         #set(F77_FUNCDEF_  "${prefix} name ${extrasuffix}")
883     endif(isupper)
884 else(GMX_FORTRAN OR GMX_POWER6)
885         set(F77_FUNCDEF   "name ## _")
886         #set(F77_FUNCDEF_  "name ## _")
887 endif(GMX_FORTRAN OR GMX_POWER6)
888
889 # Process QM/MM Settings
890 string(TOUPPER ${GMX_QMMM_PROGRAM} ${GMX_QMMM_PROGRAM})
891 if(${GMX_QMMM_PROGRAM} STREQUAL "GAUSSIAN")
892     set(GMX_QMMM_GAUSSIAN 1)
893 elseif(${GMX_QMMM_PROGRAM} STREQUAL "MOPAC")
894     set(GMX_QMMM_MOPAC 1)
895 elseif(${GMX_QMMM_PROGRAM} STREQUAL "GAMESS")
896     set(GMX_QMMM_GAMESS 1)
897 elseif(${GMX_QMMM_PROGRAM} STREQUAL "ORCA")
898     set(GMX_QMMM_ORCA 1)
899 elseif(${GMX_QMMM_PROGRAM} STREQUAL "NONE")
900     # nothing to do
901 else(${GMX_QMMM_PROGRAM} STREQUAL "GAUSSIAN")
902     MESSAGE(FATAL_ERROR "Invalid QM/MM program option: ${GMX_QMMM_PROGRAM}. Choose one of: Gaussian, Mopac, Gamess, Orca, None")
903 endif(${GMX_QMMM_PROGRAM} STREQUAL "GAUSSIAN")
904
905 # Process FFT library settings - if not OpenMM build 
906 string(TOUPPER ${GMX_FFT_LIBRARY} ${GMX_FFT_LIBRARY})
907 set(PKG_FFT "")
908 set(PKG_FFT_LIBS "")
909 if(${GMX_FFT_LIBRARY} STREQUAL "FFTW3")
910     if(GMX_DOUBLE)
911         set(FFTW fftw)
912     else()
913         set(FFTW fftwf)
914     endif()
915
916     if(GMX_BUILD_OWN_FFTW)
917       add_subdirectory(src/contrib/fftw)
918     else()
919       find_package(FFTW COMPONENTS ${FFTW})
920     endif()
921
922     string(TOUPPER "${FFTW}" FFTW)
923     set(PKG_FFT "${${FFTW}_PKG}")
924     include_directories(${${FFTW}_INCLUDE_DIRS})
925     set(FFT_LIBRARIES ${${FFTW}_LIBRARIES})
926     if(NOT ${FFTW}_FOUND)
927       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.")
928     endif()
929
930     set(GMX_FFT_FFTW3 1)
931
932     if (NOT ${GMX_CPU_ACCELERATION} STREQUAL "NONE" AND NOT ${FFTW}_HAVE_SIMD) 
933       message(WARNING "The fftw library found is compiled without SIMD support, which makes it slow. Consider recompiling it or contact your admin")
934     endif()
935
936     if(NOT ${GMX_CPU_ACCELERATION} STREQUAL "NONE" AND ${FFTW}_HAVE_AVX)
937         # If we're not doing CPU acceleration, we don't care about FFTW performance on x86 either
938         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.")
939     endif()
940
941 elseif(${GMX_FFT_LIBRARY} STREQUAL "MKL")
942 #    MESSAGE(STATUS "Using external FFT library - Intel MKL")
943     find_package(MKL REQUIRED)
944     include_directories(${MKL_INCLUDE_DIR})
945     set(FFT_LIBRARIES ${MKL_LIBRARIES})
946     set(PKG_FFT_LIBS ${MKL_LIBRARIES})
947
948     set(GMX_FFT_MKL 1)
949     set(HAVE_MKL 1)
950
951 #elseif(${GMX_FFT_LIBRARY} STREQUAL "ACML")
952 #    MESSAGE(STATUS "Using external FFT library - AMD core math library")
953 #    set(GMX_FFT_ACML 1)
954 elseif(${GMX_FFT_LIBRARY} STREQUAL "FFTPACK")
955     MESSAGE(STATUS "Using internal FFT library - fftpack")
956     set(GMX_FFT_FFTPACK 1)
957 else(${GMX_FFT_LIBRARY} STREQUAL "FFTW3")
958     MESSAGE(FATAL_ERROR "Invalid FFT library setting: ${GMX_FFT_LIBRARY}. Choose one of: fftw3, mkl, fftpack")
959 endif(${GMX_FFT_LIBRARY} STREQUAL "FFTW3")
960
961 # enable threaded fftw3 if we've found it 
962 if(FFTW3_THREADS OR FFTW3F_THREADS)
963     add_definitions(-DFFT5D_FFTW_THREADS)
964 endif()
965
966 set(GMX_EXTERNAL_BLAS TRUE CACHE BOOL "Use external BLAS instead of built-in")
967 set(GMX_EXTERNAL_LAPACK TRUE CACHE BOOL "Use external LAPACK instead of built-in")
968 # MKL has BLAS/LAPACK routines
969 if(NOT HAVE_MKL AND NOT ACCELERATE_FRAMEWORK)
970   if(GMX_EXTERNAL_BLAS)
971     if (GMX_BLAS_USER)
972         list(APPEND GMX_EXTRA_LIBRARIES ${GMX_BLAS_USER})
973     else(GMX_BLAS_USER)
974         set(BLAS_FIND_QUIETLY ON)
975         find_package(BLAS)
976         if (BLAS_FOUND)
977           list(APPEND GMX_EXTRA_LIBRARIES ${BLAS_LIBRARIES})
978         else()
979           MESSAGE(STATUS "Using internal BLAS library")
980           set(GMX_EXTERNAL_BLAS FALSE CACHE BOOL "Use external BLAS instead of built-in" FORCE)
981         endif()
982     endif(GMX_BLAS_USER)
983   endif(GMX_EXTERNAL_BLAS)
984   if(GMX_EXTERNAL_LAPACK)
985     if (GMX_LAPACK_USER)
986         list(APPEND GMX_EXTRA_LIBRARIES ${GMX_LAPACK_USER})
987     else(GMX_LAPACK_USER)
988         set(LAPACK_FIND_QUIETLY ON)
989         find_package(LAPACK)
990         if (LAPACK_FOUND)
991           list(APPEND GMX_EXTRA_LIBRARIES ${LAPACK_LIBRARIES})
992         else()
993           MESSAGE(STATUS "Using internal LAPACK library")
994           set(GMX_EXTERNAL_LAPACK FALSE CACHE BOOL "Use external LAPACK instead of built-in" FORCE)
995         endif()
996     endif(GMX_LAPACK_USER)
997   endif(GMX_EXTERNAL_LAPACK)
998 endif()
999 mark_as_advanced(GMX_EXTERNAL_LAPACK)
1000 mark_as_advanced(GMX_EXTERNAL_BLAS)
1001
1002 set(GMX_USE_PLUGINS OFF CACHE INTERNAL "Whether GROMACS will really try to compile support for VMD plugins")
1003
1004 if(GMX_LOAD_PLUGINS)
1005   if(CYGWIN OR NOT WIN32)
1006     # Native Windows does not have, nor need dlopen
1007     # Note that WIN32 is set with Cygwin, but Cygwin needs dlopen to use plug-ins
1008     include(gmxTestdlopen)
1009     gmx_test_dlopen(HAVE_DLOPEN)
1010   endif()
1011
1012   # so, should we use plug-ins?
1013   if((WIN32 AND NOT CYGWIN) OR (HAVE_DLOPEN AND BUILD_SHARED_LIBS))
1014     if(NOT VMD_QUIETLY)
1015       MESSAGE(STATUS
1016           "Found the ability to use plug-ins when building shared libaries, "
1017           "so will compile to use plug-ins (e.g. to read VMD-supported file "
1018           "formats).")
1019     endif()
1020     if(NOT GMX_VMD_PLUGIN_PATH)
1021       find_package(VMD)
1022     endif()
1023     set(GMX_USE_PLUGINS ON)
1024     list(APPEND GMX_EXTRA_LIBRARIES ${CMAKE_DL_LIBS}) # magic cross-platform pre-set variable for dlopen library
1025     set(PKG_DL_LIBS "-l${CMAKE_DL_LIBS}")
1026   else()
1027     set(PKG_DL_LIBS)
1028   endif()
1029 endif(GMX_LOAD_PLUGINS)
1030 set(VMD_QUIETLY TRUE CACHE INTERNAL "")
1031
1032 if(EXISTS "${CMAKE_SOURCE_DIR}/admin/.isreposource")
1033     if(NOT CMAKE_CROSSCOMPILING)
1034         option(GMX_BUILD_MANPAGES "Build man pages" ON)
1035     else()
1036         message(STATUS "Building the man pages is not available when "
1037             "cross-compiling the developer version from git")
1038     endif()
1039 else()
1040     #make sure source package contains all man pages
1041     if(NOT EXISTS "${CMAKE_SOURCE_DIR}/man/man1/ngmx.1")
1042         message(FATAL_ERROR "Man pages are missing from source package.")
1043     endif()
1044 endif()
1045 mark_as_advanced(GMX_BUILD_MANPAGES)
1046
1047 # Math and thread libraries must often come after all others when linking...
1048 if(HAVE_LIBM)
1049     list(APPEND GMX_EXTRA_LIBRARIES m)
1050 endif(HAVE_LIBM)
1051
1052 if(GMX_FAHCORE)
1053   set(COREWRAP_INCLUDE_DIR "${CMAKE_SOURCE_DIR}/../corewrap" CACHE STRING 
1054       "Path to swindirect.h")
1055   include_directories(${COREWRAP_INCLUDE_DIR})
1056 endif(GMX_FAHCORE)
1057
1058 # # # # # # # # # # NO MORE TESTS AFTER THIS LINE! # # # # # # # # # # #
1059 # these are set after everything else
1060 if (NOT DEFINED GROMACS_C_FLAGS_SET)
1061     set(GROMACS_C_FLAGS_SET true CACHE INTERNAL "Whether to reset the C flags" 
1062         FORCE)
1063     set(CMAKE_C_FLAGS "${GROMACS_C_FLAGS} ${CMAKE_C_FLAGS}" CACHE STRING 
1064         "Flags used by the compiler during all build types" FORCE)
1065     set(CMAKE_CXX_FLAGS "${GROMACS_CXX_FLAGS} ${CMAKE_CXX_FLAGS}" CACHE STRING 
1066         "Flags used by the compiler during all build types" FORCE)
1067     set(CMAKE_EXE_LINKER_FLAGS 
1068         "${GROMACS_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS}" 
1069         CACHE STRING "Linker flags for creating executables" FORCE) 
1070     set(CMAKE_SHARED_LINKER_FLAGS 
1071         "${GROMACS_LINKER_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS}" 
1072         CACHE STRING "Linker flags for creating shared libraries" FORCE) 
1073 endif (NOT DEFINED GROMACS_C_FLAGS_SET)
1074
1075 if(NOT GMX_OPENMP)
1076     #Unset all OpenMP flags in case OpenMP was disabled either by the user
1077     #or because it was only partially detected (e.g. only for C but not C++ compiler)
1078     unset(OpenMP_C_FLAGS CACHE) 
1079     unset(OpenMP_CXX_FLAGS CACHE)
1080 else()
1081     set(GMX_EXE_LINKER_FLAGS ${GMX_EXE_LINKER_FLAGS} ${OpenMP_LINKER_FLAGS})
1082     set(GMX_SHARED_LINKER_FLAGS ${GMX_SHARED_LINKER_FLAGS} ${OpenMP_SHARED_LINKER_FLAGS})
1083 endif()
1084
1085 ######################################
1086 # Output compiler and CFLAGS used
1087 ######################################
1088 get_compiler_info(C BUILD_C_COMPILER BUILD_CFLAGS)
1089 if (CMAKE_CXX_COMPILER_LOADED)
1090     get_compiler_info(CXX BUILD_CXX_COMPILER BUILD_CXXFLAGS)
1091 endif ()
1092
1093 ########################################################################
1094 # Specify install locations and which subdirectories to process        #
1095 ########################################################################
1096 if ( NOT DEFINED GMXLIB )
1097     set(GMXLIB lib)
1098 endif()
1099 set(LIB_INSTALL_DIR "${GMX_INSTALL_PREFIX}${GMXLIB}")
1100 set(BIN_INSTALL_DIR  ${GMX_INSTALL_PREFIX}bin)
1101 set(DATA_INSTALL_DIR ${GMX_INSTALL_PREFIX}share/gromacs)
1102 set(MAN_INSTALL_DIR  ${GMX_INSTALL_PREFIX}share/man)
1103 set(INCL_INSTALL_DIR ${GMX_INSTALL_PREFIX}include)
1104
1105 set(GMXLIBDIR        ${DATA_INSTALL_DIR}/top)
1106
1107 ##################################################################
1108 # Shared library settings
1109 ##################################################################
1110 if(NOT CMAKE_SYSTEM_NAME STREQUAL "Darwin")
1111     set(CMAKE_SKIP_BUILD_RPATH  FALSE)
1112     set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
1113     set(CMAKE_INSTALL_RPATH "\\\$ORIGIN/../${GMXLIB}")
1114     set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
1115 else()
1116     if(CMAKE_SYSTEM_VERSION VERSION_GREATER 8.0) #rpath supported for >10.4
1117         set(CMAKE_INSTALL_NAME_DIR "@rpath")
1118         set(GMX_EXE_LINKER_FLAGS ${GMX_EXE_LINKER_FLAGS} "-Wl,-rpath,@executable_path/../lib")
1119     else()
1120         set(CMAKE_INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/${LIB_INSTALL_DIR}")
1121     endif()
1122 endif()
1123
1124 #COPYING file: Only necessary for binary distributions.
1125 #Simpler to always install.
1126 install(FILES COPYING DESTINATION ${DATA_INSTALL_DIR} COMPONENT data)
1127
1128 add_subdirectory(doxygen)
1129 add_subdirectory(share)
1130 add_subdirectory(src)
1131 add_subdirectory(scripts)
1132
1133 # issue GPU acceleration/CUDA-related warning or error if GMX_GPU was set
1134 # Auto and NVIDIA GPUs were detected.
1135 if (CUDA_NOTFOUND_AUTO AND NOT GMX_GPU_DETECTION_DONE)
1136     message(WARNING "${CUDA_NOTFOUND_MESSAGE}")
1137     unset(CUDA_NOTFOUND_AUTO)
1138     unset(CUDA_NOTFOUND_MESSAGE)
1139 endif()
1140 set(GMX_GPU_DETECTION_DONE TRUE CACHE INTERNAL "Whether GPU detection has already been done")
1141
1142 #######################
1143 ## uninstall target
1144 #######################
1145     CONFIGURE_FILE(
1146                    "${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in"
1147                    "${CMAKE_CURRENT_BINARY_DIR}/cmake/cmake_uninstall.cmake"
1148                    IMMEDIATE @ONLY)
1149 ###########################
1150 ADD_CUSTOM_TARGET(uninstall
1151                   "${CMAKE_COMMAND}" -P 
1152                   "${CMAKE_CURRENT_BINARY_DIR}/cmake/cmake_uninstall.cmake")
1153 ###########################
1154
1155 ########################################################################
1156 # Tests                                                                #
1157 ########################################################################
1158
1159 include(CTest)
1160 mark_as_advanced(BUILD_TESTING)
1161 IF(BUILD_TESTING)
1162     enable_testing()
1163     add_subdirectory(tests)
1164 ENDIF()
1165