############################################################################### # Swig and PCRE do not support blank spaces in install directory namespaces # This means that ITK cannot be built in a path that contains spaces # See https://www.swig.org/Doc1.3/Windows.html if("${CMAKE_BINARY_DIR}" MATCHES "^.* .*$") message( FATAL_ERROR "Swig and PCRE do not support paths with space characters. Please change build directory name." ) endif() ############################################################################### # Build swig option( ITK_USE_SYSTEM_SWIG "Use system swig. If OFF, swig is built as an external project." OFF ) mark_as_advanced(ITK_USE_SYSTEM_SWIG) # Minimal swig version set(swig_version_min 4.2.0) # Version used in vendored binary or source build configured in this file. set(ITK_SWIG_VERSION 2024-03-26-master) if(WIN32) set(swig_cmake_version 4.3.0) set( swigwin_hash "cec9eeebfec7f2a8ccf7b166a11cf8dbbc5e1eacca35563e4f0882b2b261658f394f6607243813d7083e7e2a2bbec23c5cf8b4dd92ad85838c6eb971f3833715" ) set(swigwin_cid "bafybeibljxzip2irc3q3w5qlh2ae5ns27xpi7mo6iskxni45dcmwtk2x6a") set( swig_ep "${CMAKE_CURRENT_BINARY_DIR}/swigwin-amd64-${ITK_SWIG_VERSION}/bin/swig.exe" ) elseif( CMAKE_HOST_SYSTEM_NAME MATCHES "Linux" AND ( CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "x86_64" OR CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "aarch64" ) ) set(swig_cmake_version 4.3.0) if(CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "aarch64") set( swiglinux_hash "9a3cfa330235ac78799c7401299506db5ea7459314b781bf27f2db8ddb582508ec5b15c2fa96fc241d5b832c4f702cd9ef043a61e37a574cac7ca78e4aba8f78" ) set( swiglinux_cid "bafybeiaa2xv7oxnvaz6qupdaykgwakldrmahk54n2pp2z2ianuvq57uvmy" ) set(swiglinux_arch "arm64") else() set( swiglinux_hash "bdf82ad5281dfdba4b24c83b0d15c76e83cd58c6c78ecfc7a449f869f524d12fad9ad7f517995f864c2c00e61e7cd04132a442038197b92821b4011673a7d4fe" ) set( swiglinux_cid "bafybeihp7hk4ljxuf7duqzei2h7y7xshzyhahxaot5mapv2xevkvwuci5m" ) set(swiglinux_arch "amd64") endif() set( swig_ep "${CMAKE_CURRENT_BINARY_DIR}/swiglinux-${swiglinux_arch}-${ITK_SWIG_VERSION}/bin/swig" ) elseif(CMAKE_HOST_SYSTEM_NAME MATCHES "Darwin") set(swig_cmake_version 4.3.0) if(CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "arm64") set( swigmacos_hash "96eec93fd9e1df35813f8cc194a8811c8c84f265284c1515ec81aa7e696aee2c952f426e5155c011c163376e76245f5d7f479525f0d1ea8396524629ed6b8aec" ) set( swigmacos_cid "bafybeialov6ur5q2yli4mtclrvqoirk2nsteum3vgnswjypquwejwomxnm" ) set(swigmacos_arch "arm64") else() set( swigmacos_hash "169760d2a34c2a95a907e80d93c1dc7ebc33a7dd34eb7ed7a9841866db3e25f7d7e93bf49ea28db01843aca5c2c6712756c1f01f6531d6ee027dc6eb293d95d7" ) set( swigmacos_cid "bafybeifkl5wfscum7pnsjdmwhshrv5v6srilinkrftunq5g4gqzgqmyqf4" ) set(swigmacos_arch "amd64") endif() set( swig_ep "${CMAKE_CURRENT_BINARY_DIR}/swigmacos-${swigmacos_arch}-${ITK_SWIG_VERSION}/bin/swig" ) else() # Build from source set( swig_hash "9292f6786abed379278b8024f91b91f293f1be9764fe3c1a19023f7891c4e40587f965680ac6a595a5610cfb6650a73fd2f3932a83d5effad83f351fa70810a9" ) set(swig_cid "bafybeib56uexrqtccgzxjgmlammjii5ntwush4732kbkr6okbtjhzcmvia") # follow the standard EP_PREFIX locations set(swig_binary_dir ${CMAKE_CURRENT_BINARY_DIR}/swig-prefix/src/swig-build) set(swig_source_dir ${CMAKE_CURRENT_BINARY_DIR}/swig-prefix/src/swig) set(swig_install_dir ${CMAKE_CURRENT_BINARY_DIR}/swig) set(swig_ep "${swig_install_dir}/bin/swig") endif() if(ITK_USE_SYSTEM_SWIG) # the path set for the EP build prevents find_package to do its job if("${SWIG_EXECUTABLE}" STREQUAL "${swig_ep}") unset(SWIG_DIR CACHE) unset(SWIG_EXECUTABLE CACHE) unset(SWIG_VERSION CACHE) endif() # Look for system swig find_package(SWIG REQUIRED) # Check for the swig version if(${SWIG_VERSION} VERSION_LESS ${swig_version_min}) message( WARNING "Swig version less than ${swig_version_min}: \"${SWIG_VERSION}\"." ) endif() else() if(NOT TARGET swig) # Install swig ourselves set(SWIG_VERSION ${ITK_SWIG_VERSION}) include(ExternalProject) # Set the timestamps of the extracted files to their archived # timestamps. Necessary to build configure/autoconf-based # projects such as SWIG and PCRE robustly. if(${CMAKE_VERSION} VERSION_LESS 3.24) set(download_extract_timestamp_flag) else() set( download_extract_timestamp_flag DOWNLOAD_EXTRACT_TIMESTAMP TRUE ) endif() if(WIN32) # If we are building ITK if(ITK_BINARY_DIR) itk_download_attempt_check(SWIG) endif() ExternalProject_Add( swig URL "https://data.kitware.com/api/v1/file/hashsum/sha512/${swigwin_hash}/download" "https://dweb.link/ipfs/${swigwin_cid}/swigwin-amd64-${SWIG_VERSION}.zip" "https://itk.mypinata.cloud/ipfs/${swigwin_cid}/swigwin-amd64-${SWIG_VERSION}.zip" "https://w3s.link/ipfs/${swigwin_cid}/swigwin-amd64-${SWIG_VERSION}.zip" URL_HASH SHA512=${swigwin_hash} SOURCE_DIR ${CMAKE_CURRENT_BINARY_DIR}/swigwin-amd64-${SWIG_VERSION} CONFIGURE_COMMAND "" BUILD_COMMAND "" INSTALL_COMMAND "" ${download_extract_timestamp_flag} ) set( SWIG_DIR ${CMAKE_CURRENT_BINARY_DIR}/swigwin-amd64-${SWIG_VERSION}/bin ) elseif( CMAKE_HOST_SYSTEM_NAME MATCHES "Linux" AND ( CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "x86_64" OR CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "aarch64" ) ) # If we are building ITK if(ITK_BINARY_DIR) itk_download_attempt_check(SWIG) endif() ExternalProject_Add( swig URL "https://data.kitware.com/api/v1/file/hashsum/sha512/${swiglinux_hash}/download" "https://dweb.link/ipfs/${swiglinux_cid}/swiglinux-${swiglinux_arch}-${SWIG_VERSION}.zip" "https://itk.mypinata.cloud/ipfs/${swiglinux_cid}/swiglinux-${swiglinux_arch}-${SWIG_VERSION}.zip" "https://w3s.link/ipfs/${swiglinux_cid}/swiglinux-${swiglinux_arch}-${SWIG_VERSION}.zip" URL_HASH SHA512=${swiglinux_hash} SOURCE_DIR ${CMAKE_CURRENT_BINARY_DIR}/swiglinux-${swiglinux_arch}-${SWIG_VERSION} CONFIGURE_COMMAND "" BUILD_COMMAND "" INSTALL_COMMAND "" ${download_extract_timestamp_flag} ) set( SWIG_DIR ${CMAKE_CURRENT_BINARY_DIR}/swiglinux-${swiglinux_arch}-${SWIG_VERSION}/share/swig/${swig_cmake_version} CACHE FILEPATH "swig directory." ) elseif(CMAKE_HOST_SYSTEM_NAME MATCHES "Darwin") # If we are building ITK if(ITK_BINARY_DIR) itk_download_attempt_check(SWIG) endif() ExternalProject_Add( swig URL "https://data.kitware.com/api/v1/file/hashsum/sha512/${swigmacos_hash}/download" "https://dweb.link/ipfs/${swigmacos_cid}/swigmacos-${swigmacos_arch}-${SWIG_VERSION}.zip" "https://itk.mypinata.cloud/ipfs/${swigmacos_cid}/swigmacos-${swigmacos_arch}-${SWIG_VERSION}.zip" "https://w3s.link/ipfs/${swigmacos_cid}/swigmacos-${swigmacos_arch}-${SWIG_VERSION}.zip" URL_HASH SHA512=${swigmacos_hash} SOURCE_DIR ${CMAKE_CURRENT_BINARY_DIR}/swigmacos-${swigmacos_arch}-${SWIG_VERSION} CONFIGURE_COMMAND "" BUILD_COMMAND "" INSTALL_COMMAND "" ${download_extract_timestamp_flag} ) set( SWIG_DIR ${CMAKE_CURRENT_BINARY_DIR}/swigmacos-${swigmacos_arch}-${SWIG_VERSION}/share/swig/${swig_cmake_version} CACHE FILEPATH "swig directory." ) else() # build swig as an external project # If we are building ITK if(ITK_BINARY_DIR) itk_download_attempt_check(PCRE) endif() set(compiler_information) if(NOT CMAKE_CROSSCOMPILING) set( CMAKE_CXX_COMPILER_LAUNCHER_FLAG -DCMAKE_CXX_COMPILER_LAUNCHER:FILEPATH=${CMAKE_CXX_COMPILER_LAUNCHER} ) set( CMAKE_C_COMPILER_LAUNCHER_FLAG -DCMAKE_C_COMPILER_LAUNCHER:FILEPATH=${CMAKE_C_COMPILER_LAUNCHER} ) set( compiler_information -DCMAKE_CXX_COMPILER:FILEPATH=${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_LAUNCHER_FLAG} "-DCMAKE_CXX_FLAGS:STRING=${CMAKE_CXX_FLAGS} -w" -DCMAKE_C_COMPILER:FILEPATH=${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_LAUNCHER_FLAG} "-DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS} -w" ) endif() set( pcre_hash "e1183226ea3e56a1c7ec97e2c7d7ad5a163b9b576930c997e6ac4c26f1c92fc7e9491b5b297b1dd68d43432f7fbbddcc6207a189beb37ef158ad68bad5598988" ) set( pcre_cid "bafybeicnpyjts3vq4lpdfhktr5qioq4qdifmtjkbemyyqpkayxjsqtwz74" ) ExternalProject_Add( PCRE URL "https://data.kitware.com/api/v1/file/hashsum/sha512/${pcre_hash}/download" "https://dweb.link/ipfs/${pcre_cid}/pcre-10.43.tar.gz" "https://itk.pinata.cloud/ipfs/${pcre_cid}/pcre-10.43.tar.gz" "https://w3s.link/ipfs/${pcre_cid}/pcre-10.43.tar.gz" URL_HASH SHA512=${pcre_hash} CMAKE_GENERATOR "${CMAKE_GENERATOR}" CMAKE_CACHE_ARGS ${compiler_information} -DCMAKE_INSTALL_PREFIX:PATH= -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE} INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/PCRE2 ${download_extract_timestamp_flag} ) # swig uses bison find it by cmake and pass it down find_package(BISON) set(BISON_FLAGS "" CACHE STRING "Flags used by bison") mark_as_advanced(BISON_FLAGS) # If we are building ITK if(ITK_BINARY_DIR) itk_download_attempt_check(SWIG) endif() ExternalProject_Add( swig URL "https://data.kitware.com/api/v1/file/hashsum/sha512/${swig_hash}/download" "https://dweb.link/ipfs/${swig_cid}/swig-4.0.2.tar.gz" "https://itk.pinata.cloud/ipfs/${swig_cid}/swig-4.0.2.tar.gz" "https://w3s.link/ipfs/${swig_cid}/swig-4.0.2.tar.gz" URL_HASH SHA512=${swig_hash} CMAKE_GENERATOR "${CMAKE_GENERATOR}" CMAKE_CACHE_ARGS ${compiler_information} -DCMAKE_INSTALL_PREFIX:PATH= -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE} -DPCRE2_DIR:PATH=${CMAKE_CURRENT_BINARY_DIR}/PCRE2 INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/swig DEPENDS PCRE ${download_extract_timestamp_flag} ) endif() set( SWIG_DIR ${CMAKE_CURRENT_BINARY_DIR}/swig/share/swig/${SWIG_VERSION} CACHE FILEPATH "swig directory." ) mark_as_advanced(SWIG_DIR) set(SWIG_EXECUTABLE ${swig_ep} CACHE FILEPATH "swig executable." FORCE) endif() mark_as_advanced(SWIG_EXECUTABLE) endif() set( PYGCCXML_DIR ${ITK_CMAKE_DIR}/../Modules/ThirdParty/pygccxml/src CACHE INTERNAL "pygccxml path" ) ############################################################################### # store the current dir, so it can be reused later set( ITK_WRAP_SWIGINTERFACE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}" CACHE INTERNAL "swig interface source dir" ) set( ITK_WRAP_SWIGINTERFACE_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}" CACHE INTERNAL "swig interface binary dir" ) set( WRAPPER_MASTER_INDEX_OUTPUT_DIR "${ITK_DIR}/Wrapping/Typedefs" CACHE INTERNAL "typedefs dir" ) set( IGENERATOR "${CMAKE_CURRENT_SOURCE_DIR}/igenerator.py" CACHE INTERNAL "igenerator.py path" FORCE ) macro(itk_wrap_simple_type_swig_interface wrap_class swig_name) string(APPEND SWIG_INTERFACE_TYPEDEFS "using ${swig_name} = ${wrap_class};\n") endmacro() include_directories("${WRAPPER_MASTER_INDEX_OUTPUT_DIR}")