6787c83ea8437e25f14576cf5cf5cb9a8d9a78bf
[alexxy/gromacs.git] / src / contrib / fftw / CMakeLists.txt
1 # Download and build a suitable copy of FFTW.
2 # The GROMACS team won't distribute source or binaries linked to FFTW
3 # because we are choosing to be very clear about distributing only
4 # LGPL-licensed code, to suit requirements from our funding source.
5 #
6 # Input: FFTW variable contains the FFTW component to build,
7 #        either fftw or fftwf for double or single precision
8
9 set(GMX_BUILD_OWN_FFTW_OPTIMIZATION_CONFIGURATION "" CACHE INTERNAL "Optimization flags for FFTW compilation")
10 if(${CMAKE_CURRENT_BINARY_DIR} MATCHES ".*[[:space:]].*")
11     message(FATAL_ERROR "An internal limitation of FFTW means GROMACS cannot build FFTW in a directory with whitespace in its name. Either use a system FFTW, build it yourself, or build GROMACS in a different location.")
12 endif()
13
14 if(NOT GMX_DOUBLE)
15     set(GMX_BUILD_OWN_FFTW_PREC --enable-float)
16 endif()
17
18 # Always build a static lib, so it gets added to libmd and doesn't need to be installed
19 set(GMX_BUILD_OWN_FFTW_SHARED_FLAG --disable-shared --enable-static)
20 if (CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" AND BUILD_SHARED_LIBS) # FFTW doesn't use -DPIC by default
21     set(GMX_BUILD_OWN_FFTW_SHARED_FLAG ${GMX_BUILD_OWN_FFTW_SHARED_FLAG} --with-pic)
22 endif()
23
24 # Testing shows FFTW configured with --enable-avx is never better than --enable-sse2, so we do the latter always.
25 if(${GMX_CPU_ACCELERATION} MATCHES "^(SSE|AVX)")
26     set(GMX_BUILD_OWN_FFTW_OPTIMIZATION_CONFIGURATION --enable-sse2 CACHE INTERNAL "Optimization flags for FFTW compilation")
27 endif()
28
29 # Machinery for running the external project
30 set(EXTERNAL_FFTW_VERSION 3.3.2)
31 set(EXTERNAL_FFTW_VERSION_MD5_SUM 6977ee770ed68c85698c7168ffa6e178)
32 include(ExternalProject)
33 if(CMAKE_VERSION VERSION_LESS 2.8.3)
34     # Can't check MD5 sum with this CMake version
35     message(WARNING "GROMACS is downloading FFTW ${EXTERNAL_FFTW_VERSION}, but your version of CMake is too old to allow GROMACS to check that the archive it receives is correct. GROMACS will build and link to FFTW anyway, but there is a security risk if you execute a GROMACS tool that calls this library. Either build your own FFTW, or update CMake to at least version 2.8.3.")
36         ExternalProject_add(gmxfftw
37             URL "http://www.fftw.org/fftw-${EXTERNAL_FFTW_VERSION}.tar.gz"
38             CONFIGURE_COMMAND <SOURCE_DIR>/configure --prefix=<INSTALL_DIR>
39             ${GMX_BUILD_OWN_FFTW_SHARED_FLAG} ${GMX_BUILD_OWN_FFTW_OPTIMIZATION_CONFIGURATION}
40             ${GMX_BUILD_OWN_FFTW_PREC})
41 else()
42     ExternalProject_add(gmxfftw
43         URL "http://www.fftw.org/fftw-${EXTERNAL_FFTW_VERSION}.tar.gz"
44         URL_MD5 ${EXTERNAL_FFTW_VERSION_MD5_SUM}
45         CONFIGURE_COMMAND <SOURCE_DIR>/configure --prefix=<INSTALL_DIR>
46         ${GMX_BUILD_OWN_FFTW_SHARED_FLAG} ${GMX_BUILD_OWN_FFTW_OPTIMIZATION_CONFIGURATION}
47         ${GMX_BUILD_OWN_FFTW_PREC})
48 endif()
49 externalproject_get_property(gmxfftw INSTALL_DIR)
50 # The dependency that triggers building the gmxfftw target gets made where libmd is constructed
51
52 string(TOUPPER "${FFTW}" UPPERFFTW)
53 string(TOLOWER "${FFTW}" LOWERFFTW)
54 string(REGEX REPLACE "fftw" "fftw3" FFTW_LIBNAME ${LOWERFFTW})
55 set(${UPPERFFTW}_LIBRARIES ${CMAKE_BINARY_PREFIX}/${INSTALL_DIR}/lib/lib${FFTW_LIBNAME}${CMAKE_STATIC_LIBRARY_SUFFIX} PARENT_SCOPE)
56 set(${UPPERFFTW}_INCLUDE_DIRS ${CMAKE_BINARY_PREFIX}/${INSTALL_DIR}/include PARENT_SCOPE)
57 set(${UPPERFFTW}_FOUND TRUE PARENT_SCOPE)
58 set(${UPPERFFTW}_HAVE_SIMD TRUE PARENT_SCOPE)
59
60 message(STATUS "The GROMACS-managed build of FFTW 3 will configure with the following optimizations: ${GMX_BUILD_OWN_FFTW_OPTIMIZATION_CONFIGURATION}")