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