File: itkExternal_FFTW.cmake

package info (click to toggle)
insighttoolkit5 5.4.4-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 704,404 kB
  • sloc: cpp: 783,697; ansic: 628,724; xml: 44,704; fortran: 34,250; python: 22,874; sh: 4,078; pascal: 2,636; lisp: 2,158; makefile: 461; yacc: 328; asm: 205; perl: 203; lex: 146; tcl: 132; javascript: 98; csh: 81
file content (179 lines) | stat: -rw-r--r-- 7,448 bytes parent folder | download | duplicates (2)
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()