From 9ca4de7ce6a389986c4b1028d9c84fcb927f5c7d Mon Sep 17 00:00:00 2001 From: Mahmoud Komaiha Date: Mon, 31 Aug 2026 13:00:55 -0400 Subject: [PATCH 1/4] COMP: Enforce CMake 3.5 min for VTK build for CMake 4 support CMake 4 requires cmake_minimum_required to support policies that are 3.5 or newer. VTK 9.1 vendors a KWSys whose minimum predates that, so configuring VTK with CMake 4 fails: CMake Error at Utilities/KWSys/vtksys/CMakeLists.txt:91: Compatibility with CMake < 3.5 has been removed from CMake. Same treatment already applied to tesseract and aruco. --- SuperBuild/External_VTK.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/SuperBuild/External_VTK.cmake b/SuperBuild/External_VTK.cmake index b70b2f627..8b2521f85 100644 --- a/SuperBuild/External_VTK.cmake +++ b/SuperBuild/External_VTK.cmake @@ -131,6 +131,7 @@ ELSE() #--Configure step------------- CMAKE_ARGS ${ep_common_args} + -DCMAKE_POLICY_VERSION_MINIMUM=3.5 ${ep_qt_args} ${VTK_VERSION_SPECIFIC_ARGS} -DCMAKE_INSTALL_PREFIX:PATH=${PLUS_VTK_INSTALL_DIR} From 8c378728fa3e82030ac48b5aa008d22b894ae14c Mon Sep 17 00:00:00 2001 From: Mahmoud Komaiha Date: Mon, 31 Aug 2026 13:01:13 -0400 Subject: [PATCH 2/4] BUG: Forward CMAKE__FLAGS to the external projects ep_common_c_flags and ep_common_cxx_flags were built from CMAKE__FLAGS_INIT, which only holds the toolchain defaults. Flags passed on the command line land in CMAKE__FLAGS and were dropped, so every external project was built in a different configuration than the superbuild was asked for, with no diagnostic. External_ITK.cmake had the same defect from the other direction: itk_common_cxx_flags was assigned from ep_common_cxx_flags only under UNIX AND NOT APPLE, so macOS builds passed no CXX flags at all, and the MSVC branch appended /MP to a variable that was never set. Initialize it on every platform and append the platform extras. --- CMakeLists.txt | 4 ++-- SuperBuild/External_ITK.cmake | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 09dd5ee71..f6a84d4a9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -423,8 +423,8 @@ IF(NOT MSVC) LIST(APPEND ep_common_args -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}) ENDIF() -SET(ep_common_c_flags "${CMAKE_C_FLAGS_INIT} ${ADDITIONAL_C_FLAGS}") -SET(ep_common_cxx_flags "${CMAKE_CXX_FLAGS_INIT} ${ADDITIONAL_CXX_FLAGS}") +SET(ep_common_c_flags "${CMAKE_C_FLAGS_INIT} ${CMAKE_C_FLAGS} ${ADDITIONAL_C_FLAGS}") +SET(ep_common_cxx_flags "${CMAKE_CXX_FLAGS_INIT} ${CMAKE_CXX_FLAGS} ${ADDITIONAL_CXX_FLAGS}") # Compute -G arg for configuring external projects with the same CMake generator: IF(CMAKE_EXTRA_GENERATOR) diff --git a/SuperBuild/External_ITK.cmake b/SuperBuild/External_ITK.cmake index aa5c40988..53e13cba7 100644 --- a/SuperBuild/External_ITK.cmake +++ b/SuperBuild/External_ITK.cmake @@ -35,9 +35,9 @@ ELSE() LIST(APPEND PLUS_ITK_OPTIONAL_ARGS -DITK_USE_SYSTEM_PNG:BOOL=ON) ENDIF() + SET(itk_common_cxx_flags "${ep_common_cxx_flags}") IF(UNIX AND NOT APPLE) - - SET(itk_common_cxx_flags "${ep_common_cxx_flags} -std=c++${CMAKE_CXX_STANDARD}") + SET(itk_common_cxx_flags "${itk_common_cxx_flags} -std=c++${CMAKE_CXX_STANDARD}") ELSEIF(MSVC) SET(itk_common_cxx_flags "${itk_common_cxx_flags} /MP ") ENDIF() From 3fbaa382af5c7a406ba96cc972c0bee83c325968 Mon Sep 17 00:00:00 2001 From: Mahmoud Komaiha Date: Mon, 31 Aug 2026 13:01:30 -0400 Subject: [PATCH 3/4] BUG: Resolve the ITK version before ep_common_args is built ep_common_args captures CMAKE_CXX_STANDARD, but the block that raises it to 17 for ITK 5 ran afterwards, so the external projects were handed the pre-bump value. On a clean single-pass configure that means ITK 5.4 is given CMAKE_CXX_STANDARD=14 and rejects it outright: CMake Error at CMakeLists.txt:39 (message): C++98 to C++14 are no longer supported in ITK version 5.4 and greater Reconfiguring masked it, since the second pass read the bumped value back from the cache. Move the ITK version and standard resolution above ep_common_args; it depends only on PLUS_USE_STEALTHLINK and MSVC, both known by that point. --- CMakeLists.txt | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f6a84d4a9..7eef6c9b3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -411,6 +411,26 @@ ENDIF() #----------------------------------------------------------------------------- INCLUDE(${CMAKE_ROOT}/Modules/ExternalProject.cmake) +# The ITK version sets the minimum C++ standard, so resolve it before ep_common_args below +SET(PLUS_ITK_VERSION 5 CACHE STRING "Set version of ITK to use.") +MARK_AS_ADVANCED(PLUS_ITK_VERSION) +set_property(CACHE PLUS_ITK_VERSION PROPERTY STRINGS "5" "4") +IF(PLUS_USE_STEALTHLINK AND PLUS_ITK_VERSION VERSION_GREATER "4") + MESSAGE("The StealthLink device only supports up to Visual Studio 2013, therefore it must use ITK 4. Changing ITK version to 4.") + SET(PLUS_ITK_VERSION 4 CACHE STRING "Set version of ITK to use." FORCE) +ELSEIF(NOT PLUS_USE_STEALTHLINK AND PLUS_ITK_VERSION MATCHES "4") + MESSAGE("Only the StealthLink device is still supported to use ITK 4. Changing ITK version to 5.") + SET(PLUS_ITK_VERSION 5 CACHE STRING "Set version of ITK to use." FORCE) +ENDIF() + +IF (PLUS_ITK_VERSION GREATER_EQUAL 5) + SET(_minimum_cxx_standard "17") + IF("${CMAKE_CXX_STANDARD}" LESS "${_minimum_cxx_standard}") + MESSAGE("The C++17 standard is required for ITK 5.4.2, updating CMAKE_CXX_STANDARD to 17") + SET(CMAKE_CXX_STANDARD "${_minimum_cxx_standard}" CACHE STRING "C++ standard" FORCE) + ENDIF() +ENDIF() + SET(ep_base "${CMAKE_BINARY_DIR}") SET(ep_common_args -DCMAKE_CXX_STANDARD:STRING=${CMAKE_CXX_STANDARD} -DCMAKE_CXX_STANDARD_REQUIRED:BOOL=${CMAKE_CXX_STANDARD_REQUIRED}) @@ -489,25 +509,6 @@ ENDIF() INCLUDE(SuperBuild/External_VTK.cmake) -SET(PLUS_ITK_VERSION 5 CACHE STRING "Set version of ITK to use.") -MARK_AS_ADVANCED(PLUS_ITK_VERSION) -set_property(CACHE PLUS_ITK_VERSION PROPERTY STRINGS "5" "4") -IF(PLUS_USE_STEALTHLINK AND PLUS_ITK_VERSION VERSION_GREATER "4") - MESSAGE("The StealthLink device only supports up to Visual Studio 2013, therefore it must use ITK 4. Changing ITK version to 4.") - SET(PLUS_ITK_VERSION 4 CACHE STRING "Set version of ITK to use." FORCE) -ELSEIF(NOT PLUS_USE_STEALTHLINK AND PLUS_ITK_VERSION MATCHES "4") - MESSAGE("Only the StealthLink device is still supported to use ITK 4. Changing ITK version to 5.") - SET(PLUS_ITK_VERSION 5 CACHE STRING "Set version of ITK to use." FORCE) -ENDIF() - -IF (PLUS_ITK_VERSION GREATER_EQUAL 5) - SET(_minimum_cxx_standard "17") - IF("${CMAKE_CXX_STANDARD}" LESS "${_minimum_cxx_standard}") - MESSAGE("The C++17 standard is required for ITK 5.4.2, updating CMAKE_CXX_STANDARD to 17") - SET(CMAKE_CXX_STANDARD "${_minimum_cxx_standard}" CACHE STRING "C++ standard" FORCE) - ENDIF() -ENDIF() - INCLUDE(SuperBuild/External_ITK.cmake) IF(PLUSBUILD_USE_OpenIGTLink) From 5b06714b094adc9b6480fabe667f710bb9af31bd Mon Sep 17 00:00:00 2001 From: Mahmoud Komaiha Date: Mon, 31 Aug 2026 13:01:47 -0400 Subject: [PATCH 4/4] ENH: Support building StealthLink on Linux The Linux StealthLink SDK is built against the pre-GCC5 libstdc++ ABI, so everything that exchanges std::string with it has to agree. That is not just PlusLib but VTK, ITK, IGSIO and OpenIGTLink as well, and getting it right for each subproject was left to the user via a warning. Set -D_GLIBCXX_USE_CXX11_ABI=0 once, before ep_common_cxx_flags is built, so the whole superbuild is consistent, and drop the warning. Pin ITK 4 only under MSVC. That requirement comes from StealthLink being limited to the Visual Studio 2013 runtime; on Linux the constraint is the libstdc++ ABI, now handled above. Forcing ITK 4 there is harmful, since ITK 4.12 vendors a 2017-era VXL whose compiler check stops at GCC 7: vcl_compiler.h:90:4: error: #error "Dunno about this gcc" Forward STEALTHLINK_STEALTHLINK_SHARED_LIBRARY on every platform, not only Windows, since PlusLib now links it on Linux. Fail with a clear message when PLUS_USE_STEALTHLINK is enabled on macOS. The SDK ships only Windows and Linux binaries, and FindSTEALTHLINK previously fell through both platform branches and reported the SDK as missing instead. --- CMakeLists.txt | 21 +++++++++++++++------ Modules/FindSTEALTHLINK.cmake | 4 +++- SuperBuild/External_PlusLib.cmake | 2 +- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7eef6c9b3..a57f4104e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -367,6 +367,19 @@ if(MSVC) endif() endif() +IF(PLUS_USE_STEALTHLINK) + IF(APPLE) + MESSAGE(FATAL_ERROR "The StealthLink SDK is only distributed for Windows and Linux, so PLUS_USE_STEALTHLINK cannot be enabled on macOS.") + ELSEIF(UNIX) + # The Linux StealthLink SDK requires the old libstdc++ ABI + IF(NOT CMAKE_CXX_FLAGS MATCHES "_GLIBCXX_USE_CXX11_ABI") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_GLIBCXX_USE_CXX11_ABI=0" + CACHE STRING "Flags used by the CXX compiler during all build types." FORCE) + MESSAGE(STATUS "StealthLink: added -D_GLIBCXX_USE_CXX11_ABI=0 to CMAKE_CXX_FLAGS for the whole superbuild.") + ENDIF() + ENDIF() +ENDIF() + IF(PLUS_USE_Ascension3DG AND PLUS_USE_Ascension3DGm) MESSAGE(FATAL_ERROR "PLUS_USE_Ascension3DG and PLUS_USE_Ascension3DGm options cannot be enabled at the same time. See more details at https://www.assembla.com/spaces/plus/tickets/851") ENDIF() @@ -415,10 +428,10 @@ INCLUDE(${CMAKE_ROOT}/Modules/ExternalProject.cmake) SET(PLUS_ITK_VERSION 5 CACHE STRING "Set version of ITK to use.") MARK_AS_ADVANCED(PLUS_ITK_VERSION) set_property(CACHE PLUS_ITK_VERSION PROPERTY STRINGS "5" "4") -IF(PLUS_USE_STEALTHLINK AND PLUS_ITK_VERSION VERSION_GREATER "4") +IF(PLUS_USE_STEALTHLINK AND MSVC AND PLUS_ITK_VERSION VERSION_GREATER "4") MESSAGE("The StealthLink device only supports up to Visual Studio 2013, therefore it must use ITK 4. Changing ITK version to 4.") SET(PLUS_ITK_VERSION 4 CACHE STRING "Set version of ITK to use." FORCE) -ELSEIF(NOT PLUS_USE_STEALTHLINK AND PLUS_ITK_VERSION MATCHES "4") +ELSEIF(NOT (PLUS_USE_STEALTHLINK AND MSVC) AND PLUS_ITK_VERSION MATCHES "4") MESSAGE("Only the StealthLink device is still supported to use ITK 4. Changing ITK version to 5.") SET(PLUS_ITK_VERSION 5 CACHE STRING "Set version of ITK to use." FORCE) ENDIF() @@ -780,10 +793,6 @@ IF(PLUS_USE_STEALTHLINK) IF(NOT STEALTHLINK_FOUND) MESSAGE(FATAL_ERROR "This project requires Stealthlink2 SDK for supporting communication with Medtronic StealthStation. Please verify configuration or turn off PLUS_USE_STEALTHLINK.") ENDIF() - - IF(UNIX AND NOT APPLE) - MESSAGE(WARNING "StealthLink for linux API was built against the old cpp ABI. You must build Plus with -D_GLIBCXX_USE_CXX11_ABI=0 added to CXX_FLAGS.") - ENDIF() ENDIF() IF(PLUS_USE_CAPISTRANO_VIDEO) diff --git a/Modules/FindSTEALTHLINK.cmake b/Modules/FindSTEALTHLINK.cmake index 1e9080957..97a43cc87 100644 --- a/Modules/FindSTEALTHLINK.cmake +++ b/Modules/FindSTEALTHLINK.cmake @@ -40,7 +40,9 @@ IF (WIN32) SET( PLATFORM_SUFFIXD "${PLATFORM_SUFFIX}/Debug") SET( PLATFORM_SUFFIX "${PLATFORM_SUFFIX}/Release") -ELSEIF(UNIX AND NOT APPLE) +ELSEIF(APPLE) + MESSAGE(FATAL_ERROR "Error: the StealthLink SDK is only distributed for Windows and Linux, there is no macOS build to link against.") +ELSEIF(UNIX) SET( PLATFORM_SUFFIX "/linux/debian_5_0_AMD64") ENDIF() diff --git a/SuperBuild/External_PlusLib.cmake b/SuperBuild/External_PlusLib.cmake index 47f010cbe..9f5931741 100644 --- a/SuperBuild/External_PlusLib.cmake +++ b/SuperBuild/External_PlusLib.cmake @@ -206,10 +206,10 @@ IF(PLUS_USE_STEALTHLINK) LIST(APPEND PLUSBUILD_ADDITIONAL_SDK_ARGS -DSTEALTHLINK_INCLUDE_DIRS:PATH=${STEALTHLINK_INCLUDE_DIRS} -DSTEALTHLINK_STEALTHLINK_STATIC_LIBRARY:PATH=${STEALTHLINK_STEALTHLINK_STATIC_LIBRARY} + -DSTEALTHLINK_STEALTHLINK_SHARED_LIBRARY:PATH=${STEALTHLINK_STEALTHLINK_SHARED_LIBRARY} ) IF(WIN32) LIST(APPEND PLUSBUILD_ADDITIONAL_SDK_ARGS - -DSTEALTHLINK_STEALTHLINK_SHARED_LIBRARY:PATH=${STEALTHLINK_STEALTHLINK_SHARED_LIBRARY} -DSTEALTHLINK_STEALTHLINKD_STATIC_LIBRARY:PATH=${STEALTHLINK_STEALTHLINKD_STATIC_LIBRARY} -DSTEALTHLINK_STEALTHLINKD_SHARED_LIBRARY:PATH=${STEALTHLINK_STEALTHLINKD_SHARED_LIBRARY} )