1#
2# Encapsulates building FFTW as an External Project.
3include(ITK_CheckCCompilerFlag)
4
5
6if(NOT ITK_USE_MKL AND NOT ITK_USE_CUFFTW)
7  set(msg "ATTENTION: You have enabled the use of FFTW.")
8  set(msg "${msg} This library is distributed under a GPL license.")
9  set(msg "${msg} By enabling this option, the ITK libraries binary")
10  set(msg "${msg} that is built will be covered by a GPL license")
11  set(msg "${msg} and so will any executable that is linked against these libraries.")
12  message("${msg}")
13endif()
14
15#--check_c_compiler_flag(-fopenmp C_HAS_fopenmp)
16#--if(${C_HAS_fopenmp} AND FALSE)
17#--    set(FFTW_THREADS_CONFIGURATION --enable-openmp)
18#--    set(OPENMP_FLAG "-fopenmp")
19#--  else()
20    set(FFTW_THREADS_CONFIGURATION --enable-threads)
21    set(OPENMP_FLAG "")
22#--endif()
23
24# from FFTW's configure command:
25#--Some influential environment variables:
26#--  CC          C compiler command
27#--  CFLAGS      C compiler flags
28#--  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
29#--              nonstandard directory <lib dir>
30#--  LIBS        libraries to pass to the linker, e.g. -l<library>
31#--  CPPFLAGS    C/C++/Objective C preprocessor flags, e.g. -I<include dir> if
32#--              you have headers in a nonstandard directory <include dir>
33
34set(_additional_configure_env)
35set(_additional_external_project_args)
36set(_additional_deployment_target_flags)
37if (APPLE)
38  if(CMAKE_OSX_DEPLOYMENT_TARGET)
39     set(_additional_deployment_target_flags "-mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET}")
40  endif()
41  list(APPEND _additional_configure_env
42        "SDKROOT=${CMAKE_OSX_SYSROOT}"
43        "MACOSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET}"
44  )
45  list(APPEND _additional_external_project_args
46        BUILD_COMMAND
47          env
48            "SDKROOT=${CMAKE_OSX_SYSROOT}"
49            "MACOSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET}"
50          make
51        INSTALL_COMMAND
52          env
53            "SDKROOT=${CMAKE_OSX_SYSROOT}"
54            "MACOSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET}"
55          make
56            install
57  )
58endif()
59
60## Perhaps in the future a set of TryCompiles could be used here.
61set(FFTW_OPTIMIZATION_CONFIGURATION "" CACHE INTERNAL "architecture flags: --enable-sse --enable-sse2 --enable-altivec --enable-mips-ps --enable-cell")
62if(ITK_USE_SYSTEM_FFTW)
63  find_package( FFTW )
64  link_directories(${FFTW_LIBDIR})
65else()
66
67  if(WIN32 AND NOT MINGW)
68    message("Can't build fftw as external project on Windows")
69    message(ERROR "install fftw and use ITK_USE_SYSTEM_FFTW")
70  else()
71    #
72    # fftw limitation -- can't be built in
73    # a directory with whitespace in its name.
74    if(${CMAKE_CURRENT_BINARY_DIR} MATCHES ".*[ \t].*")
75      message(FATAL_ERROR
76        "Can't build fftw in a directory with whitespace in its name")
77    endif()
78    #
79    # build fftw as an external project
80    if(BUILD_SHARED_LIBS)
81      set(FFTW_SHARED_FLAG --enable-shared)
82    endif()
83    #
84    # set fPIC flag if needed
85    set(GCC_POSITION_INDEPENDENT_CODE_FLAG "")
86    if(CMAKE_POSITION_INDEPENDENT_CODE)
87      set(GCC_POSITION_INDEPENDENT_CODE_FLAG "-fPIC")
88    endif()
89
90    set(_fftw_target_version 3.3.4)
91    set(_fftw_url_hash "1ee2c7bec3657f6846e63c6dfa71410563830d2b951966bf0123bd8f4f2f5d6b50f13b76d9a7b0eae70e44856f829ca6ceb3d080bb01649d1572c9f3f68e8eb1")
92    set(_fftw_url "https://data.kitware.com/api/v1/file/hashsum/sha512/${_fftw_url_hash}/download")
93
94    if(ITK_USE_FFTWF)
95      itk_download_attempt_check(FFTW)
96      ExternalProject_add(fftwf
97        PREFIX fftwf
98        URL ${_fftw_url}
99        URL_HASH SHA512=${_fftw_url_hash}
100        DOWNLOAD_NAME "fftw-${_fftw_target_version}.tar.gz"
101        CONFIGURE_COMMAND
102          env
103            "CC=${CMAKE_C_COMPILER_LAUNCHER} ${CMAKE_C_COMPILER}"
104            "CFLAGS=${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_RELEASE} ${GCC_POSITION_INDEPENDENT_CODE_FLAG} ${_additional_deployment_target_flags}"
105            "LDFLAGS=$ENV{LDFLAGS}"
106            "LIBS=$ENV{LIBS}"
107            "CPP=$ENV{CPP}"
108            "CPPFLAGS=$ENV{CPPFLAGS} ${_additional_deployment_target_flags}"
109            "CXXFLAGS=$ENV{CXXFLAGS} ${GCC_POSITION_INDEPENDENT_CODE_FLAG} ${_additional_deployment_target_flags}"
110            ${_additional_configure_env}
111          ${ITK_BINARY_DIR}/fftwf/src/fftwf/configure
112            ${FFTW_SHARED_FLAG}
113            ${FFTW_OPTIMIZATION_CONFIGURATION}
114            ${FFTW_THREADS_CONFIGURATION}
115            --disable-fortran
116            --enable-float
117            --prefix=${ITK_BINARY_DIR}/fftw
118        ${_additional_external_project_args}
119        )
120    endif()
121
122    if(ITK_USE_FFTWD)
123      itk_download_attempt_check(FFTW)
124      ExternalProject_add(fftwd
125        PREFIX fftwd
126        URL ${_fftw_url}
127        URL_HASH SHA512=${_fftw_url_hash}
128        DOWNLOAD_NAME "fftw-${_fftw_target_version}.tar.gz"
129        CONFIGURE_COMMAND
130          env
131            "CC=${CMAKE_C_COMPILER_LAUNCHER} ${CMAKE_C_COMPILER}"
132            "CFLAGS=${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_RELEASE} ${GCC_POSITION_INDEPENDENT_CODE_FLAG} ${_additional_deployment_target_flags}"
133            "LDFLAGS=$ENV{LDFLAGS}"
134            "LIBS=$ENV{LIBS}"
135            "CPP=$ENV{CPP}"
136            "CPPFLAGS=$ENV{CPPFLAGS} ${_additional_deployment_target_flags}"
137            "CXXFLAGS=$ENV{CXXFLAGS} ${GCC_POSITION_INDEPENDENT_CODE_FLAG} ${_additional_deployment_target_flags}"
138            ${_additional_configure_env}
139          ${ITK_BINARY_DIR}/fftwd/src/fftwd/configure
140            ${FFTW_SHARED_FLAG}
141            ${FFTW_OPTIMIZATION_CONFIGURATION}
142            ${FFTW_THREADS_CONFIGURATION}
143            --disable-fortran
144            --disable-float
145            --prefix=${ITK_BINARY_DIR}/fftw
146        ${_additional_external_project_args}
147        )
148    endif()
149    set(FFTW_INCLUDE_PATH ${ITK_BINARY_DIR}/fftw/include)
150    set(FFTW_LIBDIR ${ITK_BINARY_DIR}/fftw/lib)
151    link_directories(${FFTW_LIBDIR})
152    include_directories(${FFTW_INCLUDE_PATH})
153    #
154    # copy libraries into install tree
155    install(CODE
156      "file(GLOB FFTW_LIBS ${ITK_BINARY_DIR}/fftw/lib/*fftw3*)
157file(INSTALL DESTINATION \"\${CMAKE_INSTALL_PREFIX}/lib/ITK-${ITK_VERSION_MAJOR}.${ITK_VERSION_MINOR}\"
158TYPE FILE FILES \${FFTW_LIBS})" COMPONENT Development)
159    #
160    # copy headers into install tree
161    install(CODE
162      "file(GLOB FFTW_INC ${ITK_BINARY_DIR}/fftw/include/*fftw3*)
163file(INSTALL DESTINATION \"\${CMAKE_INSTALL_PREFIX}/include/ITK-${ITK_VERSION_MAJOR}.${ITK_VERSION_MINOR}\"
164TYPE FILE FILES \${FFTW_INC})" COMPONENT Development)
165
166  endif()
167endif()
168