commit:     b4acbb5f52ed06ad45b5a4e877498a6c9f683d4e
Author:     François-Xavier Carton <fx.carton91 <AT> gmail <DOT> com>
AuthorDate: Fri Jun 10 13:16:57 2022 +0000
Commit:     Andrew Ammerlaan <andrewammerlaan <AT> gentoo <DOT> org>
CommitDate: Tue Aug 23 10:58:09 2022 +0000
URL:        https://gitweb.gentoo.org/proj/sci.git/commit/?id=b4acbb5f

sci-libs/itk: bump to 5.2.1

Signed-off-by: François-Xavier Carton <fx.carton91 <AT> gmail.com>
Signed-off-by: Andrew Ammerlaan <andrewammerlaan <AT> gentoo.org>
Closes: https://github.com/gentoo/sci/pull/1154

 .../itk-5.2.1-fix-castxml-clang-attr-malloc.patch  |  25 +
 sci-libs/itk/files/itk-5.2.1-system-openjpeg.patch | 558 +++++++++++++++++++++
 .../itk/files/itk-5.2.1-system-tiff-has-64.patch   |  18 +
 sci-libs/itk/files/itk-5.2.1-upstream-fixes.patch  | 255 ++++++++++
 sci-libs/itk/itk-5.2.1.ebuild                      | 246 +++++++++
 5 files changed, 1102 insertions(+)

diff --git a/sci-libs/itk/files/itk-5.2.1-fix-castxml-clang-attr-malloc.patch 
b/sci-libs/itk/files/itk-5.2.1-fix-castxml-clang-attr-malloc.patch
new file mode 100644
index 000000000..05c9d5635
--- /dev/null
+++ b/sci-libs/itk/files/itk-5.2.1-fix-castxml-clang-attr-malloc.patch
@@ -0,0 +1,25 @@
+From: François-Xavier Carton <[email protected]>
+Date: Thu, 9 Jun 2022 14:56:22 +0200
+Subject: [PATCH] fix attr malloc error with recent glibc/gcc
+
+Recent GCC has support for __attribute__((__malloc__)) with arguments, but 
clang
+does not. castxml uses clang internally. And recent glibc/gcc uses the 
attribute
+with arguments. Mix all this, and you get:
+
+error: '__malloc__' attribute takes no arguments
+
+when compiling itk with python wrapping.
+
+To fix this, we add a define to castxml flags to remove the extra arguments.
+
+--- a/Wrapping/Generators/CastXML/CMakeLists.txt       2022-06-09 
14:53:15.582352715 +0200
++++ b/Wrapping/Generators/CastXML/CMakeLists.txt       2022-06-09 
14:54:38.182351433 +0200
+@@ -237,7 +237,7 @@
+       set(_castxml_cc ${_castxml_cc} "-D_HAS_TR1=0")
+     endif()
+   else()
+-    set(_castxml_cc --castxml-cc-gnu ( "${CMAKE_CXX_COMPILER}" 
${_castxml_cc_flags} ))
++    set(_castxml_cc --castxml-cc-gnu ( "${CMAKE_CXX_COMPILER}" 
${_castxml_cc_flags} -D__malloc__\(a,b\)=__malloc__ ))
+   endif()
+   set(_target)
+   if(CMAKE_CROSSCOMPILING)

diff --git a/sci-libs/itk/files/itk-5.2.1-system-openjpeg.patch 
b/sci-libs/itk/files/itk-5.2.1-system-openjpeg.patch
new file mode 100644
index 000000000..ad717f677
--- /dev/null
+++ b/sci-libs/itk/files/itk-5.2.1-system-openjpeg.patch
@@ -0,0 +1,558 @@
+--- a/Modules/ThirdParty/OpenJPEG/CMakeLists.txt
++++ b/Modules/ThirdParty/OpenJPEG/CMakeLists.txt
+@@ -1,16 +1,32 @@
+ project(ITKOpenJPEG)
+ set(ITKOpenJPEG_THIRD_PARTY 1)
+ 
+-set(ITKOpenJPEG_INCLUDE_DIRS
+-  ${ITKOpenJPEG_BINARY_DIR}/src/openjpeg
+-  ${ITKOpenJPEG_SOURCE_DIR}/src/openjpeg
+-  )
+-set(ITKOpenJPEG_LIBRARIES itkopenjpeg)
++option(ITK_USE_SYSTEM_OPENJPEG "Use system-installed openjpeg" 
${ITK_USE_SYSTEM_LIBRARIES})
++mark_as_advanced(ITK_USE_SYSTEM_OPENJPEG)
++
++if(ITK_USE_SYSTEM_OPENJPEG)
++  find_package(OpenJPEG REQUIRED)
++  set(ITKOpenJPEG_INCLUDE_DIRS
++    ${ITKOpenJPEG_BINARY_DIR}/src
++    )
++  set(ITKOpenJPEG_SYSTEM_INCLUDE_DIRS
++    ${OPENJPEG_INCLUDE_DIRS}
++    )
++  set(ITKOpenJPEG_LIBRARIES "${OPENJPEG_LIBRARIES}")
++  set(ITKOpenJPEG_NO_SRC 1)
++else()
++  set(ITKOpenJPEG_INCLUDE_DIRS
++    ${ITKOpenJPEG_BINARY_DIR}/src/openjpeg
++    ${ITKOpenJPEG_SOURCE_DIR}/src/openjpeg
++    )
++  set(ITKOpenJPEG_LIBRARIES itkopenjpeg)
++endif()
++
++configure_file(src/itk_openjpeg.h.in src/itk_openjpeg.h)
+ set(ITK_LIBRARY_PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS FALSE)
+-
+ itk_module_impl()
+ 
+-install(FILES ${ITKOpenJPEG_SOURCE_DIR}/src/itk_openjpeg.h
++install(FILES ${ITKOpenJPEG_BINARY_DIR}/src/itk_openjpeg.h
+   DESTINATION ${ITKOpenJPEG_INSTALL_INCLUDE_DIR}
+   COMPONENT Development
+   )
+diff --git a/Modules/ThirdParty/OpenJPEG/src/itk_openjpeg.h 
b/Modules/ThirdParty/OpenJPEG/src/itk_openjpeg.h.in
+rename from Modules/ThirdParty/OpenJPEG/src/itk_openjpeg.h
+rename to Modules/ThirdParty/OpenJPEG/src/itk_openjpeg.h.in
+--- a/Modules/ThirdParty/OpenJPEG/src/itk_openjpeg.h
++++ b/Modules/ThirdParty/OpenJPEG/src/itk_openjpeg.h.in
+@@ -25,6 +25,12 @@
+ #ifndef itk_openjpeg_h
+ #define itk_openjpeg_h
+ 
+-#include <itkopenjpeg/openjpeg.h>
++/* Use the openjpeg library configured for ITK.  */
++#cmakedefine ITK_USE_SYSTEM_OPENJPEG
++#ifdef ITK_USE_SYSTEM_OPENJPEG
++# include <openjpeg.h>
++#else
++# include <itkopenjpeg/openjpeg.h>
++#endif
+ 
+ #endif
+--- a/Modules/IO/JPEG2000/src/itkJPEG2000ImageIO.cxx
++++ b/Modules/IO/JPEG2000/src/itkJPEG2000ImageIO.cxx
+@@ -27,8 +27,6 @@
+ extern "C"
+ {
+ #include "openjpeg.h"
+-#include "j2k.h"
+-#include "jp2.h"
+ }
+ 
+ 
+@@ -139,11 +137,11 @@
+ {
+   itkDebugMacro(<< "ReadImageInformation()");
+ 
+-  FILE * l_file = fopen(this->m_FileName.c_str(), "rb");
+-
+-  /* decompression parameters */
++  /* set decoding parameters to default values */
++  
opj_set_default_decoder_parameters(&(this->m_Internal->m_DecompressionParameters));
+ 
+-  if (!l_file)
++  opj_stream_t * cio = 
opj_stream_create_default_file_stream(this->m_FileName.c_str(), true);
++  if (!cio)
+   {
+     itkExceptionMacro("JPEG2000ImageIO failed to open file for reading: " << 
this->GetFileName() << std::endl
+                                                                           << 
"Reason: "
+@@ -151,10 +149,5 @@
+   }
+ 
+-  /* set decoding parameters to default values */
+-  
opj_set_default_decoder_parameters(&(this->m_Internal->m_DecompressionParameters));
+-
+-  opj_stream_t * cio = opj_stream_create_default_file_stream(l_file, true);
+-
+   this->m_Internal->m_Dinfo = nullptr; /* handle to a decompressor */
+ 
+   opj_image_t * l_image = nullptr;
+@@ -188,9 +181,8 @@
+ 
+       /* get a decoder handle */
+-      this->m_Internal->m_Dinfo = opj_create_decompress(CODEC_J2K);
++      this->m_Internal->m_Dinfo = opj_create_decompress(OPJ_CODEC_J2K);
+       if (!this->m_Internal->m_Dinfo)
+       {
+         opj_stream_destroy(cio);
+-        fclose(l_file);
+         itkExceptionMacro("JPEG2000ImageIO failed to read file: "
+                           << this->GetFileName() << std::endl
+@@ -202,10 +194,9 @@
+     {
+       /* JPEG 2000 compressed image data */
+       /* get a decoder handle */
+-      this->m_Internal->m_Dinfo = opj_create_decompress(CODEC_JP2);
++      this->m_Internal->m_Dinfo = opj_create_decompress(OPJ_CODEC_JP2);
+       if (!this->m_Internal->m_Dinfo)
+       {
+         opj_stream_destroy(cio);
+-        fclose(l_file);
+         itkExceptionMacro("JPEG2000ImageIO failed to read file: "
+                           << this->GetFileName() << std::endl
+@@ -217,10 +208,9 @@
+     {
+       /* JPEG 2000, JPIP */
+       /* get a decoder handle */
+-      this->m_Internal->m_Dinfo = opj_create_decompress(CODEC_JPT);
++      this->m_Internal->m_Dinfo = opj_create_decompress(OPJ_CODEC_JPT);
+       if (!this->m_Internal->m_Dinfo)
+       {
+         opj_stream_destroy(cio);
+-        fclose(l_file);
+         itkExceptionMacro("JPEG2000ImageIO failed to read file: "
+                           << this->GetFileName() << std::endl
+@@ -230,7 +220,6 @@
+     }
+     default:
+       opj_stream_destroy(cio);
+-      fclose(l_file);
+       itkExceptionMacro("JPEG2000ImageIO failed to read file: "
+                         << this->GetFileName() << std::endl
+                         << "Reason: "
+@@ -248,26 +237,8 @@
+   }
+ 
+-  // Image parameters - first tile
+-  OPJ_INT32 l_tile_x0;
+-  OPJ_INT32 l_tile_y0;
+-
+-  // Image parameters - tile width, height and number of tiles
+-  OPJ_UINT32 l_tile_width;
+-  OPJ_UINT32 l_tile_height;
+-  OPJ_UINT32 l_nb_tiles_x;
+-  OPJ_UINT32 l_nb_tiles_y;
+-
+   itkDebugMacro(<< "Trying to read header now...");
+ 
+-  bResult = opj_read_header(this->m_Internal->m_Dinfo,
+-                            &l_image,
+-                            &l_tile_x0,
+-                            &l_tile_y0,
+-                            &l_tile_width,
+-                            &l_tile_height,
+-                            &l_nb_tiles_x,
+-                            &l_nb_tiles_y,
+-                            cio);
++  bResult = opj_read_header(cio, this->m_Internal->m_Dinfo, &l_image);
+ 
+   if (!bResult)
+   {
+@@ -284,13 +255,21 @@
+   }
+ 
+-  this->m_Internal->m_TileStartX = l_tile_x0;
+-  this->m_Internal->m_TileStartY = l_tile_y0;
++  opj_codestream_info_v2_t* cp = opj_get_cstr_info(this->m_Internal->m_Dinfo);
++  if (!cp)
++  {
++    opj_stream_destroy(cio);
++    opj_image_destroy(l_image);
++    itkExceptionMacro("JPEG2000ImageIO failed to read file: " << 
this->GetFileName() << std::endl
++                                                              << "Reason: 
Error while reading image header");
++  }
++  this->m_Internal->m_TileStartX = cp->tx0;
++  this->m_Internal->m_TileStartY = cp->ty0;
+ 
+-  this->m_Internal->m_TileWidth = l_tile_width;
+-  this->m_Internal->m_TileHeight = l_tile_height;
++  this->m_Internal->m_TileWidth = cp->tdx;
++  this->m_Internal->m_TileHeight = cp->tdy;
+ 
+-  this->m_Internal->m_NumberOfTilesInX = l_nb_tiles_x;
+-  this->m_Internal->m_NumberOfTilesInY = l_nb_tiles_y;
++  this->m_Internal->m_NumberOfTilesInX = cp->tw;
++  this->m_Internal->m_NumberOfTilesInY = cp->th;
+ 
+ 
+   itkDebugMacro(<< "Number of Components = " << l_image->numcomps);
+@@ -307,6 +286,7 @@
+   else
+   {
+     opj_stream_destroy(cio);
++    opj_image_destroy(l_image);
+     itkExceptionMacro("JPEG2000ImageIO failed to read file: " << 
this->GetFileName() << std::endl
+                                                               << "Reason: "
+                                                               << "Unknown 
precision in file: "
+@@ -320,6 +300,6 @@
+       break;
+     case 3:
+-      if (l_image->color_space != CLRSPC_SRGB)
++      if (l_image->color_space != OPJ_CLRSPC_SRGB)
+       {
+         itkWarningMacro(<< "file does not specify color space, assuming 
sRGB");
+       }
+@@ -349,7 +329,6 @@
+ 
+   /* close the byte stream */
+   opj_stream_destroy(cio);
+-  fclose(l_file);
+ 
+   if (this->m_Internal->m_Dinfo)
+   {
+@@ -368,16 +347,7 @@
+ {
+   itkDebugMacro(<< "JPEG2000ImageIO::Read() Begin");
+ 
+-  FILE * l_file = fopen(this->m_FileName.c_str(), "rb");
+-
+-  if (!l_file)
+-  {
+-    itkExceptionMacro("JPEG2000ImageIO failed to open file for reading: " << 
this->GetFileName() << std::endl
+-                                                                          << 
"Reason: "
+-                                                                          << 
itksys::SystemTools::GetLastSystemError());
+-  }
+-
+-  opj_stream_t * l_stream = opj_stream_create_default_file_stream(l_file, 
true);
++  opj_stream_t * l_stream = 
opj_stream_create_default_file_stream(this->m_FileName.c_str(), true);
+   if (!l_stream)
+   {
+     itkExceptionMacro("JPEG2000ImageIO failed to read file: "
+@@ -397,9 +367,10 @@
+     {
+       /* JPEG-2000 codestream */
+       /* get a decoder handle */
+-      this->m_Internal->m_Dinfo = opj_create_decompress(CODEC_J2K);
++      this->m_Internal->m_Dinfo = opj_create_decompress(OPJ_CODEC_J2K);
+       if (!this->m_Internal->m_Dinfo)
+       {
++        opj_stream_destroy(l_stream);
+         itkExceptionMacro("JPEG2000ImageIO failed to read file: "
+                           << this->GetFileName() << std::endl
+                           << "Reason: opj_create_decompress(CODEC_J2K) 
returns nullptr");
+@@ -410,9 +381,10 @@
+     {
+       /* JPEG 2000 compressed image data */
+       /* get a decoder handle */
+-      this->m_Internal->m_Dinfo = opj_create_decompress(CODEC_JP2);
++      this->m_Internal->m_Dinfo = opj_create_decompress(OPJ_CODEC_JP2);
+       if (!this->m_Internal->m_Dinfo)
+       {
++        opj_stream_destroy(l_stream);
+         itkExceptionMacro("JPEG2000ImageIO failed to read file: "
+                           << this->GetFileName() << std::endl
+                           << "Reason: opj_create_decompress(CODEC_JP2) 
returns nullptr");
+@@ -423,9 +395,10 @@
+     {
+       /* JPEG 2000, JPIP */
+       /* get a decoder handle */
+-      this->m_Internal->m_Dinfo = opj_create_decompress(CODEC_JPT);
++      this->m_Internal->m_Dinfo = opj_create_decompress(OPJ_CODEC_JPT);
+       if (!this->m_Internal->m_Dinfo)
+       {
++        opj_stream_destroy(l_stream);
+         itkExceptionMacro("JPEG2000ImageIO failed to read file: "
+                           << this->GetFileName() << std::endl
+                           << "Reason: opj_create_decompress(CODEC_JPT) 
returns nullptr");
+@@ -433,7 +406,7 @@
+       break;
+     }
+     default:
+-      fclose(l_file);
++      opj_stream_destroy(l_stream);
+       itkExceptionMacro("JPEG2000ImageIO failed to read file: "
+                         << this->GetFileName() << std::endl
+                         << "Reason: "
+@@ -445,32 +418,17 @@
+   if (!opj_setup_decoder(this->m_Internal->m_Dinfo, 
&(this->m_Internal->m_DecompressionParameters)))
+   {
++    opj_stream_destroy(l_stream);
+     itkExceptionMacro("JPEG2000ImageIO failed to read file: " << 
this->GetFileName() << std::endl
+                                                               << "Reason: 
opj_setup_decoder returns false");
+   }
+ 
+-  OPJ_INT32 l_tile_x0, l_tile_y0;
+-
+-  OPJ_UINT32 l_tile_width;
+-  OPJ_UINT32 l_tile_height;
+-  OPJ_UINT32 l_nb_tiles_x;
+-  OPJ_UINT32 l_nb_tiles_y;
+-
+-  bool bResult = opj_read_header(this->m_Internal->m_Dinfo,
+-                                 &l_image,
+-                                 &l_tile_x0,
+-                                 &l_tile_y0,
+-                                 &l_tile_width,
+-                                 &l_tile_height,
+-                                 &l_nb_tiles_x,
+-                                 &l_nb_tiles_y,
+-                                 l_stream);
++  bool bResult = opj_read_header(l_stream, this->m_Internal->m_Dinfo, 
&l_image);
+ 
+   if (!bResult)
+   {
+     opj_destroy_codec(this->m_Internal->m_Dinfo);
+     this->m_Internal->m_Dinfo = nullptr;
+     opj_stream_destroy(l_stream);
+-    fclose(l_file);
+     itkExceptionMacro("JPEG2000ImageIO failed to read file: " << 
this->GetFileName() << std::endl
+                                                               << "Reason: 
opj_read_header returns false");
+   }
+@@ -499,7 +457,7 @@
+   itkDebugMacro(<< "p_end_x = " << p_end_x);
+   itkDebugMacro(<< "p_end_y = " << p_end_y);
+ 
+-  bResult = opj_set_decode_area(this->m_Internal->m_Dinfo, p_start_x, 
p_start_y, p_end_x, p_end_y);
++  bResult = opj_set_decode_area(this->m_Internal->m_Dinfo, l_image, 
p_start_x, p_start_y, p_end_x, p_end_y);
+ 
+   itkDebugMacro(<< "opj_set_decode_area() after");
+ 
+@@ -509,6 +467,5 @@
+     this->m_Internal->m_Dinfo = nullptr;
+     opj_stream_destroy(l_stream);
+-    fclose(l_file);
+     itkExceptionMacro("JPEG2000ImageIO failed to read file: " << 
this->GetFileName() << std::endl
+                                                               << "Reason: 
opj_set_decode_area returns false");
+   }
+@@ -525,13 +482,14 @@
+ 
+   OPJ_UINT32 l_max_data_size = 1000;
+ 
+-  bool l_go_on = true;
++  OPJ_BOOL l_go_on = true;
+ 
+   auto * l_data = (OPJ_BYTE *)malloc(1000);
+ 
+   while (l_go_on)
+   {
+     bool tileHeaderRead = opj_read_tile_header(this->m_Internal->m_Dinfo,
++                                               l_stream,
+                                                &l_tile_index,
+                                                &l_data_size,
+                                                &l_current_tile_x0,
+@@ -540,13 +498,11 @@
+                                                &l_current_tile_y1,
+                                                &l_nb_comps,
+-                                               &l_go_on,
+-                                               l_stream);
++                                               &l_go_on);
+ 
+     if (!tileHeaderRead)
+     {
+       free(l_data);
+       opj_stream_destroy(l_stream);
+-      fclose(l_file);
+       opj_destroy_codec(this->m_Internal->m_Dinfo);
+       opj_image_destroy(l_image);
+       itkExceptionMacro("JPEG2000ImageIO failed to read file: " << 
this->GetFileName() << std::endl
+@@ -571,7 +527,6 @@
+         if (!l_data)
+         {
+           opj_stream_destroy(l_stream);
+-          fclose(l_file);
+           opj_destroy_codec(this->m_Internal->m_Dinfo);
+           opj_image_destroy(l_image);
+           itkExceptionMacro("JPEG2000ImageIO failed to read file: " << 
this->GetFileName() << std::endl
+@@ -590,7 +545,6 @@
+       {
+         free(l_data);
+         opj_stream_destroy(l_stream);
+-        fclose(l_file);
+         opj_destroy_codec(this->m_Internal->m_Dinfo);
+         opj_image_destroy(l_image);
+         itkExceptionMacro("JPEG2000ImageIO failed to read file: " << 
this->GetFileName() << std::endl
+@@ -654,7 +608,6 @@
+   {
+     free(l_data);
+     opj_stream_destroy(l_stream);
+-    fclose(l_file);
+     opj_destroy_codec(this->m_Internal->m_Dinfo);
+     opj_image_destroy(l_image);
+     itkExceptionMacro("JPEG2000ImageIO failed to read file: " << 
this->GetFileName() << std::endl
+@@ -667,13 +620,11 @@
+     this->m_Internal->m_Dinfo = nullptr;
+     opj_stream_destroy(l_stream);
+-    fclose(l_file);
+     itkExceptionMacro("JPEG2000ImageIO failed to read file: " << 
this->GetFileName() << std::endl
+                                                               << "Reason: 
error whle reading image");
+   }
+ 
+   /* close the byte stream */
+   opj_stream_destroy(l_stream);
+-  fclose(l_file);
+ 
+   if (this->m_Internal->m_Dinfo)
+   {
+@@ -775,6 +726,6 @@
+   }
+ 
+-  for (int i = 0; i < parameters.numpocs; i++)
++  for (OPJ_UINT32 i = 0; i < parameters.numpocs; i++)
+   {
+     if (parameters.POC[i].prg == -1)
+     {
+@@ -840,13 +791,13 @@
+ 
+   parameters.numresolution = numberOfResolutions;
+ 
+-  OPJ_COLOR_SPACE      color_space = CLRSPC_GRAY;
++  OPJ_COLOR_SPACE      color_space = OPJ_CLRSPC_GRAY;
+   opj_image_cmptparm_t cmptparms[3];
+ 
+   if (this->GetNumberOfComponents() == 3)
+   {
+ 
+-    color_space = (this->GetPixelType() == IOPixelEnum::RGB) ? CLRSPC_SRGB : 
CLRSPC_UNSPECIFIED;
++    color_space = (this->GetPixelType() == IOPixelEnum::RGB) ? 
OPJ_CLRSPC_SRGB : OPJ_CLRSPC_UNSPECIFIED;
+ 
+     /* initialize image components */
+     memset(&cmptparms[0], 0, 3 * sizeof(opj_image_cmptparm_t));
+@@ -864,7 +815,7 @@
+ 
+   if (this->GetNumberOfComponents() == 1)
+   {
+-    color_space = CLRSPC_GRAY;
++    color_space = OPJ_CLRSPC_GRAY;
+ 
+     /* initialize image components */
+     memset(&cmptparms[0], 0, sizeof(opj_image_cmptparm_t));
+@@ -941,8 +892,9 @@
+   if (extension == ".j2k")
+   {
+-    cinfo = opj_create_compress(CODEC_J2K);
++    cinfo = opj_create_compress(OPJ_CODEC_J2K);
+     if (!cinfo)
+     {
++      opj_image_destroy(l_image);
+       itkExceptionMacro("JPEG2000ImageIO failed to write file: "
+                         << this->GetFileName() << std::endl
+                         << "Reason: opj_create_compress(CODEC_J2K) returns 
nullptr");
+@@ -950,9 +902,10 @@
+   }
+   else if (extension == ".jp2")
+   {
+-    cinfo = opj_create_compress(CODEC_JP2);
++    cinfo = opj_create_compress(OPJ_CODEC_JP2);
+     if (!cinfo)
+     {
++      opj_image_destroy(l_image);
+       itkExceptionMacro("JPEG2000ImageIO failed to write file: "
+                         << this->GetFileName() << std::endl
+                         << "Reason: opj_create_compress(CODEC_JP2) returns 
nullptr");
+@@ -960,9 +913,10 @@
+   }
+   else if (extension == ".jpt")
+   {
+-    cinfo = opj_create_compress(CODEC_JPT);
++    cinfo = opj_create_compress(OPJ_CODEC_JPT);
+     if (!cinfo)
+     {
++      opj_image_destroy(l_image);
+       itkExceptionMacro("JPEG2000ImageIO failed to write file: "
+                         << this->GetFileName() << std::endl
+                         << "Reason: opj_create_compress(CODEC_JPT) returns 
nullptr");
+@@ -970,6 +924,7 @@
+   }
+   else
+   {
++    opj_image_destroy(l_image);
+     itkExceptionMacro("JPEG2000ImageIO failed to write file: " << 
this->GetFileName() << std::endl
+                                                                << "Reason: 
unknown encode format: " << extension);
+   }
+@@ -985,23 +940,19 @@
+ 
+   if (!opj_setup_encoder(cinfo, &parameters, l_image))
+   {
++    opj_destroy_codec(cinfo);
++    opj_image_destroy(l_image);
+     itkExceptionMacro("JPEG2000ImageIO failed to write file: " << 
this->GetFileName() << std::endl
+                                                                << "Reason: 
opj_setup_encoder returns false");
+   }
+ 
+-  FILE * l_file = fopen(parameters.outfile, "wb");
+-  if (!l_file)
+-  {
+-    itkExceptionMacro("JPEG2000ImageIO failed to open file for writing: " << 
this->GetFileName() << std::endl
+-                                                                          << 
"Reason: "
+-                                                                          << 
itksys::SystemTools::GetLastSystemError());
+-  }
+-
+   /* open a byte stream for writing */
+   /* allocate memory for all tiles */
+-  opj_stream_t * cio = opj_stream_create_default_file_stream(l_file, false);
++  opj_stream_t * cio = 
opj_stream_create_default_file_stream(parameters.outfile, false);
+   if (!cio)
+   {
++    opj_destroy_codec(cinfo);
++    opj_image_destroy(l_image);
+     itkExceptionMacro("JPEG2000ImageIO failed to write file: "
+                       << this->GetFileName() << std::endl
+                       << "Reason: "
+@@ -1017,7 +968,8 @@
+   if (!bSuccess)
+   {
+     opj_stream_destroy(cio);
+-    fclose(l_file);
++    opj_destroy_codec(cinfo);
++    opj_image_destroy(l_image);
+     itkExceptionMacro("JPEG2000ImageIO failed to write file: " << 
this->GetFileName() << std::endl
+                                                                << "Reason: 
opj_start_compress returns false");
+   }
+@@ -1026,7 +978,8 @@
+   if (!bSuccess)
+   {
+     opj_stream_destroy(cio);
+-    fclose(l_file);
++    opj_destroy_codec(cinfo);
++    opj_image_destroy(l_image);
+     itkExceptionMacro("JPEG2000ImageIO failed to write file: " << 
this->GetFileName() << std::endl
+                                                                << "Reason: 
opj_encode returns false");
+   }
+@@ -1035,14 +988,14 @@
+   if (!bSuccess)
+   {
+     opj_stream_destroy(cio);
+-    fclose(l_file);
++    opj_destroy_codec(cinfo);
++    opj_image_destroy(l_image);
+     itkExceptionMacro("JPEG2000ImageIO failed to write file: " << 
this->GetFileName() << std::endl
+                                                                << "Reason: 
opj_end_compress returns false");
+   }
+ 
+   /* close and free the byte stream */
+   opj_stream_destroy(cio);
+-  fclose(l_file);
+ 
+   /* free remaining compression structures */
+   opj_destroy_codec(cinfo);
+--- a/Modules/Nonunit/Review/src/CMakeLists.txt
++++ b/Modules/Nonunit/Review/src/CMakeLists.txt
+@@ -5,7 +5,7 @@
+ 
+ add_library(ITKReview ${ITKReview_SRC})
+ itk_module_link_dependencies()
+-target_link_libraries(ITKReview LINK_PUBLIC ${ITKTestKernel_LIBRARIES} 
${ITKIOLSM_LIBRARIES} itkopenjpeg)
++target_link_libraries(ITKReview LINK_PUBLIC ${ITKTestKernel_LIBRARIES} 
${ITKIOLSM_LIBRARIES} ${ITKOpenJPEG_LIBRARIES})
+ itk_module_target(ITKReview)
+ 
+ 

diff --git a/sci-libs/itk/files/itk-5.2.1-system-tiff-has-64.patch 
b/sci-libs/itk/files/itk-5.2.1-system-tiff-has-64.patch
new file mode 100644
index 000000000..25c44db2c
--- /dev/null
+++ b/sci-libs/itk/files/itk-5.2.1-system-tiff-has-64.patch
@@ -0,0 +1,18 @@
+From: François-Xavier Carton <[email protected]>
+Date: Wed, 8 Jun 2022 19:36:48 +0200
+Subject: [PATCH] system libtiff has INT64
+
+Enabling this, otherwise using system libtiff leads to errors. In particular
+tests fail because there is some IFD8 data but the itkTIFFDataSize function
+returns 0 instead of 8, resulting in invalid mem access.
+
+--- a/Modules/ThirdParty/TIFF/src/itk_tiff.h.in.orig   2022-06-08 
19:34:04.412431969 +0200
++++ b/Modules/ThirdParty/TIFF/src/itk_tiff.h.in        2022-06-08 
19:34:26.240431631 +0200
+@@ -34,6 +34,7 @@
+ #cmakedefine ITK_TIFF_HAS_TIFFFieldReadCount
+ #cmakedefine ITK_TIFF_HAS_TIFFField
+ #ifdef ITK_USE_SYSTEM_TIFF
++# define TIFF_INT64_T int64_t
+ # include <tiffio.h>
+ #else
+ # include "itktiff/tiffio.h"

diff --git a/sci-libs/itk/files/itk-5.2.1-upstream-fixes.patch 
b/sci-libs/itk/files/itk-5.2.1-upstream-fixes.patch
new file mode 100644
index 000000000..2e547d9ca
--- /dev/null
+++ b/sci-libs/itk/files/itk-5.2.1-upstream-fixes.patch
@@ -0,0 +1,255 @@
+https://github.com/InsightSoftwareConsortium/ITK/commit/2a7f5ed199926999b67f61a97c2c9a2595a11558.patch
+https://github.com/InsightSoftwareConsortium/ITK/commit/0c31aa688e82a34e5430873bc6176740fd09ad75.patch
+https://github.com/InsightSoftwareConsortium/ITK/commit/28325d921a9b8793e6aaefd612f53989f951d19c.patch
+
+From 2a7f5ed199926999b67f61a97c2c9a2595a11558 Mon Sep 17 00:00:00 2001
+From: Niels Dekker <[email protected]>
+Date: Thu, 24 Jun 2021 18:00:01 +0200
+Subject: [PATCH] COMP: Add missing `#include <iostream>` to Deprecated module
+ test
+
+Fixed a Visual C++ 2019 error, saying:
+
+> Deprecated\test\itkSimpleFastMutexLockTest.cxx(48,12): error C2039: 'cout': 
is not a member of 'std'
+---
+ .../Deprecated/test/itkSimpleFastMutexLockTest.cxx              | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git 
a/Modules/Compatibility/Deprecated/test/itkSimpleFastMutexLockTest.cxx 
b/Modules/Compatibility/Deprecated/test/itkSimpleFastMutexLockTest.cxx
+index 11ad0c52700..60aa1c065b4 100644
+--- a/Modules/Compatibility/Deprecated/test/itkSimpleFastMutexLockTest.cxx
++++ b/Modules/Compatibility/Deprecated/test/itkSimpleFastMutexLockTest.cxx
+@@ -19,6 +19,8 @@
+ 
+ #include "itkSimpleFastMutexLock.h"
+ 
++#include <iostream> // For cout.
++
+ 
+ int
+ itkSimpleFastMutexLockTest(int, char *[])
+From 0c31aa688e82a34e5430873bc6176740fd09ad75 Mon Sep 17 00:00:00 2001
+From: Pablo Hernandez-Cerdan <[email protected]>
+Date: Tue, 20 Apr 2021 17:21:21 +0200
+Subject: [PATCH] COMP: CastXML, ITKVtkGlue, include only when property exists
+
+Some targets (VTK libraries) didn't have the property 
INTERFACE_INCLUDE_DIRECTORIES
+
+```bash
+CMake Error in Modules/Bridge/VtkGlue/wrapping/CMakeLists.txt:
+  Found relative path while evaluating include directories of
+  "ITKVtkGluePython":
+
+    "_vtk_lib_include_dirs-NOTFOUND"
+```
+
+Triggered when compiling Slicer with `Slicer_BUILD_ITKPython:BOOL=ON`
+aka `ITK_WRAP_PYTHON:BOOL=ON`.
+
+Full error log with extra printing:
+
+```bash
+
+CMake Warning at Modules/Bridge/VtkGlue/wrapping/CMakeLists.txt:3 (message):
+  ITKVtkGlue_VTK_LIBRARIES:
+  
VTK::IOImage;VTK::ImagingSources;VTK::WrappingPythonCore;VTK::CommonCore;VTK::CommonDataModel;VTK::kwiml;VTK::CommonExecutionModel;VTK::RenderingOpenGL2;VTK::RenderingFreeType;VTK::InteractionStyle;VTK::InteractionWidgets
+
+CMake Warning at Modules/Bridge/VtkGlue/wrapping/CMakeLists.txt:6 (message):
+  _vtk_lib_include_dirs: _vtk_lib_include_dirs-NOTFOUND
+
+CMake Warning at Modules/Bridge/VtkGlue/wrapping/CMakeLists.txt:6 (message):
+  _vtk_lib_include_dirs: _vtk_lib_include_dirs-NOTFOUND
+
+CMake Warning at Modules/Bridge/VtkGlue/wrapping/CMakeLists.txt:6 (message):
+  _vtk_lib_include_dirs:
+  build/VTK-build/Wrapping/PythonCore;build/VTK/Wrapping/PythonCore
+
+CMake Warning at Modules/Bridge/VtkGlue/wrapping/CMakeLists.txt:6 (message):
+  _vtk_lib_include_dirs: _vtk_lib_include_dirs-NOTFOUND
+
+CMake Warning at Modules/Bridge/VtkGlue/wrapping/CMakeLists.txt:6 (message):
+  _vtk_lib_include_dirs: _vtk_lib_include_dirs-NOTFOUND
+
+CMake Warning at Modules/Bridge/VtkGlue/wrapping/CMakeLists.txt:6 (message):
+  _vtk_lib_include_dirs:
+  build/VTK-build/Utilities/KWIML;build/VTK/Utilities/KWIML
+
+CMake Warning at Modules/Bridge/VtkGlue/wrapping/CMakeLists.txt:6 (message):
+  _vtk_lib_include_dirs: _vtk_lib_include_dirs-NOTFOUND
+
+CMake Warning at Modules/Bridge/VtkGlue/wrapping/CMakeLists.txt:6 (message):
+  _vtk_lib_include_dirs: _vtk_lib_include_dirs-NOTFOUND
+
+CMake Warning at Modules/Bridge/VtkGlue/wrapping/CMakeLists.txt:6 (message):
+  _vtk_lib_include_dirs: _vtk_lib_include_dirs-NOTFOUND
+
+CMake Warning at Modules/Bridge/VtkGlue/wrapping/CMakeLists.txt:6 (message):
+  _vtk_lib_include_dirs: _vtk_lib_include_dirs-NOTFOUND
+
+CMake Warning at Modules/Bridge/VtkGlue/wrapping/CMakeLists.txt:6 (message):
+  _vtk_lib_include_dirs: _vtk_lib_include_dirs-NOTFOUND
+
+-- ITKVtkGlue: Creating module.
+-- ITKVtkGlue: Creating itkImageToVTKImageFilter submodule.
+-- ITKVtkGlue: Creating itkVTKImageToImageFilter submodule.
+-- ITKVtkGlue: Creating itkViewImage submodule.
+-- MGHIO: Creating module.
+-- MGHIO: Creating itkMGHImageIO submodule.
+-- MorphologicalContourInterpolation: Creating module.
+-- MorphologicalContourInterpolation: Creating 
itkMorphologicalContourInterpolator submodule.
+-- ITKPyUtils: Creating module.
+-- ITKPyUtils: Creating itkPyCommand submodule.
+-- ITKPyUtils: Creating itkPyImageFilter submodule.
+-- Configuring done
+CMake Error: The following variables are used in this project, but they are 
set to NOTFOUND.
+Please set them or make sure they are set and tested correctly in the CMake 
files:
+_vtk_lib_include_dirs
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+   used as include directory in directory 
build/ITK/Modules/Bridge/VtkGlue/wrapping
+
+CMake Error in Modules/Bridge/VtkGlue/wrapping/CMakeLists.txt:
+  Found relative path while evaluating include directories of
+  "ITKVtkGluePython":
+
+    "_vtk_lib_include_dirs-NOTFOUND"
+
+```
+---
+ Modules/Bridge/VtkGlue/wrapping/CMakeLists.txt | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/Modules/Bridge/VtkGlue/wrapping/CMakeLists.txt 
b/Modules/Bridge/VtkGlue/wrapping/CMakeLists.txt
+index 3f3322957e1..2fd6a5af8f6 100644
+--- a/Modules/Bridge/VtkGlue/wrapping/CMakeLists.txt
++++ b/Modules/Bridge/VtkGlue/wrapping/CMakeLists.txt
+@@ -2,7 +2,9 @@
+ if(NOT VTK_RENDERING_BACKEND STREQUAL "None")
+   foreach(_vtk_lib IN LISTS ITKVtkGlue_VTK_LIBRARIES)
+     get_target_property(_vtk_lib_include_dirs ${_vtk_lib} 
INTERFACE_INCLUDE_DIRECTORIES)
+-    include_directories(${_vtk_lib_include_dirs})
++    if(_vtk_lib_include_dirs)
++      include_directories(${_vtk_lib_include_dirs})
++    endif()
+   endforeach()
+ endif()
+ 
+From 28325d921a9b8793e6aaefd612f53989f951d19c Mon Sep 17 00:00:00 2001
+From: Butui Hu <[email protected]>
+Date: Mon, 1 Aug 2022 14:26:39 +0800
+Subject: [PATCH] COMP: use sysconfig.get_path as PEP 632 deprecate distutils
+ module
+
+---
+ Wrapping/Generators/Python/CMakeLists.txt | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/Wrapping/Generators/Python/CMakeLists.txt 
b/Wrapping/Generators/Python/CMakeLists.txt
+index fca3d999b87..3b7a1d37334 100644
+--- a/Wrapping/Generators/Python/CMakeLists.txt
++++ b/Wrapping/Generators/Python/CMakeLists.txt
+@@ -36,7 +36,7 @@ file(MAKE_DIRECTORY 
${WRAPPER_MASTER_INDEX_OUTPUT_DIR}/python)
+ 
###############################################################################
+ # Configure Python wrapping installation
+ if(Python3_EXECUTABLE AND NOT PY_SITE_PACKAGES_PATH)
+-  set(python_check "try:\n    import distutils.sysconfig\n    
print(distutils.sysconfig.get_python_lib(plat_specific=1, 
prefix=''))\nexcept:\n    pass")
++  set(python_check "try:\n    import sysconfig\n    
print(sysconfig.get_path('platlib'))\nexcept:\n    pass")
+   file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/detect_site_package_path.py 
${python_check})
+   execute_process(COMMAND "${Python3_EXECUTABLE}" 
"${CMAKE_CURRENT_BINARY_DIR}/detect_site_package_path.py"
+     OUTPUT_VARIABLE py_spp

diff --git a/sci-libs/itk/itk-5.2.1.ebuild b/sci-libs/itk/itk-5.2.1.ebuild
new file mode 100644
index 000000000..25292269f
--- /dev/null
+++ b/sci-libs/itk/itk-5.2.1.ebuild
@@ -0,0 +1,246 @@
+# Copyright 1999-2022 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+PYTHON_COMPAT=( python3_{9..10} )
+VIRTUALX_REQUIRED="manual"
+
+inherit cmake python-single-r1 virtualx
+
+MY_PN="InsightToolkit"
+MY_P="${MY_PN}-${PV}"
+GLI_HASH="89da9305f5750d3990ca9fd35ecc5ce0b39c71a6"
+TEST_HASH="7ab9d41ad5b42ccbe8adcaf0b24416d439a264d0"
+declare -a GLI_TEST_HASHES=(
+       
"a5e11ea71164ff78c65fcf259db01ea5db981a9d868e60045ff2bffca92984df1174bf984a1076e450f0d5d69b4f0191ed1a61465c220e2c91a893b5df150c0a"
+       
"bcdbb347f3704262d1f00be7179d6a0a6e68aed56c0653e8072ee5a94985c713bd229c935b1226a658af84fb7f1fffc2458c98364fc35303a2303b12f9f7ce2f"
+)
+
+GLI_TEST_SRC=""
+for i in "${GLI_TEST_HASHES[@]}"; do
+       
GLI_TEST_SRC+="https://data.kitware.com/api/v1/file/hashsum/sha512/${i}/download
 -> ${PN}-test-${i} "
+done
+
+DESCRIPTION="NLM Insight Segmentation and Registration Toolkit"
+HOMEPAGE="https://itk.org";
+SRC_URI="
+       
https://github.com/InsightSoftwareConsortium/ITK/releases/download/v${PV}/${MY_P}.tar.gz
+       
https://github.com/InsightSoftwareConsortium/ITKGenericLabelInterpolator/archive/${GLI_HASH}.tar.gz
 -> ITKGenericLabelInterpolator-${PV}.tar.gz
+       test? (
+               
https://github.com/InsightSoftwareConsortium/ITK/releases/download/v${PV}/InsightData-${PV}.tar.gz
+               
https://github.com/InsightSoftwareConsortium/ITKTestingData/archive/${TEST_HASH}.tar.gz
 -> ${P}-testingdata.tar.gz
+               ${GLI_TEST_SRC}
+               )
+       "
+
+LICENSE="Apache-2.0"
+SLOT="0"
+KEYWORDS="~amd64 ~x86"
+IUSE="debug doc examples fftw itkv4-compat python review test vtkglue"
+REQUIRED_USE="python? ( ${PYTHON_REQUIRED_USE} )"
+
+RESTRICT="!test? ( test )"
+
+RDEPEND="
+       dev-cpp/eigen:3
+       dev-libs/double-conversion:0=
+       dev-libs/expat:0=
+       media-libs/openjpeg:2
+       media-libs/libpng:0=
+       media-libs/tiff:0=[jpeg]
+       sci-libs/dcmtk:0=
+       sci-libs/hdf5:0=[cxx]
+       sci-libs/gdcm:0=
+       sys-libs/zlib:0=
+       media-libs/libjpeg-turbo:0=
+       fftw? ( sci-libs/fftw:3.0= )
+       vtkglue? (
+               sci-libs/vtk:0=[rendering]
+               python? (
+                       sci-libs/vtk:0=[python,${PYTHON_SINGLE_USEDEP}]
+               )
+       )
+       python? ( ${PYTHON_DEPS} )
+"
+DEPEND="${RDEPEND}
+       sys-apps/coreutils
+       python? (
+               >=dev-lang/swig-2.0:0
+               dev-libs/castxml
+       )
+       doc? ( app-doc/doxygen )
+"
+BDEPEND="
+       test? (
+               vtkglue? ( ${VIRTUALX_DEPEND} )
+               python? (
+                       $(python_gen_cond_dep 
'dev-python/numpy[${PYTHON_USEDEP}]')
+               )
+       )
+"
+
+S="${WORKDIR}/${MY_P}"
+
+PATCHES=(
+       "${FILESDIR}/${P}-upstream-fixes.patch"
+       "${FILESDIR}/${P}-system-tiff-has-64.patch"
+       "${FILESDIR}/${P}-fix-castxml-clang-attr-malloc.patch"
+       "${FILESDIR}/${P}-system-openjpeg.patch"
+)
+
+pkg_pretend() {
+       if [[ -z ${ITK_COMPUTER_MEMORY_SIZE} ]]; then
+               elog "To tune ITK to make the best use of working memory you 
can set"
+               elog "    ITK_COMPUTER_MEMORY_SIZE=XX"
+               elog "in make.conf, default is 1 (unit is GB)"
+       fi
+       if use python && [[ -z ${ITK_WRAP_DIMS} ]]; then
+               elog "For Python language bindings, you can define the 
dimensions"
+               elog "you want to create bindings for by setting"
+               elog "    ITK_WRAP_DIMS=X;Y;Z..."
+               elog "in make.conf, default is 2;3 for 2D and 3D data"
+       fi
+}
+
+src_prepare() {
+       # drop bundled libs
+       local -a DROPS=(
+               DoubleConversion/src/double-conversion
+               Eigen3/src/itkeigen
+               Expat/src/expat
+               GDCM/src/gdcm
+               JPEG/src/itkjpeg
+               HDF5/src/itkhdf5
+               OpenJPEG/src/openjpeg
+               PNG/src/itkpng
+               TIFF/src/itktiff
+               ZLIB/src/itkzlib
+       )
+       local x
+       for x in "${DROPS[@]}"; do
+               ebegin "Dropping bundled ${x%%/*}"
+               rm -r "Modules/ThirdParty/${x}" || die
+               eend $?
+       done
+       {
+               find Modules/ThirdParty -mindepth 2 -maxdepth 2 -type d -name 
src -printf '%P\n'
+               printf '%s\n' "${DROPS[@]}" | sed 's,/[^/]*$,,'
+       } | sort | uniq -u | xargs -n 1 ewarn "Using bundled" || die
+
+       # Remote modules
+       ln -sr "../ITKGenericLabelInterpolator-${GLI_HASH}" 
Modules/External/ITKGenericLabelInterpolator || die
+
+       cmake_src_prepare
+
+       if use test; then
+               cp -rf "../ITKTestingData-${TEST_HASH}/"* ".ExternalData/" || 
die
+               mv "../ITKTestingData-${TEST_HASH}" 
"${BUILD_DIR}/.ExternalData" || die
+               for i in "${GLI_TEST_HASHES[@]}"; do
+                       cp "${DISTDIR}/${PN}-test-${i}" 
".ExternalData/SHA512/${i}" || die
+                       cp "${DISTDIR}/${PN}-test-${i}" 
"${BUILD_DIR}/.ExternalData/SHA512/${i}" || die
+               done
+       fi
+}
+
+src_configure() {
+       local mycmakeargs=(
+               -DITK_BUILD_DOCUMENTATION="$(usex doc ON OFF)"
+               -DITK_INSTALL_DOC_DIR="share/doc/${P}"
+               -DBUILD_EXAMPLES="$(usex examples ON OFF)"
+               -DBUILD_SHARED_LIBS=ON
+               -DBUILD_TESTING="$(usex test ON OFF)"
+               
-Ddouble-conversion_INCLUDE_DIRS="${EPREFIX}/usr/include/double-conversion"
+               
-DExternalData_OBJECT_STORES="${WORKDIR}/InsightToolkit-${PV}/.ExternalData"
+               -DGDCM_USE_SYSTEM_OPENJPEG=ON
+               -DITK_FORBID_DOWNLOADS:BOOL=ON
+               -DITK_INSTALL_LIBRARY_DIR=$(get_libdir)
+               -DITK_USE_REVIEW="$(usex review ON OFF)"
+               -DITK_USE_SYSTEM_DCMTK=ON
+               -DITK_USE_SYSTEM_DOUBLECONVERSION=ON
+               -DITK_USE_SYSTEM_CASTXML=ON
+               -DITK_USE_SYSTEM_EIGEN=ON
+               -DITK_USE_SYSTEM_EXPAT=ON
+               -DITK_USE_SYSTEM_GDCM=ON
+               -DITK_USE_SYSTEM_HDF5=ON
+               -DITK_USE_SYSTEM_JPEG=ON
+               -DITK_USE_SYSTEM_OPENJPEG=ON
+               -DITK_USE_SYSTEM_PNG=ON
+               -DITK_USE_SYSTEM_SWIG=ON
+               -DITK_USE_SYSTEM_TIFF=ON
+               -DITK_USE_SYSTEM_ZLIB=ON
+               -DITK_USE_KWSTYLE=OFF
+               -DITK_BUILD_DEFAULT_MODULES=ON
+               -DITK_COMPUTER_MEMORY_SIZE="${ITK_COMPUTER_MEMORY_SIZE:-1}"
+               -DModule_GenericLabelInterpolator:BOOL=ON
+               -DModule_ITKReview:BOOL=ON
+               -DWRAP_ITK_JAVA=OFF
+               -DWRAP_ITK_TCL=OFF
+               -DITKV4_COMPATIBILITY:BOOL=$(usex itkv4-compat)
+       )
+       if use fftw; then
+               mycmakeargs+=(
+                       -DUSE_FFTWD=ON
+                       -DUSE_FFTWF=ON
+                       -DUSE_SYSTEM_FFTW=ON
+                       -DITK_WRAP_double=ON
+                       -DITK_WRAP_vector_double=ON
+                       -DITK_WRAP_covariant_vector_double=ON
+                       -DITK_WRAP_complex_double=ON
+               )
+       fi
+       if use vtkglue; then
+               mycmakeargs+=(
+                       -DModule_ITKVtkGlue=ON
+               )
+       fi
+       if use python; then
+               mycmakeargs+=(
+                       -DITK_WRAP_PYTHON=ON
+                       -DPython3_EXECUTABLE="${PYTHON}"
+                       -DITK_WRAP_DIMS="${ITK_WRAP_DIMS:-2;3}"
+               )
+       else
+               mycmakeargs+=(
+                       -DITK_WRAP_PYTHON=OFF
+               )
+       fi
+       cmake_src_configure
+}
+
+src_install() {
+       cmake_src_install
+
+       if use examples; then
+               docinto examples
+               docompress -x /usr/share/doc/${PF}/examples
+               dodoc -r "${S}"/Examples/*
+       fi
+
+       echo "ITK_DATA_ROOT=${EPREFIX}/usr/share/${PN}/data" > ${T}/40${PN} || 
die
+       local ldpath="${EPREFIX}/usr/$(get_libdir)/InsightToolkit"
+       if use python; then
+               echo 
"PYTHONPATH=${EPREFIX}/usr/$(get_libdir)/InsightToolkit/WrapITK/Python" >> 
"${T}"/40${PN} || die
+               
ldpath="${ldpath}:${EPREFIX}/usr/$(get_libdir)/InsightToolkit/WrapITK/lib"
+       fi
+       echo "LDPATH=${ldpath}" >> "${T}"/40${PN} || die
+       doenvd "${T}"/40${PN}
+
+       if use doc; then
+               cd "${WORKDIR}"/html || die
+               rm  *.md5 || die "Failed to remove superfluous hashes"
+               einfo "Installing API docs. This may take some time."
+               docinto api-docs
+               dodoc -r *
+       fi
+
+       use python && python_optimize
+}
+
+src_test() {
+       if use vtkglue; then
+               virtx cmake_src_test
+       else
+               cmake_src_test
+       fi
+}

Reply via email to