1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179
|
#
# Encapsulates building FFTW as an External Project.
#
# NOTE: internal building of fftw is for convenience,
# and the version of fftw built here does not
# use modern hardware optimzations.
#
# The build configuration chosen to be
# generalizable to as many hardware platforms.
# Being backward compatible for decades
# old hardware is the goal of this internal
# representation.
#
# This is primarily used to support testing
# and should not be used for production
# builds where performance is a concern.
#
# These instructions follow the guidance provided for modern cmake usage as described:
# https://github.com/dev-cafe/cmake-cookbook/blob/master/chapter-08/recipe-03/c-example/external/upstream/fftw3/CMakeLists.txt
#
include(ITK_CheckCCompilerFlag)
if(NOT ITK_USE_MKL AND NOT ITK_USE_CUFFTW)
set(msg "ATTENTION: You have enabled the use of FFTW.")
set(msg "${msg} This library is distributed under a GPL license.")
set(msg "${msg} By enabling this option, the ITK libraries binary")
set(msg "${msg} that is built will be covered by a GPL license")
set(msg "${msg} and so will any executable that is linked against these libraries.")
message("${msg}")
endif()
if(NOT ITK_USE_SYSTEM_FFTW)
#
# fftw limitation -- can't be built in
# a directory with whitespace in its name.
if(${CMAKE_CURRENT_BINARY_DIR} MATCHES ".*[ \t].*")
message(FATAL_ERROR "Can't build fftw in a directory with whitespace in its name")
endif()
if(WIN32)
# on windows the build of FFTW must match that of ITK
set(FFTW_BUILD_TYPE ${CMAKE_BUILD_TYPE})
else()
set(FFTW_BUILD_TYPE Release)
endif()
include(GNUInstallDirs)
set(_fftw_target_version 3.3.10)
set(_fftw_url_hash
"2d34b5ccac7b08740dbdacc6ebe451d8a34cf9d9bfec85a5e776e87adf94abfd803c222412d8e10fbaa4ed46f504aa87180396af1b108666cde4314a55610b40"
)
set(_fftw_url "https://data.kitware.com/api/v1/file/hashsum/sha512/${_fftw_url_hash}/download")
set(FFTW_STAGED_INSTALL_PREFIX "${ITK_BINARY_DIR}/fftw")
set(PROJ_FFTWD_DEPENDS "")
if(ITK_USE_FFTWF)
itk_download_attempt_check(FFTW)
ExternalProject_Add(
fftwf
PREFIX fftwf-${_fftw_target_version}
INSTALL_DIR ${FFTW_STAGED_INSTALL_PREFIX}
URL ${_fftw_url}
URL_HASH SHA512=${_fftw_url_hash}
DOWNLOAD_NAME "fftw-${_fftw_target_version}.tar.gz"
DOWNLOAD_NO_PROGRESS 1
UPDATE_COMMAND ""
LOG_CONFIGURE 1
LOG_BUILD 1
LOG_INSTALL 1
CMAKE_CACHE_ARGS
-DBUILD_SHARED_LIBS:BOOL=${BUILD_SHARED_LIBS}
-DBUILD_TESTS:BOOL=OFF
-DCMAKE_BUILD_TYPE:STRING=${FFTW_BUILD_TYPE}
-DCMAKE_INSTALL_PREFIX:PATH=${FFTW_STAGED_INSTALL_PREFIX}
-DCMAKE_INSTALL_LIBDIR:STRING=${CMAKE_INSTALL_LIBDIR}
-DCMAKE_INSTALL_BINDIR:STRING=${CMAKE_INSTALL_BINDIR}
-DDISABLE_FORTRAN:BOOL=ON
-DENABLE_AVX:BOOL=OFF
-DENABLE_AVX2:BOOL=OFF
-DENABLE_FLOAT:BOOL=ON
-DENABLE_LONG_DOUBLE:BOOL=OFF
-DENABLE_OPENMP:BOOL=OFF
-DENABLE_QUAD_PRECISION:BOOL=OFF
-DENABLE_SSE:BOOL=OFF
-DENABLE_SSE2:BOOL=OFF
-DENABLE_THREADS:BOOL=ON
-DCMAKE_APPLE_SILICON_PROCESSOR:STRING=${CMAKE_APPLE_SILICON_PROCESSOR}
-DCMAKE_C_COMPILER_LAUNCHER:PATH=${CMAKE_C_COMPILER_LAUNCHER}
-DCMAKE_C_COMPILER:PATH=${CMAKE_C_COMPILER}
-DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS}
-DCMAKE_OSX_SYSROOT:PATH=${CMAKE_OSX_SYSROOT}
-DCMAKE_OSX_DEPLOYMENT_TARGET:PATH=${CMAKE_OSX_DEPLOYMENT_TARGET}
-DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=${CMAKE_POSITION_INDEPENDENT_CODE})
# set(
# FFTW3f_DIR ${FFTW_STAGED_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/cmake/fftw3f
# CACHE PATH "Path to internally built single precision FFTW3Config.cmake"
# FORCE
# )
# Can not find package, it does not yet exist find_package(FFTW3f CONFIG REQUIRED)
# but we know where it will eventually be!
set(FFTW3f_INCLUDE_DIRS ${FFTW_STAGED_INSTALL_PREFIX}/include)
set(FFTW3f_LIBRARY_DIRS ${FFTW_STAGED_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR})
set(FFTW_INCLUDE ${FFTW3_INCLUDE_DIRS})
set(FFTW_LIBDIR ${FFTW3_LIBRARY_DIRS})
set(ITK_FFTWF_LIBRARIES_NAMES fftw3f_threads fftw3f)
set(PROJ_FFTWD_DEPENDS "fftwf")
endif()
if(ITK_USE_FFTWD)
itk_download_attempt_check(FFTW)
ExternalProject_Add(
fftwd
PREFIX fftwd-${_fftw_target_version}
INSTALL_DIR ${FFTW_STAGED_INSTALL_PREFIX}
URL ${_fftw_url}
URL_HASH SHA512=${_fftw_url_hash}
DOWNLOAD_NAME "fftw-${_fftw_target_version}.tar.gz"
DOWNLOAD_NO_PROGRESS 1
UPDATE_COMMAND ""
LOG_CONFIGURE 1
LOG_BUILD 1
LOG_INSTALL 1
CMAKE_CACHE_ARGS
-DBUILD_SHARED_LIBS:BOOL=${BUILD_SHARED_LIBS}
-DBUILD_TESTS:BOOL=OFF
-DCMAKE_BUILD_TYPE:STRING=${FFTW_BUILD_TYPE}
-DCMAKE_INSTALL_PREFIX:PATH=${FFTW_STAGED_INSTALL_PREFIX}
-DCMAKE_INSTALL_LIBDIR:STRING=${CMAKE_INSTALL_LIBDIR}
-DCMAKE_INSTALL_BINDIR:STRING=${CMAKE_INSTALL_BINDIR}
-DDISABLE_FORTRAN:BOOL=ON
-DENABLE_AVX:BOOL=OFF
-DENABLE_AVX2:BOOL=OFF
-DENABLE_FLOAT:BOOL=OFF
-DENABLE_LONG_DOUBLE:BOOL=OFF
-DENABLE_OPENMP:BOOL=OFF
-DENABLE_QUAD_PRECISION:BOOL=OFF
-DENABLE_SSE:BOOL=OFF
-DENABLE_SSE2:BOOL=OFF
-DENABLE_THREADS:BOOL=ON
-DCMAKE_APPLE_SILICON_PROCESSOR:STRING=${CMAKE_APPLE_SILICON_PROCESSOR}
-DCMAKE_C_COMPILER_LAUNCHER:PATH=${CMAKE_C_COMPILER_LAUNCHER}
-DCMAKE_C_COMPILER:PATH=${CMAKE_C_COMPILER}
-DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS}
-DCMAKE_OSX_SYSROOT:PATH=${CMAKE_OSX_SYSROOT}
-DCMAKE_OSX_DEPLOYMENT_TARGET:PATH=${CMAKE_OSX_DEPLOYMENT_TARGET}
-DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=${CMAKE_POSITION_INDEPENDENT_CODE}
DEPENDS ${PROJ_FFTWD_DEPENDS} # Avoid potential collisions on install
)
# set(
# FFTW3_DIR ${FFTW_STAGED_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/cmake/fftw3
# CACHE PATH "Path to internally built double precision FFTW3Config.cmake"
# FORCE
# )
# Can not find package, it does not yet exist find_package(FFTW3 CONFIG REQUIRED)
set(FFTW3_INCLUDE_DIRS ${FFTW_STAGED_INSTALL_PREFIX}/include)
set(FFTW3_LIBRARY_DIRS ${FFTW_STAGED_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR})
set(FFTW_INCLUDE ${FFTW3_INCLUDE_DIRS})
set(FFTW_LIBDIR ${FFTW3_LIBRARY_DIRS})
set(ITK_FFTWD_LIBRARIES_NAMES fftw3_threads fftw3)
endif()
#
# copy libraries into install tree, NOTE: DESTINATION MUST EXACTLY MATCH values from main CMakeLists.txt for FFTW_LIBDIR
install(
CODE "file(GLOB FFTW_LIBS ${FFTW_STAGED_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/*fftw3*)
file(INSTALL DESTINATION \"\${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/ITK-${ITK_VERSION_MAJOR}.${ITK_VERSION_MINOR}\"
TYPE FILE FILES \${FFTW_LIBS})"
COMPONENT Development)
#
# copy headers into install tree
install(CODE "file(GLOB FFTW_INC ${FFTW_STAGED_INSTALL_PREFIX}/include/*fftw3*)
file(INSTALL DESTINATION \"\${CMAKE_INSTALL_PREFIX}/include/ITK-${ITK_VERSION_MAJOR}.${ITK_VERSION_MINOR}\"
TYPE FILE FILES \${FFTW_INC})" COMPONENT Development)
else()
#Search the filesystem for compatible versions
find_package(FFTW) # Use local itk FindFFTW.config to set variables consistently both with/without USE_SYSTEM_FFTW
endif()
|