%global snap_ver 4.4.0-beta2 # Pinned submodule commits for v4.4.0-beta2 %global c3d_commit d4d963629d7dfdca4b0607907f0e91827c22ea2a %global greedy_commit 2d5dfa1891ac726524495d4ca8a3461be86c12f5 %global digestible_commit 1b66709e99c43d280bb472e1a0e36185ef2ea412 # No shared libs installed (BUILD_SHARED_LIBS=OFF); suppress empty debug pkg %define debug_package %{nil} Name: itksnap Version: 4.4.0~beta2 Release: 0.21%{?dist} Summary: Medical image segmentation tool for 3D/4D biomedical images License: GPL-3.0-or-later URL: http://www.itksnap.org # Main source — GitHub does not include submodules in the tarball; they are # handled separately below via Sources 1-3. Source0: https://github.com/pyushkevich/itksnap/archive/refs/tags/v%{snap_ver}.tar.gz#/itksnap-%{snap_ver}.tar.gz # VTK 9.7 removed vtkViewport::AddActor2D; see the patch header. Patch0: itksnap-vtk97-addviewprop.patch # Build against the system jsoncpp instead of the bundled 0.10.6 copy. Patch1: itksnap-system-jsoncpp.patch Source1: https://github.com/pyushkevich/c3d/archive/%{c3d_commit}/c3d-%{c3d_commit}.tar.gz Source2: https://github.com/pyushkevich/greedy/archive/%{greedy_commit}/greedy-%{greedy_commit}.tar.gz Source3: https://github.com/pyushkevich/digestible/archive/%{digestible_commit}/digestible-%{digestible_commit}.tar.gz # Every ITK_LEGACY_REMOVE construct in ITK-SNAP's OWN tree, in one patch: # itkEventMacro -> an application-owned snapEventMacro keeping the methods # inline, the itk::SpatialOrientation aliases, and the ImageIO enum aliases # (ImageIOBase::ByteOrder, and bare SCALAR/UCHAR/USHORT/FLOAT/DOUBLE in # assignments and case labels). # # Derived from itksnap-alpha-itk-events-orientation.patch rather than written # fresh: that package solved the same constructs against 4.6.0~alpha0 and is # green on all six chroots. Applied here with fuzz, which left exactly one # reject (60-odd mechanical itkEventMacro renames in Common/SNAPEvents.h, no # semantic content), then re-diffed against a pristine 4.4.0~beta2 tree and # checked to apply with zero failed hunks. # # A patch rather than sed, because the ImageIO enumerators appear BARE in # assignments and `case` labels, so a global substitution would hit unrelated # identifiers. Applied by %%autosetup -p1. It excludes the c3d SUBMODULE on # purpose -- that is handled by the %%prep blocks below, the same split # itksnap-alpha uses, so one upstream source keeps one recognisable fix. Patch2: itksnap-itk-legacy.patch BuildRequires: cmake >= 3.16 BuildRequires: ninja-build BuildRequires: gcc-c++ # ITK 5.4+ from our COPR; installed to non-standard suffix path so ITK_DIR is # set explicitly in %%build. Pin to 5.4.6 — the -0.5 build against 5.4.5 # segfaulted in libjsoncpp.so.26's static initializer on systems with 5.4.6 # installed; the fresh build picks up current jsoncpp/gdcm chroot state. BuildRequires: InsightToolkit5-devel >= 5.4.6 # VTK 9.3.1+ required; Fedora ships 9.2.6 so this comes from our COPR. BuildRequires: vtk-devel # Transitive VTK BR: VTK's cmake config does find_package(CLI11) when # downstream consumers call find_package(VTK). vtk-devel itself doesn't # currently Require cli11-devel (hardening TODO tracked in [[vtk-devel-transitive-requires]]). BuildRequires: cli11-devel # Qt6 — use cmake() virtual BRs so RPM pulls the right subpackage automatically BuildRequires: cmake(Qt6Widgets) BuildRequires: cmake(Qt6OpenGL) BuildRequires: cmake(Qt6OpenGLWidgets) BuildRequires: cmake(Qt6Concurrent) BuildRequires: cmake(Qt6Qml) BuildRequires: cmake(Qt6LinguistTools) # Networking (libssh is REQUIRED; CURL is optional but requested by upstream) BuildRequires: libssh-devel BuildRequires: libcurl-devel # FFTW3 — used by the Greedy registration submodule BuildRequires: fftw-devel # OpenGL / X11 BuildRequires: mesa-libGL-devel BuildRequires: libX11-devel # VTK transitive dependencies: VTK's cmake config propagates these as required # link targets (nlohmann_json::nlohmann_json, Freetype::Freetype, JsonCpp::JsonCpp, # etc.) so they must be present in any chroot that builds against vtk-devel. BuildRequires: json-devel BuildRequires: freetype-devel BuildRequires: jsoncpp-devel BuildRequires: utf8cpp-devel BuildRequires: PEGTL-devel BuildRequires: lz4-devel BuildRequires: double-conversion-devel Requires: hicolor-icon-theme # Pin the exact VTK ABI this package was built against. VTK freezes its soname at # libvtk*.so.1 across all of 9.x, so rpm cannot tell 9.5 from 9.6 from 9.7: a consumer # built against one installs cleanly against another and fails at LOAD with undefined # symbols. A >= floor does not help -- 9.7.0 satisfies >= 9.6.2 -- so this is an exact # match. %%vtk_abi comes from vtk-devel's macros.vtk, so it re-pins on every rebuild. # # The missing-macro check lives in %%build, deliberately, NOT at parse time. A # parse-time %%error cannot distinguish "COPR is generating the SRPM" from "this is a # real buildroot": rpkg srpm parses the spec with no buildroot and therefore no # vtk-devel, so a parse-time guard killed every SCM build of every guarded package # before any chroot existed (python-simpleitk 10980296 failed in 0 minutes with # "can't parse specfile"). Expanding to UNSET keeps the SRPM parse alive, and the # %%build test still fails loudly in a buildroot lacking vtk-devel, so no RPM carrying # the placeholder can ever be produced. Requires: vtk(abi) = %{?vtk_abi}%{!?vtk_abi:UNSET} # Pin the ITK this was BUILT against. ITK freezes its sonames across releases # while ADDING symbols: libITKFFT-5.4.so.1 is identical in name in 5.4.7-2 and # 5.4.7-8, but -8 enabled FFTW and exports a registration symbol -2 lacks. rpm # derives dependencies from sonames, so without this floor itksnap installs # cleanly over an older ITK and dies at exit 127. Measured on this package: 1 of # its 3 shipped ELF objects references # _ZN3itk46FFTWFFTImageFilterInitFactoryRegister__PrivateEv -- it is the shared # library, not the executable, which is why an executables-only scan cleared it. # # A floor, not an equality: the breakage is additive, so a newer ITK is fine. # # The two-part %%{?itk_ver}%%{!?itk_ver:UNSET} shape is required, not stylistic. # ">= UNSET" is SATISFIED -- rpm ranks a numeric segment above an alphabetic one # -- so an undefined macro makes this floor vacuous, which the %%build guard # below catches. And it must be this expansion rather than a parse-time %%global # check: a parse-time guard once killed every SCM build before a chroot existed # (python-simpleitk 10980296, "can't parse specfile", 0 minutes). Requires: InsightToolkit5%{?_isa} >= %{?itk_ver}%{!?itk_ver:UNSET} BuildRequires: dcmtk-devel # Pin the exact DCMTK snapshot this package was built against. dcmtk is packaged from git # HEAD and upstream's DCMTK_ABI_VERSION stays 20 across snapshots, so every snapshot installs # libdcm*.so.20 and rpm cannot tell them apart: a consumer built against one installs cleanly # against another and fails at load with undefined symbols (dcmqi on f45, with OverlapUtil). # %%dcmtk_abi comes from dcmtk-devel's macros.dcmtk, so it re-pins on every rebuild. The # missing-macro check is in %%build, not at parse time, for the reason spelled out at the vtk # pin in 3dslicer.spec: an SRPM parse has no buildroot. Requires: dcmtk(abi) = %{?dcmtk_abi}%{!?dcmtk_abi:UNSET} %description ITK-SNAP is a software application used to segment structures in 3D and 4D biomedical images such as MRI, CT, and PET scans. It provides: * Semi-automatic segmentation using active contour methods * AI-assisted segmentation (nnInteractive: point, scribble, lasso modes) * Manual delineation and label editing tools * High-performance OpenGL2-based 2D slice rendering * External 3D/4D mesh visualization This package also includes the Convert3D (c3d) command-line image conversion tool and the Greedy diffeomorphic image registration tool, both of which are built as subprojects alongside ITK-SNAP. %prep # Tarball expands to itksnap-%%{snap_ver} (with hyphen, e.g. # itksnap-4.4.0-beta2). The %%{itksnap_commit} macro was removed in an # earlier cleanup; restore use of %%{snap_ver}. %autosetup -p1 -n itksnap-%{snap_ver} # Populate git submodule directories from the pinned tarballs. # The upstream CMakeLists hard-codes ADD_SUBDIRECTORY into Submodules/{c3d,greedy}; # both directories must exist and contain the unpacked source. tar -xf %{SOURCE1} -C Submodules/c3d --strip-components=1 tar -xf %{SOURCE2} -C Submodules/greedy --strip-components=1 tar -xf %{SOURCE3} -C Submodules/digestible --strip-components=1 # ITK_LEGACY_REMOVE in the c3d SUBMODULE. Patch2 above covers ITK-SNAP's own # tree; it deliberately excludes Submodules/c3d, which does not exist until the # tarball above is unpacked and so cannot be reached by a Patch at all. # # itksnap pins the SAME c3d commit as itksnap-alpha (d4d96362), and alpha is # green on six chroots with exactly these blocks, so they are taken from it # VERBATIM -- which in turn keeps them identical to c3d.spec's %%prep. One # upstream source, one recognisable fix, in three packages. Change one, change # the others. # # Note c3d.spec pins a DIFFERENT commit (16ea1366). The blocks happen to suit # both, but that is not guaranteed by anything, which is why each one asserts # its own precondition and checks for zero residual rather than assuming. cd Submodules/c3d # 1. A call to a method ITK no longer declares. ITK's own header says "the # implementation of this method is now empty", so deleting the call is # correct rather than expedient. grep -q 'ResetFilterProgressAndKeepAccumulatedProgress' \ itkextras/itkMultiScaleHessianBasedMeasureImageFilter.hxx \ || { echo "ERROR: the legacy ITK call is gone -- drop this block" >&2; exit 1; } sed -i '/progress->ResetFilterProgressAndKeepAccumulatedProgress();/d' \ itkextras/itkMultiScaleHessianBasedMeasureImageFilter.hxx ! grep -rq 'ResetFilterProgressAndKeepAccumulatedProgress' . \ || { echo "ERROR: a call to the removed ITK method survives:" >&2 grep -rn 'ResetFilterProgressAndKeepAccumulatedProgress' . >&2; exit 1; } # 2. itk::SpatialOrientation is a compatibility namespace of `using` aliases # living entirely inside #ifndef ITK_LEGACY_REMOVE, so the name does not # exist and PrintImageInfo.cxx:52 fails to compile. The ORIENTATION_ rewrite # must run FIRST or the general form would swallow it. grep -rq 'SpatialOrientation::ITK_COORDINATE_ORIENTATION_' . \ || { echo "ERROR: the legacy SpatialOrientation aliases are gone -- drop this block" >&2; exit 1; } grep -rl 'SpatialOrientation' --include=*.cxx --include=*.h --include=*.hxx . \ | xargs sed -i \ -e 's/SpatialOrientation::ITK_COORDINATE_ORIENTATION_/SpatialOrientationEnums::ValidCoordinateOrientations::ITK_COORDINATE_ORIENTATION_/g' \ -e 's/SpatialOrientation::ValidCoordinateOrientationFlags/SpatialOrientationEnums::ValidCoordinateOrientations/g' if grep -ro 'SpatialOrientation::[A-Za-z_]*' . | grep -v SpatialOrientationEnums | grep -q .; then echo "ERROR: legacy SpatialOrientation references survive:" >&2 grep -rno 'SpatialOrientation::[A-Za-z_]*' . | grep -v SpatialOrientationEnums >&2 exit 1 fi # 3. SwapDimensions.cxx resists the rewrite above: it pulls the whole legacy # namespace in with a using-directive and names the enumerators bare. # `using namespace` cannot work against the replacement, because # SpatialOrientationEnums is a CLASS, not a namespace, and the enumerators # now live in an `enum class` so each must be qualified. grep -q '^using namespace itk::SpatialOrientation;$' adapters/SwapDimensions.cxx \ || { echo "ERROR: the using-directive is gone -- drop this block" >&2; exit 1; } sed -i \ -e 's|^using namespace itk::SpatialOrientation;$|using ValidCoordinateOrientationFlags = itk::SpatialOrientationEnums::ValidCoordinateOrientations;|' \ -e 's/\([^:A-Za-z0-9_]\)ITK_COORDINATE_ORIENTATION_/\1ValidCoordinateOrientationFlags::ITK_COORDINATE_ORIENTATION_/g' \ -e 's/^ITK_COORDINATE_ORIENTATION_/ValidCoordinateOrientationFlags::ITK_COORDINATE_ORIENTATION_/' \ adapters/SwapDimensions.cxx if grep -qE '(^|[^:A-Za-z0-9_])ITK_COORDINATE_ORIENTATION_' adapters/SwapDimensions.cxx; then echo "ERROR: unqualified ITK_COORDINATE_ORIENTATION_ enumerators survive:" >&2 grep -nE '(^|[^:A-Za-z0-9_])ITK_COORDINATE_ORIENTATION_' adapters/SwapDimensions.cxx >&2 exit 1 fi cd ../.. # get_git_commit_date() fails when building from a tarball (SNAP_VERSION_GIT_BRANCH # is empty, making the call have only 1 argument instead of 2). Set timestamp directly. sed -i 's|get_git_commit_date.*SNAP_VERSION_GIT_TIMESTAMP.*|set(SNAP_VERSION_GIT_TIMESTAMP "")|' CMakeLists.txt # GCC 15 stopped re-exporting std::cout into the global namespace via the # usual cstdlib chain; SynchronizationModel.cxx uses bare `cout <<` in 14 # places and hits "error: 'cout' was not declared in this scope". Upstream # fixed this in master (4.6.0-alpha adds `using std::cout;` near the top of # the file); back-port the same change here. Add an explicit # include alongside in case the existing transitive chain stops providing # std::cout later -- belt and suspenders. sed -i '1i #include \nusing std::cout;' GUI/Model/SynchronizationModel.cxx %build # dcmtk_abi comes from dcmtk-devel's macros.dcmtk. Absent means the buildroot has a dcmtk-devel # that predates the snapshot, and the Requires above would carry the UNSET placeholder. test -n "%{?dcmtk_abi}" || { echo "ERROR: dcmtk_abi undefined - needs the dcmtk-devel that ships macros.dcmtk" >&2; exit 1; } # vtk_abi comes from vtk-devel's macros.vtk. Absent means BuildRequires: vtk-devel is # missing, and the Requires above would ship as the vacuous "vtk(abi) = UNSET". test -n "%{?vtk_abi}" || { echo "ERROR: vtk_abi undefined - add 'BuildRequires: vtk-devel'" >&2; exit 1; } test -n "%{?itk_ver}" || { echo "ERROR: itk_ver undefined - add 'BuildRequires: InsightToolkit5-devel'" >&2; exit 1; } # C++17 is required; -include cstdint guards against GCC 15 missing-header errors # seen in ITK-internal headers on Fedora 43+. export CXXFLAGS="%{optflags} -std=c++17 -include cstdint -include iostream" # The bundled jsoncpp 0.10.6 is gone (SNAP_USE_SYSTEM_JSONCPP=ON), so the # -Wl,--exclude-libs,ALL workaround that kept its ~567 symbols out of .dynsym -- # where they interposed the system libjsoncpp.so.26 and segfaulted before main() # -- is no longer needed. There is only one jsoncpp in the process now. %cmake -GNinja \ -DCMAKE_BUILD_TYPE=Release \ \ -DITK_DIR=%{_prefix}/lib/cmake/ITK-5.4 \ \ -DBUILD_SHARED_LIBS=OFF \ -DSNAP_USE_GPU=OFF \ -DSNAP_USE_OSMESA=OFF \ -DSNAP_USE_IWYU=OFF \ -DSNAP_USE_SYSTEM_JSONCPP=ON \ \ -DCMAKE_SKIP_INSTALL_RPATH=ON %cmake_build %install %cmake_install # qt.conf is written by qt_generate_deploy_app_script(); not needed for a # system-installed Qt application where plugins are found via standard paths. rm -f %{buildroot}%{_bindir}/qt.conf # Drop the bundled Convert3D / Greedy CLIs. They are file-path identical to # Fedora's standalone c3d and greedy packages and rpm refuses to install # both. The bundled copies are the same upstream as the standalone packages # (same pinned commits in the itksnap submodules), so ship them via the # standalone packages and let itksnap be GUI + itksnap-wt only. rm %{buildroot}%{_bindir}/c2d rm %{buildroot}%{_bindir}/c3d rm %{buildroot}%{_bindir}/c3d_affine_tool rm %{buildroot}%{_bindir}/c4d rm %{buildroot}%{_bindir}/greedy rm %{buildroot}%{_bindir}/greedy_propagation rm %{buildroot}%{_bindir}/greedy_template_average rm %{buildroot}%{_bindir}/multi_chunk_greedy %files %license COPYING # Main application — the forwarding wrapper and the real binary. # Upstream installs the real binary under snap-${VERSION}/ which includes # the -beta2 suffix; use %%{snap_ver} to track the version cleanly. %{_bindir}/itksnap %{_prefix}/lib/snap-%{snap_ver}/ITK-SNAP # Workspace tool (CLI for managing ITK-SNAP workspaces) %{_bindir}/itksnap-wt # NOTE: bundled Convert3D (c2d/c3d/c3d_affine_tool/c4d) and Greedy # (greedy/greedy_propagation/greedy_template_average/multi_chunk_greedy) # CLI binaries are dropped in %%install to allow co-installation with the # standalone c3d and greedy packages. Users wanting those CLIs should # `dnf install c3d greedy` — same upstream commits as itksnap submodules. %changelog * Mon Oct 05 2026 Morgan Hough - 4.4.0~beta2-0.21 - Restore the SpatialOrientation rewrite for the c3d SUBMODULE. -0.19 dropped it on the grounds that Patch2 now covers that construct -- but Patch2 covers ITK-SNAP's OWN tree only and deliberately excludes Submodules/c3d, which does not exist until %%prep unpacks Source1 and so cannot be reached by a Patch at all. -0.20 therefore failed on Submodules/c3d/adapters/PrintImageInfo.cxx:52, "itk::SpatialOrientation has not been declared", with the error at :250 a cascade of it: once the parameter type fails to parse, get_rai_code is read as a std::string variable rather than a function. - Replaced my hand-rolled path-prefixed blocks with itksnap-alpha's section taken VERBATIM -- `cd Submodules/c3d` and then c3d.spec's three blocks unchanged. itksnap pins the same c3d commit as itksnap-alpha (d4d96362) and alpha is green on six chroots with exactly these, so this is a proven configuration rather than a re-derivation. It also keeps one upstream source to one recognisable fix across three specs. - c3d.spec itself pins a DIFFERENT commit (16ea1366). The blocks suit both, but nothing guarantees that, which is why each asserts its own precondition and checks for zero residual instead of assuming. - The excision this time asserts on its CONTENTS, not just its endpoints: it refuses to run if the span being removed also contains get_git_commit_date, SynchronizationModel.cxx, %%autosetup or a tar line. That is the -0.19 mistake encoded so it cannot recur. * Mon Oct 05 2026 Morgan Hough - 4.4.0~beta2-0.20 - Restore two %%prep fixes -0.19 deleted by accident: the get_git_commit_date workaround and the /using std::cout back-port for SynchronizationModel.cxx. Neither has anything to do with ITK. - Cause worth recording. -0.19 removed the sed blocks the new patch replaced, by line range. I asserted that the first and last lines of the range were what I expected -- and they were -- but not that the range contained ONLY those blocks. It also held these two unrelated fixes, so the build failed at CMake configure with "get_git_commit_date Function invoked with incorrect arguments", a regression with no relationship to the change being made. Checking the ENDS of an excision is not checking its CONTENTS. * Mon Oct 05 2026 Morgan Hough - 4.4.0~beta2-0.19 - Stop fixing ITK_LEGACY_REMOVE one construct per build. -0.17 fixed three, -0.18 fixed a fourth (itkEventMacro), and the build then reached a fifth: the ImageIO enum aliases. Two builds spent discovering layers is enough. - itksnap-alpha had already solved all of them against 4.6.0~alpha0 and is green on all six chroots, so reuse its patch rather than hand-port construct by construct. Applied with fuzz to this tarball, which left one reject (mechanical itkEventMacro renames in SNAPEvents.h), resolved it, re-diffed against a pristine 4.4.0~beta2 tree, and verified ZERO failed hunks as a positive control before committing. - A patch, not sed, and the ImageIO aliases are the reason: those enumerators appear bare in assignments and `case` labels, where a global substitution would hit unrelated identifiers. - Spec net effect: the sed blocks for itksnap's own tree are gone (the patch does that work); the two blocks acting on the c3d SUBMODULE stay, since the patch excludes it -- the same split itksnap-alpha uses. * Mon Oct 05 2026 Morgan Hough - 4.4.0~beta2-0.18 - Fourth ITK_LEGACY_REMOVE construct, exposed once -0.17 got past the first three: itkEventMacro, which lives inside #if !defined(ITK_LEGACY_REMOVE) at itkEventObject.h:156. - Renaming the macro is NOT the fix. ITK's replacement is a split -- itkEventMacroDeclaration in a header, itkEventMacroDefinition in a .cxx -- so a rename would drop the definition and fail at link, and ITK-SNAP's nested event classes cannot be expressed by that pair unchanged. Adopt itksnap-alpha's solution instead: an application-owned snapEventMacro that keeps the methods inline, which is what itkEventMacro did. Same spelling and same header content as itksnap-alpha-itk-events-orientation.patch, so the two packages stay one recognisable fix. - 15 files use it, the same 15 the alpha patch touches -- checked against this tarball rather than assumed, since the versions differ (4.4.0~beta2 here, 4.6.0~alpha0 there). Each already has an #include before its first macro use. - Added a guard against a mistake itksnap-alpha's -8 changelog records making: a SpatialOrientation sweep anchored on the qualified form missed three files naming the enumerators bare and shipped a partial fix. %%prep now fails if any bare ITK_COORDINATE_ORIENTATION_ survives outside the one file block 3 handles. * Mon Oct 05 2026 Morgan Hough - 4.4.0~beta2-0.17 - Port c3d.spec's three ITK_LEGACY_REMOVE fixes. -0.16 failed on all seven chroots at Submodules/c3d/itkextras/itkMultiScaleHessianBasedMeasureImageFilter.hxx:230, "ProgressAccumulator has no member ResetFilterProgressAndKeepAccumulatedProgress". - Swept the whole tree for the known legacy constructs rather than fixing the one the compiler named, because legacy removal fails one layer at a time: 3dslicer-spharm-pdm took three releases that way, each %%prep fix revealing the next. itksnap's own tree carries 102 SpatialOrientation uses and the c3d submodule 53 more, so that rewrite is tree-wide; the using-directive case is c3d's SwapDimensions.cxx alone; greedy and digestible are clean. - NOT touched, deliberately: c3d's itkextras/ declares its own `virtual void ComputeBoundingBox()` on two interpolator classes. That is c3d's own method, not ITK SpatialObject's removed shim, and rewriting it would break correct code. A name alone does not identify a legacy casualty. - Note the sibling ResetProgress() is ALSO legacy, so "fix" by substituting it would be a regression. ITK's header says the removed method's implementation is now empty, so deleting the call is behaviour-preserving. * Mon Oct 05 2026 Morgan Hough - 4.4.0~beta2-0.16 - Pin the exact DCMTK snapshot: Requires: dcmtk(abi) = %%{dcmtk_abi}, from dcmtk-devel's macros.dcmtk, plus a %%build guard against the UNSET placeholder. dcmtk is now packaged from git HEAD (policy in dcmtk.spec) and upstream's DCMTK_ABI_VERSION stays 20 across snapshots, so rpm cannot tell snapshots apart by soname. Without a rebuild against the snapshot this package would install cleanly and fail at load. * Thu Sep 24 2026 Morgan Hough - 4.4.0~beta2-0.15 - Pin the ITK built against: Requires InsightToolkit5 >= %%itk_ver, from InsightToolkit5-devel's macros.itk, with a %%build guard. - Without it itksnap installs over an older ITK and dies at 127. ITK freezes libITKFFT-5.4.so.1 across 5.4.7-2 and -8 while -8 adds the FFTW registration symbol, so rpm cannot tell them apart. Measured per shipped object: 1 of itksnap's 3 ELF objects needs that symbol -- and it is the shared library, not the executable, which is why my first executables-only scan wrongly cleared this package. - Floor not equality: the breakage is additive, so a newer ITK is always fine. * Sat Sep 19 2026 Morgan Hough - 4.4.0~beta2-0.14 - Rebuild against InsightToolkit5 5.4.7-8, which unbundles Eigen3, VXL and double-conversion. No source or spec change; the Release bump is what makes the rebuild reach anyone. COPR adds a sibling at an already-published NVR rather than replacing it, and dnf then serves the older copy -- so a rebuild at the same NVR would leave this package linked against the bundled ITK while appearing to succeed. - Validated against -8 in mhough/neurofedora-itk5-test before this bump. * Fri Aug 28 2026 Morgan Hough - 4.4.0~beta2-0.12 - Build against the system jsoncpp (SNAP_USE_SYSTEM_JSONCPP=ON) via a new upstream-shaped CMake option, and drop the -Wl,--exclude-libs,ALL workaround it makes unnecessary. ITK-SNAP bundled jsoncpp 0.10.6 while VTK pulls in the system 1.9.6, so both lived in one process and the bundled symbols interposed the shared ones. Only one copy now. - The API used is small and stable across both -- Json::Value, Json::Reader, Json::arrayValue, Json::objectValue in three files -- and the include spelling "json/json.h" is identical, so no source changes were needed. * Sun Aug 23 2026 Morgan Hough - 4.4.0~beta2-0.11 - Rebuild against VTK 9.7.0. VTK here installs unversioned sonames (libvtk*.so.1), so 9.7 replaces 9.6 in place and every consumer must be rebuilt or it fails at runtime with undefined symbols. - Add itksnap-vtk97-addviewprop.patch: VTK 9.7 removed vtkViewport::AddActor2D; switch the four call sites to AddViewProp, which it aliased. %setup -> %%autosetup -p1 so the patch is applied. * Sun May 31 2026 Morgan Hough - 4.4.0~beta2-0.12 - Add cli11-devel BR. VTK -7+ enabled VTK_MODULE_ENABLE_VTK_cli11 to satisfy paraview 6.1.1's plugin scan; the resulting VTK cmake config now does find_package(CLI11) when downstream consumers call find_package(VTK), but vtk-devel does not yet Require cli11-devel (transitive-BR hardening still pending). Surfaced by COPR build 10528844. * Sun May 31 2026 Morgan Hough - 4.4.0~beta2-0.11 - Rebuild against current VTK 9.6.2-10. The -0.10 build was linked against an older VTK whose vtkAlgorithm::SetInputArrayToProcess(int,int,int,int, const char*, int) overload was removed upstream; legion install fails at GUI startup with "symbol lookup error: undefined symbol _ZN12vtkAlgorithm22SetInputArrayToProcessEiiiiPKci". Caught by the neurofedora-tests bats GUI smoke phase on the fedora-legion-nvidia host ([[neurofedora-tests-harness]]). * Mon May 25 2026 Morgan Hough - 4.4.0~beta2-0.10 - Add -include iostream to CXXFLAGS — GUI/Model/SynchronizationModel.cxx uses bare cout. GCC 16 no longer pulls iostream in implicitly. * Sun May 24 2026 Morgan Hough - 4.4.0~beta2-0.9 - Back-port the GCC 15 `cout` qualification fix from upstream master: add `using std::cout;` (and explicit ``) to GUI/Model/SynchronizationModel.cxx. Without this, builds on F44 fail with 14 sites of "error: 'cout' was not declared in this scope" — GCC 15 stopped re-exporting std::cout via the cstdlib chain. COPR build 10506555 hit this on -0.8; -0.9 should clear it. * Sat May 23 2026 Morgan Hough - 4.4.0~beta2-0.8 - Drop bundled Convert3D and Greedy CLI binaries (c2d/c3d/c3d_affine_tool/ c4d and greedy/greedy_propagation/greedy_template_average/multi_chunk_greedy) so itksnap can be co-installed with Fedora's standalone c3d and greedy packages. Without this, an `dnf install itksnap c3d greedy` transaction fails with file conflicts on /usr/bin/{c3d,greedy,...}. The bundled copies are the same upstream commits as the standalone packages (pinned via the itksnap-public submodule SHAs), so nothing is lost. - Matches the existing drop in itksnap-alpha.spec. * Thu May 21 2026 Morgan Hough - 4.4.0~beta2-0.7 - Fix the startup SIGSEGV in libjsoncpp.so.26's static initializer. Real cause (the -0.6 ITK-5.4.6 rebuild did not address it): ITK-SNAP bundles jsoncpp 0.10.6 in static libitksnaplogic.a, which re-exports jsoncpp symbols from the ITK-SNAP executable and interposes the system libjsoncpp.so.26 (1.9.6) pulled in by VTK. Link with -Wl,--exclude-libs,ALL so static-archive symbols stay out of the executable's dynamic symbol table and the two jsoncpp copies no longer collide. * Wed May 20 2026 Morgan Hough - 4.4.0~beta2-0.6 - Rebuild against InsightToolkit5 5.4.6 (the -0.5 RPM was built against 5.4.5 on 2026-05-02 and segfaults at startup against a system with ITK 5.4.6 installed: libjsoncpp.so.26's static initializer crashes during dl_init for the ITK-SNAP binary, presumably due to ABI drift in a VTK/ITK transitive that pulled in jsoncpp differently between the build chroot then and the user system now). - Bump InsightToolkit5-devel BR to >= 5.4.6. * Mon May 04 2026 Morgan Hough - 4.4.0-1 - Update to stable 4.4.0 release (September 9, 2025) * Sun Mar 01 2026 Morgan Hough - 4.4.0~beta2-0.5 - Remove qt.conf from /usr/bin (Qt deploy artifact, not needed for system install) * Sun Mar 01 2026 Morgan Hough - 4.4.0~beta2-0.4 - Fix file list: add itksnap-wt, greedy_template_average, multi_chunk_greedy, greedy_propagation; add forwarding binary at /usr/lib/snap-*/ITK-SNAP and qt.conf; remove nonexistent /usr/share/itksnap directory * Fri Feb 27 2026 Morgan Hough - 4.4.0~beta2-0.3 - Add VTK transitive BuildRequires: json-devel, freetype-devel, jsoncpp-devel, utf8cpp-devel, PEGTL-devel, lz4-devel, double-conversion-devel; VTK cmake config propagates these as required link targets into downstream builds * Fri Feb 27 2026 Morgan Hough - 4.4.0~beta2-0.2 - Patch CMakeLists.txt in prep: replace get_git_commit_date() with set() to avoid CMake error when building from a tarball with no git history * Wed Feb 25 2026 Morgan Hough - 4.4.0~beta2-0.1 - Initial spec for ITK-SNAP 4.4.0-beta2 - Bundles c3d and greedy as CMake subprojects per upstream design - Requires VTK >= 9.3.1 and ITK 5.4 from mhough/neurofedora COPR