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