From 412dbe6efbf09ba9417e28f37f578f7832805b71 Mon Sep 17 00:00:00 2001 From: filipovic Date: Wed, 17 Jun 2026 11:31:07 +0200 Subject: [PATCH 01/35] Test reduced Python wheel packaging size --- .github/workflows/python.yml | 41 ++++++++++++++---------------------- CMakeLists.txt | 30 +++++++++++++++++++++++++- pyproject.toml | 14 +++++++++--- python/CMakeLists.txt | 16 +++++++++++--- 4 files changed, 69 insertions(+), 32 deletions(-) diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index 9d542965..1d61ec52 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -75,12 +75,6 @@ jobs: run: | ./vcpkg/vcpkg install --triplet x64-windows - - name: 🛠️ Disable IPO - if: ${{ matrix.os == 'ubuntu-latest' }} - run: | - sed -i 's/\(DVIENNALS_BUILD_PYTHON=ON"\)/\1,"-DUSE_IPO=off"/g' pyproject.toml - cat pyproject.toml - - name: 🐍 Build and check Python Module (Windows) if: ${{ matrix.os == 'windows-latest' }} shell: pwsh @@ -142,25 +136,6 @@ jobs: - name: 🛞 CIBuildWheel run: pip install cibuildwheel==3.4.0 --break-system-packages - - name: 🛠️ Package Config (Windows) - if: ${{ matrix.os == 'windows-latest' }} - shell: pwsh - run: | - sed -i 's/\(DVIENNALS_BUILD_PYTHON=ON"\)/\1,"-DVIENNALS_PACKAGE_PYTHON=ON","-DVIENNALS_IS_CI=ON","-DVIENNALS_VTK_RENDERING=OFF"/g' pyproject.toml - type pyproject.toml - - - name: 🛠️ Package Config (MacOs) - if: ${{ matrix.os == 'macos-latest' }} - run: | - sed -i .bak 's/\(DVIENNALS_BUILD_PYTHON=ON"\)/\1,"-DVIENNALS_PACKAGE_PYTHON=ON","-DVIENNALS_IS_CI=ON","-DVIENNALS_VTK_RENDERING=OFF"/g' pyproject.toml - cat pyproject.toml - - - name: 🛠️ Package Config (Linux) - if: ${{ matrix.os == 'ubuntu-latest' }} - run: | - sed -i 's/\(DVIENNALS_BUILD_PYTHON=ON"\)/\1,"-DVIENNALS_PACKAGE_PYTHON=ON","-DVIENNALS_IS_CI=ON","-DVIENNALS_VTK_RENDERING=OFF"/g' pyproject.toml - cat pyproject.toml - - name: 🏗️ Build Wheels (Linux) if: ${{ matrix.os == 'ubuntu-latest' }} run: python -m cibuildwheel --output-dir wheelhouse @@ -175,6 +150,22 @@ jobs: CIBW_SKIP: ${{ matrix.skip }} CIBW_ARCHS_WINDOWS: auto64 + - name: 🔎 Inspect wheel contents + shell: bash + run: | + python - <<'PY' + import glob + import zipfile + + for wheel in glob.glob("wheelhouse/*.whl"): + print("\n" + wheel) + with zipfile.ZipFile(wheel) as zf: + entries = sorted(zf.infolist(), key=lambda item: item.file_size, reverse=True) + for entry in entries[:40]: + size_mb = entry.file_size / 1024 / 1024 + print(f"{size_mb:8.2f} MB {entry.filename}") + PY + - name: 📦 Upload Artifact uses: actions/upload-artifact@v4 with: diff --git a/CMakeLists.txt b/CMakeLists.txt index ad7abdd1..6d9bb57e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -58,6 +58,29 @@ if(MSVC) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -openmp:llvm /bigobj") endif() +# Reduce wheel size when packaging Python wheels. +# These flags are set before dependencies are added, so VTK is built with them too. +if(MSVC AND VIENNALS_PACKAGE_PYTHON) + string(APPEND CMAKE_C_FLAGS_RELEASE " /O1 /Gy /Gw") + string(APPEND CMAKE_CXX_FLAGS_RELEASE " /O1 /Gy /Gw") + string(APPEND CMAKE_MODULE_LINKER_FLAGS_RELEASE " /OPT:REF /OPT:ICF") + string(APPEND CMAKE_SHARED_LINKER_FLAGS_RELEASE " /OPT:REF /OPT:ICF") + string(APPEND CMAKE_EXE_LINKER_FLAGS_RELEASE " /OPT:REF /OPT:ICF") +endif() + +if((CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang|AppleClang") AND VIENNALS_PACKAGE_PYTHON) + string(APPEND CMAKE_C_FLAGS_RELEASE " -ffunction-sections -fdata-sections") + string(APPEND CMAKE_CXX_FLAGS_RELEASE " -ffunction-sections -fdata-sections") + + if(APPLE) + string(APPEND CMAKE_MODULE_LINKER_FLAGS_RELEASE " -Wl,-dead_strip") + string(APPEND CMAKE_SHARED_LINKER_FLAGS_RELEASE " -Wl,-dead_strip") + else() + string(APPEND CMAKE_MODULE_LINKER_FLAGS_RELEASE " -Wl,--gc-sections") + string(APPEND CMAKE_SHARED_LINKER_FLAGS_RELEASE " -Wl,--gc-sections") + endif() +endif() + # -------------------------------------------------------------------------------------------------------- # Configuration # -------------------------------------------------------------------------------------------------------- @@ -217,6 +240,11 @@ elseif(VIENNALS_USE_VTK) # Common VTK build options set(VTK_OPTIONS "BUILD_SHARED_LIBS OFF" + "VTK_INSTALL_SDK OFF" + "VTK_BUILD_TESTING OFF" + "BUILD_TESTING OFF" + "VTK_BUILD_ALL_MODULES OFF" + "VTK_ENABLE_REMOTE_MODULES OFF" "VTK_LEGACY_REMOVE ON" "VTK_SMP_IMPLEMENTATION_TYPE Sequential" "VTK_SMP_ENABLE_STDTHREAD OFF" @@ -246,12 +274,12 @@ elseif(VIENNALS_USE_VTK) "VTK_MODULE_ENABLE_VTK_FiltersCore YES" "VTK_MODULE_ENABLE_VTK_FiltersGeneral YES" "VTK_MODULE_ENABLE_VTK_FiltersGeometry YES" - "VTK_MODULE_ENABLE_VTK_RenderingCore YES" "CMAKE_PROJECT_NAME VTK") if(VIENNALS_VTK_RENDERING) list( APPEND VTK_OPTIONS + "VTK_MODULE_ENABLE_VTK_RenderingCore YES" "VTK_MODULE_ENABLE_VTK_RenderingOpenGL2 YES" "VTK_MODULE_ENABLE_VTK_RenderingUI YES" "VTK_MODULE_ENABLE_VTK_InteractionStyle YES" diff --git a/pyproject.toml b/pyproject.toml index ff4bfaa4..3b533d06 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [build-system] requires = [ - "scikit-build-core", + "scikit-build-core>=0.12.2", "pybind11" ] build-backend = "scikit_build_core.build" @@ -20,5 +20,13 @@ Issues = "https://github.com/ViennaTools/ViennaLS/issues" [tool.scikit-build] build-dir = "build" -cmake.args = ["-DVIENNALS_BUILD_PYTHON=ON"] -wheel.packages = ["python/viennals"] \ No newline at end of file + +cmake.args = [ + "-DVIENNALS_BUILD_PYTHON=ON", + "-DVIENNALS_PACKAGE_PYTHON=ON", + "-DVIENNALS_IS_CI=ON", + "-DVIENNALS_VTK_RENDERING=OFF", +] + +wheel.packages = ["python/viennals"] +install.components = ["python"] diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index 5b17c4db..a8675d2c 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -51,6 +51,7 @@ CPMFindPackage( set(PKG viennals) set(MOD _core) +set(PYTHON_INSTALL_COMPONENT python) pybind11_add_module(${MOD} pyWrap.cpp) target_link_libraries(${MOD} PRIVATE ViennaLS) @@ -80,10 +81,14 @@ install( TARGETS ${MOD} LIBRARY DESTINATION ${PKG} RUNTIME DESTINATION ${PKG} - ARCHIVE DESTINATION ${PKG}) + ARCHIVE DESTINATION ${PKG} + COMPONENT ${PYTHON_INSTALL_COMPONENT}) # Package files -install(FILES ${CMAKE_SOURCE_DIR}/python/__init__.py DESTINATION ${PKG}) +install( + FILES ${CMAKE_SOURCE_DIR}/python/__init__.py + DESTINATION ${PKG} + COMPONENT ${PYTHON_INSTALL_COMPONENT}) add_dependencies(${PROJECT_NAME} ${MOD}) @@ -111,7 +116,12 @@ if((VIENNALS_PACKAGE_PYTHON AND NOT APPLE) OR MSVC) endif() endif() +# Keep staged dependency folders out of the Python-only wheel component. +# When pyproject.toml sets `install.components = ["python"]`, this runtime +# component is intentionally skipped; this prevents VTK static archives / SDK +# files from being copied into the wheel. install( DIRECTORY ${VIENNALS_LIB_FOLDER} DESTINATION . - OPTIONAL) + OPTIONAL + COMPONENT runtime) From 684aa2d896dbf126fed7d61068275053641fac6b Mon Sep 17 00:00:00 2001 From: filipovic Date: Wed, 17 Jun 2026 12:04:03 +0200 Subject: [PATCH 02/35] resolve too-small wheel size --- .github/workflows/python.yml | 8 ++++++++ pyproject.toml | 3 --- python/CMakeLists.txt | 11 ++++++----- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index 1d61ec52..22873317 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -142,6 +142,10 @@ jobs: env: CIBW_SKIP: ${{ matrix.skip }} CIBW_MANYLINUX_X86_64_IMAGE: ghcr.io/viennatools/vienna-builder:cuda-python-nocuda + CIBW_CONFIG_SETTINGS: >- + cmake.define.VIENNALS_PACKAGE_PYTHON=ON + cmake.define.VIENNALS_IS_CI=ON + cmake.define.VIENNALS_VTK_RENDERING=OFF - name: 🏗️ Build Wheels (Other) if: ${{ matrix.os != 'ubuntu-latest' }} @@ -149,6 +153,10 @@ jobs: env: CIBW_SKIP: ${{ matrix.skip }} CIBW_ARCHS_WINDOWS: auto64 + CIBW_CONFIG_SETTINGS: >- + cmake.define.VIENNALS_PACKAGE_PYTHON=ON + cmake.define.VIENNALS_IS_CI=ON + cmake.define.VIENNALS_VTK_RENDERING=OFF - name: 🔎 Inspect wheel contents shell: bash diff --git a/pyproject.toml b/pyproject.toml index 3b533d06..ba3f651a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,13 +20,10 @@ Issues = "https://github.com/ViennaTools/ViennaLS/issues" [tool.scikit-build] build-dir = "build" - cmake.args = [ "-DVIENNALS_BUILD_PYTHON=ON", "-DVIENNALS_PACKAGE_PYTHON=ON", "-DVIENNALS_IS_CI=ON", "-DVIENNALS_VTK_RENDERING=OFF", ] - wheel.packages = ["python/viennals"] -install.components = ["python"] diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index a8675d2c..41e87da9 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -120,8 +120,9 @@ endif() # When pyproject.toml sets `install.components = ["python"]`, this runtime # component is intentionally skipped; this prevents VTK static archives / SDK # files from being copied into the wheel. -install( - DIRECTORY ${VIENNALS_LIB_FOLDER} - DESTINATION . - OPTIONAL - COMPONENT runtime) +if(NOT VIENNALS_PACKAGE_PYTHON) + install( + DIRECTORY ${VIENNALS_LIB_FOLDER} + DESTINATION . + OPTIONAL) +endif() From 4eb47fe5e0563acddb97e21448351abcd5eef56a Mon Sep 17 00:00:00 2001 From: filipovic Date: Wed, 17 Jun 2026 12:08:09 +0200 Subject: [PATCH 03/35] remove PYTHON_INSTALL_COMPONENT --- python/CMakeLists.txt | 7 ------- 1 file changed, 7 deletions(-) diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index 41e87da9..37e28971 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -51,7 +51,6 @@ CPMFindPackage( set(PKG viennals) set(MOD _core) -set(PYTHON_INSTALL_COMPONENT python) pybind11_add_module(${MOD} pyWrap.cpp) target_link_libraries(${MOD} PRIVATE ViennaLS) @@ -82,13 +81,11 @@ install( LIBRARY DESTINATION ${PKG} RUNTIME DESTINATION ${PKG} ARCHIVE DESTINATION ${PKG} - COMPONENT ${PYTHON_INSTALL_COMPONENT}) # Package files install( FILES ${CMAKE_SOURCE_DIR}/python/__init__.py DESTINATION ${PKG} - COMPONENT ${PYTHON_INSTALL_COMPONENT}) add_dependencies(${PROJECT_NAME} ${MOD}) @@ -116,10 +113,6 @@ if((VIENNALS_PACKAGE_PYTHON AND NOT APPLE) OR MSVC) endif() endif() -# Keep staged dependency folders out of the Python-only wheel component. -# When pyproject.toml sets `install.components = ["python"]`, this runtime -# component is intentionally skipped; this prevents VTK static archives / SDK -# files from being copied into the wheel. if(NOT VIENNALS_PACKAGE_PYTHON) install( DIRECTORY ${VIENNALS_LIB_FOLDER} From f38cf435b380bf157ec940907509696024ff4253 Mon Sep 17 00:00:00 2001 From: filipovic Date: Wed, 17 Jun 2026 12:13:42 +0200 Subject: [PATCH 04/35] fix missing closing bracket --- python/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index 37e28971..b7c8a097 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -80,12 +80,12 @@ install( TARGETS ${MOD} LIBRARY DESTINATION ${PKG} RUNTIME DESTINATION ${PKG} - ARCHIVE DESTINATION ${PKG} + ARCHIVE DESTINATION ${PKG}) # Package files install( FILES ${CMAKE_SOURCE_DIR}/python/__init__.py - DESTINATION ${PKG} + DESTINATION ${PKG}) add_dependencies(${PROJECT_NAME} ${MOD}) From a28da9e39e22398e1cbdf7dbff8122c653da7eaa Mon Sep 17 00:00:00 2001 From: filipovic Date: Wed, 17 Jun 2026 12:26:01 +0200 Subject: [PATCH 05/35] remove redundant flags in python.yml --- pyproject.toml | 3 --- python/__init__.py | 2 +- python/pyWrap.cpp | 2 +- python/viennals/__init__.pyi | 2 +- python/viennals/_core.pyi | 2 +- 5 files changed, 4 insertions(+), 7 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index ba3f651a..1070a706 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -22,8 +22,5 @@ Issues = "https://github.com/ViennaTools/ViennaLS/issues" build-dir = "build" cmake.args = [ "-DVIENNALS_BUILD_PYTHON=ON", - "-DVIENNALS_PACKAGE_PYTHON=ON", - "-DVIENNALS_IS_CI=ON", - "-DVIENNALS_VTK_RENDERING=OFF", ] wheel.packages = ["python/viennals"] diff --git a/python/__init__.py b/python/__init__.py index 82f33b80..4e4f7fe5 100644 --- a/python/__init__.py +++ b/python/__init__.py @@ -3,7 +3,7 @@ ======== ViennaLS is a level set library developed for high performance -topography simulations. The main design goals are simplicity and efficiency, +topography and semiconductor process simulations. The main design goals are simplicity and efficiency, tailored towards scientific simulations. ViennaLS can also be used for visualisation applications, although this is not the main design target. """ diff --git a/python/pyWrap.cpp b/python/pyWrap.cpp index d920729b..122b0ec2 100644 --- a/python/pyWrap.cpp +++ b/python/pyWrap.cpp @@ -39,7 +39,7 @@ class PylsVelocityField : public VelocityField { PYBIND11_MODULE(VIENNALS_MODULE_NAME, module) { module.doc() = "ViennaLS is a header-only C++ level set library developed for high " - "performance topography simulations. The main design goals are " + "performance topography and semiconductor process simulations. The main design goals are " "simplicity and efficiency, tailored towards scientific simulations. " "ViennaLS can also be used for visualization applications, although this " "is not the main design target."; diff --git a/python/viennals/__init__.pyi b/python/viennals/__init__.pyi index 779995fd..0ae66518 100644 --- a/python/viennals/__init__.pyi +++ b/python/viennals/__init__.pyi @@ -4,7 +4,7 @@ ViennaLS ======== ViennaLS is a level set library developed for high performance -topography simulations. The main design goals are simplicity and efficiency, +topography and semiconductor process simulations. The main design goals are simplicity and efficiency, tailored towards scientific simulations. ViennaLS can also be used for visualisation applications, although this is not the main design target. """ diff --git a/python/viennals/_core.pyi b/python/viennals/_core.pyi index 663384a8..d085fb85 100644 --- a/python/viennals/_core.pyi +++ b/python/viennals/_core.pyi @@ -1,5 +1,5 @@ """ -ViennaLS is a header-only C++ level set library developed for high performance topography simulations. The main design goals are simplicity and efficiency, tailored towards scientific simulations. ViennaLS can also be used for visualization applications, although this is not the main design target. +ViennaLS is a header-only C++ level set library developed for high performance topography and semiconductor process simulations. The main design goals are simplicity and efficiency, tailored towards scientific simulations. ViennaLS can also be used for visualization applications, although this is not the main design target. """ from __future__ import annotations import collections.abc From f6b9a4170d8594fca2f072a97e0d9f4082b18682 Mon Sep 17 00:00:00 2001 From: filipovic Date: Wed, 17 Jun 2026 15:37:53 +0200 Subject: [PATCH 06/35] Enable OpenMP during VTK build --- CMakeLists.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6d9bb57e..d7062a9d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -69,9 +69,9 @@ if(MSVC AND VIENNALS_PACKAGE_PYTHON) endif() if((CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang|AppleClang") AND VIENNALS_PACKAGE_PYTHON) - string(APPEND CMAKE_C_FLAGS_RELEASE " -ffunction-sections -fdata-sections") - string(APPEND CMAKE_CXX_FLAGS_RELEASE " -ffunction-sections -fdata-sections") - + string(APPEND CMAKE_C_FLAGS_RELEASE " -O3 -DNDEBUG -ffunction-sections -fdata-sections") + string(APPEND CMAKE_CXX_FLAGS_RELEASE " -O3 -DNDEBUG -ffunction-sections -fdata-sections") + if(APPLE) string(APPEND CMAKE_MODULE_LINKER_FLAGS_RELEASE " -Wl,-dead_strip") string(APPEND CMAKE_SHARED_LINKER_FLAGS_RELEASE " -Wl,-dead_strip") @@ -246,9 +246,9 @@ elseif(VIENNALS_USE_VTK) "VTK_BUILD_ALL_MODULES OFF" "VTK_ENABLE_REMOTE_MODULES OFF" "VTK_LEGACY_REMOVE ON" - "VTK_SMP_IMPLEMENTATION_TYPE Sequential" + "VTK_SMP_IMPLEMENTATION_TYPE OpenMP" "VTK_SMP_ENABLE_STDTHREAD OFF" - "VTK_SMP_ENABLE_OPENMP OFF" + "VTK_SMP_ENABLE_OPENMP ON" "VTK_SMP_ENABLE_TBB OFF" "VTK_GROUP_ENABLE_Rendering NO" "VTK_GROUP_ENABLE_Imaging NO" From e6bca98271acac29c2889bab0d9df4fc4556fe51 Mon Sep 17 00:00:00 2001 From: filipovic Date: Wed, 17 Jun 2026 17:09:03 +0200 Subject: [PATCH 07/35] force VTK to build OpenMP not sequential --- CMakeLists.txt | 53 ++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 38 insertions(+), 15 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d7062a9d..8d4a1048 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -246,21 +246,35 @@ elseif(VIENNALS_USE_VTK) "VTK_BUILD_ALL_MODULES OFF" "VTK_ENABLE_REMOTE_MODULES OFF" "VTK_LEGACY_REMOVE ON" + + # VTK threading backend. "VTK_SMP_IMPLEMENTATION_TYPE OpenMP" "VTK_SMP_ENABLE_STDTHREAD OFF" "VTK_SMP_ENABLE_OPENMP ON" "VTK_SMP_ENABLE_TBB OFF" - "VTK_GROUP_ENABLE_Rendering NO" - "VTK_GROUP_ENABLE_Imaging NO" - "VTK_GROUP_ENABLE_Views NO" - "VTK_GROUP_ENABLE_Web NO" + + # Keep the build small, but do not hard-forbid dependency resolution. + "VTK_GROUP_ENABLE_Rendering DONT_WANT" + "VTK_GROUP_ENABLE_Imaging DONT_WANT" + "VTK_GROUP_ENABLE_Views DONT_WANT" + "VTK_GROUP_ENABLE_Web DONT_WANT" + + # These should stay hard-disabled for wheels. "VTK_GROUP_ENABLE_Qt NO" "VTK_GROUP_ENABLE_MPI NO" - "VTK_GROUP_ENABLE_Parallel NO" + + # Safer than hard NO unless you are certain no selected module can need it. + "VTK_GROUP_ENABLE_Parallel DONT_WANT" "VTK_MODULE_ENABLE_VTK_ParallelDIY NO" - "VTK_MODULE_ENABLE_VTK_ParallelCore NO" + "VTK_MODULE_ENABLE_VTK_ParallelCore DONT_WANT" + + # No VTK Python wrapping; ViennaLS uses pybind11. "VTK_ENABLE_WRAPPING NO" + + # Avoid optional geospatial/projection dependency. "VTK_MODULE_ENABLE_VTK_libproj NO" + + # Required VTK core/IO/filter modules. "VTK_MODULE_ENABLE_VTK_CommonExecutionModel YES" "VTK_MODULE_ENABLE_VTK_CommonMisc YES" "VTK_MODULE_ENABLE_VTK_CommonSystem YES" @@ -273,19 +287,18 @@ elseif(VIENNALS_USE_VTK) "VTK_MODULE_ENABLE_VTK_IOXML YES" "VTK_MODULE_ENABLE_VTK_FiltersCore YES" "VTK_MODULE_ENABLE_VTK_FiltersGeneral YES" - "VTK_MODULE_ENABLE_VTK_FiltersGeometry YES" - "CMAKE_PROJECT_NAME VTK") + "VTK_MODULE_ENABLE_VTK_FiltersGeometry YES") if(VIENNALS_VTK_RENDERING) list( APPEND VTK_OPTIONS - "VTK_MODULE_ENABLE_VTK_RenderingCore YES" - "VTK_MODULE_ENABLE_VTK_RenderingOpenGL2 YES" - "VTK_MODULE_ENABLE_VTK_RenderingUI YES" - "VTK_MODULE_ENABLE_VTK_InteractionStyle YES" - "VTK_MODULE_ENABLE_VTK_RenderingFreeType YES" - "VTK_MODULE_ENABLE_VTK_IOImage YES" - "VTK_MODULE_ENABLE_VTK_RenderingAnnotation YES") + "VTK_MODULE_ENABLE_VTK_RenderingCore WANT" + "VTK_MODULE_ENABLE_VTK_RenderingOpenGL2 WANT" + "VTK_MODULE_ENABLE_VTK_RenderingUI WANT" + "VTK_MODULE_ENABLE_VTK_InteractionStyle WANT" + "VTK_MODULE_ENABLE_VTK_RenderingFreeType WANT" + "VTK_MODULE_ENABLE_VTK_IOImage WANT" + "VTK_MODULE_ENABLE_VTK_RenderingAnnotation WANT") endif() # macOS-specific adds @@ -293,6 +306,16 @@ elseif(VIENNALS_USE_VTK) list(APPEND VTK_OPTIONS "VTK_MODULE_USE_EXTERNAL_VTK_png ON" "VTK_MODULE_USE_EXTERNAL_VTK_zlib ON") endif() + + if(VIENNALS_PACKAGE_PYTHON) + set(VTK_SMP_IMPLEMENTATION_TYPE "OpenMP" CACHE STRING "" FORCE) + set(VTK_SMP_ENABLE_OPENMP ON CACHE BOOL "" FORCE) + set(VTK_SMP_ENABLE_STDTHREAD OFF CACHE BOOL "" FORCE) + set(VTK_SMP_ENABLE_TBB OFF CACHE BOOL "" FORCE) + + message(STATUS "[ViennaLS] Requested VTK_SMP_IMPLEMENTATION_TYPE=${VTK_SMP_IMPLEMENTATION_TYPE}") + message(STATUS "[ViennaLS] Requested VTK_SMP_ENABLE_OPENMP=${VTK_SMP_ENABLE_OPENMP}") + endif() CPMFindPackage( NAME VTK From 350363503df38fc0baae6d6c86659bdfa461cdc4 Mon Sep 17 00:00:00 2001 From: filipovic Date: Wed, 17 Jun 2026 19:49:47 +0200 Subject: [PATCH 08/35] use STDThread --- CMakeLists.txt | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8d4a1048..a8e9cd39 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -247,10 +247,13 @@ elseif(VIENNALS_USE_VTK) "VTK_ENABLE_REMOTE_MODULES OFF" "VTK_LEGACY_REMOVE ON" - # VTK threading backend. - "VTK_SMP_IMPLEMENTATION_TYPE OpenMP" - "VTK_SMP_ENABLE_STDTHREAD OFF" - "VTK_SMP_ENABLE_OPENMP ON" + # VTK threading backend: STDThread gives full parallelism (large file I/O) + # without OpenMP. MSVC's /openmp reports version 2.0; VTK requires 3.1 for + # atomics and silently force-resets TYPE to Sequential when that check + # fails, so OpenMP ends up single-threaded anyway. + "VTK_SMP_IMPLEMENTATION_TYPE STDThread" + "VTK_SMP_ENABLE_STDTHREAD ON" + "VTK_SMP_ENABLE_OPENMP OFF" "VTK_SMP_ENABLE_TBB OFF" # Keep the build small, but do not hard-forbid dependency resolution. @@ -307,16 +310,6 @@ elseif(VIENNALS_USE_VTK) "VTK_MODULE_USE_EXTERNAL_VTK_zlib ON") endif() - if(VIENNALS_PACKAGE_PYTHON) - set(VTK_SMP_IMPLEMENTATION_TYPE "OpenMP" CACHE STRING "" FORCE) - set(VTK_SMP_ENABLE_OPENMP ON CACHE BOOL "" FORCE) - set(VTK_SMP_ENABLE_STDTHREAD OFF CACHE BOOL "" FORCE) - set(VTK_SMP_ENABLE_TBB OFF CACHE BOOL "" FORCE) - - message(STATUS "[ViennaLS] Requested VTK_SMP_IMPLEMENTATION_TYPE=${VTK_SMP_IMPLEMENTATION_TYPE}") - message(STATUS "[ViennaLS] Requested VTK_SMP_ENABLE_OPENMP=${VTK_SMP_ENABLE_OPENMP}") - endif() - CPMFindPackage( NAME VTK GIT_TAG v9.3.1 From 930722cb2f964f14f939de3bab70acd2e1c36283 Mon Sep 17 00:00:00 2001 From: filipovic Date: Wed, 17 Jun 2026 20:54:47 +0200 Subject: [PATCH 09/35] fix Windows LNK2001: use TYPE=OpenMP, disable STDThread --- .github/workflows/python.yml | 1 - CMakeLists.txt | 26 +++++++++++++++++++------- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index 22873317..eadae9f7 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -141,7 +141,6 @@ jobs: run: python -m cibuildwheel --output-dir wheelhouse env: CIBW_SKIP: ${{ matrix.skip }} - CIBW_MANYLINUX_X86_64_IMAGE: ghcr.io/viennatools/vienna-builder:cuda-python-nocuda CIBW_CONFIG_SETTINGS: >- cmake.define.VIENNALS_PACKAGE_PYTHON=ON cmake.define.VIENNALS_IS_CI=ON diff --git a/CMakeLists.txt b/CMakeLists.txt index a8e9cd39..90facb22 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -247,13 +247,20 @@ elseif(VIENNALS_USE_VTK) "VTK_ENABLE_REMOTE_MODULES OFF" "VTK_LEGACY_REMOVE ON" - # VTK threading backend: STDThread gives full parallelism (large file I/O) - # without OpenMP. MSVC's /openmp reports version 2.0; VTK requires 3.1 for - # atomics and silently force-resets TYPE to Sequential when that check - # fails, so OpenMP ends up single-threaded anyway. - "VTK_SMP_IMPLEMENTATION_TYPE STDThread" - "VTK_SMP_ENABLE_STDTHREAD ON" - "VTK_SMP_ENABLE_OPENMP OFF" + # VTK threading backend. + # OpenMP gives full parallelism on all platforms. On MSVC the detected + # spec-date is 2.0 (from /openmp), but ViennaLS passes /openmp:llvm which + # makes LLVM OpenMP 5.0 the actual runtime — the cmake atomics warning is + # cosmetic only. + # + # STDThread is intentionally kept OFF. vtkSMPToolsImpl.txx declares the + # explicit specialisation of IsParallelScope() for STDThread, but + # vtkSMPToolsAPI.cxx only includes vtkSMPToolsImpl.h — it never sees that + # declaration. GCC/Clang resolve this via COMDAT weak/strong symbols; + # MSVC emits an import reference that the linker cannot satisfy, producing + # LNK2001 for vtkSMPToolsImpl<1>::IsParallelScope. + "VTK_SMP_IMPLEMENTATION_TYPE OpenMP" + "VTK_SMP_ENABLE_STDTHREAD OFF" "VTK_SMP_ENABLE_TBB OFF" # Keep the build small, but do not hard-forbid dependency resolution. @@ -310,6 +317,11 @@ elseif(VIENNALS_USE_VTK) "VTK_MODULE_USE_EXTERNAL_VTK_zlib ON") endif() + # Guarantee STDTHREAD stays OFF even if VTK's option() fires before CPM's + # cache entry is written. See comment in VTK_OPTIONS above for why this + # matters on MSVC. + set(VTK_SMP_ENABLE_STDTHREAD OFF CACHE BOOL "" FORCE) + CPMFindPackage( NAME VTK GIT_TAG v9.3.1 From a9bb796aaea3430db7cee96705b3404e967f26e1 Mon Sep 17 00:00:00 2001 From: filipovic Date: Wed, 17 Jun 2026 23:43:28 +0200 Subject: [PATCH 10/35] remove size-optimization for windows build --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 90facb22..0cbfb13f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -61,8 +61,8 @@ endif() # Reduce wheel size when packaging Python wheels. # These flags are set before dependencies are added, so VTK is built with them too. if(MSVC AND VIENNALS_PACKAGE_PYTHON) - string(APPEND CMAKE_C_FLAGS_RELEASE " /O1 /Gy /Gw") - string(APPEND CMAKE_CXX_FLAGS_RELEASE " /O1 /Gy /Gw") + string(APPEND CMAKE_C_FLAGS_RELEASE " /O2 /Gy /Gw") + string(APPEND CMAKE_CXX_FLAGS_RELEASE " /O2 /Gy /Gw") string(APPEND CMAKE_MODULE_LINKER_FLAGS_RELEASE " /OPT:REF /OPT:ICF") string(APPEND CMAKE_SHARED_LINKER_FLAGS_RELEASE " /OPT:REF /OPT:ICF") string(APPEND CMAKE_EXE_LINKER_FLAGS_RELEASE " /OPT:REF /OPT:ICF") From 431adcd9459f1211174013f2749b6615ec36fc5f Mon Sep 17 00:00:00 2001 From: filipovic Date: Thu, 18 Jun 2026 08:29:41 +0200 Subject: [PATCH 11/35] Enable OpenMP and Rendering explicitly --- .github/workflows/python.yml | 4 ++-- CMakeLists.txt | 24 +++++++++++++++++------- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index eadae9f7..dcc9a97f 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -144,7 +144,7 @@ jobs: CIBW_CONFIG_SETTINGS: >- cmake.define.VIENNALS_PACKAGE_PYTHON=ON cmake.define.VIENNALS_IS_CI=ON - cmake.define.VIENNALS_VTK_RENDERING=OFF + cmake.define.VIENNALS_VTK_RENDERING=ON - name: 🏗️ Build Wheels (Other) if: ${{ matrix.os != 'ubuntu-latest' }} @@ -155,7 +155,7 @@ jobs: CIBW_CONFIG_SETTINGS: >- cmake.define.VIENNALS_PACKAGE_PYTHON=ON cmake.define.VIENNALS_IS_CI=ON - cmake.define.VIENNALS_VTK_RENDERING=OFF + cmake.define.VIENNALS_VTK_RENDERING=ON - name: 🔎 Inspect wheel contents shell: bash diff --git a/CMakeLists.txt b/CMakeLists.txt index 0cbfb13f..85bced72 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -261,6 +261,7 @@ elseif(VIENNALS_USE_VTK) # LNK2001 for vtkSMPToolsImpl<1>::IsParallelScope. "VTK_SMP_IMPLEMENTATION_TYPE OpenMP" "VTK_SMP_ENABLE_STDTHREAD OFF" + "VTK_SMP_ENABLE_OPENMP ON" "VTK_SMP_ENABLE_TBB OFF" # Keep the build small, but do not hard-forbid dependency resolution. @@ -302,13 +303,13 @@ elseif(VIENNALS_USE_VTK) list( APPEND VTK_OPTIONS - "VTK_MODULE_ENABLE_VTK_RenderingCore WANT" - "VTK_MODULE_ENABLE_VTK_RenderingOpenGL2 WANT" - "VTK_MODULE_ENABLE_VTK_RenderingUI WANT" - "VTK_MODULE_ENABLE_VTK_InteractionStyle WANT" - "VTK_MODULE_ENABLE_VTK_RenderingFreeType WANT" - "VTK_MODULE_ENABLE_VTK_IOImage WANT" - "VTK_MODULE_ENABLE_VTK_RenderingAnnotation WANT") + "VTK_MODULE_ENABLE_VTK_RenderingCore YES" + "VTK_MODULE_ENABLE_VTK_RenderingOpenGL2 YES" + "VTK_MODULE_ENABLE_VTK_RenderingUI YES" + "VTK_MODULE_ENABLE_VTK_InteractionStyle YES" + "VTK_MODULE_ENABLE_VTK_RenderingFreeType YES" + "VTK_MODULE_ENABLE_VTK_IOImage YES" + "VTK_MODULE_ENABLE_VTK_RenderingAnnotation YES") endif() # macOS-specific adds @@ -320,7 +321,11 @@ elseif(VIENNALS_USE_VTK) # Guarantee STDTHREAD stays OFF even if VTK's option() fires before CPM's # cache entry is written. See comment in VTK_OPTIONS above for why this # matters on MSVC. + # Guarantee VTK uses OpenMP SMP for package builds. + set(VTK_SMP_IMPLEMENTATION_TYPE "OpenMP" CACHE STRING "" FORCE) set(VTK_SMP_ENABLE_STDTHREAD OFF CACHE BOOL "" FORCE) + set(VTK_SMP_ENABLE_OPENMP ON CACHE BOOL "" FORCE) + set(VTK_SMP_ENABLE_TBB OFF CACHE BOOL "" FORCE) CPMFindPackage( NAME VTK @@ -330,6 +335,11 @@ elseif(VIENNALS_USE_VTK) EXCLUDE_FROM_ALL ${VIENNALS_BUILD_PYTHON} OPTIONS ${VTK_OPTIONS}) + message(STATUS "[ViennaLS] VTK_SMP_IMPLEMENTATION_TYPE=${VTK_SMP_IMPLEMENTATION_TYPE}") + message(STATUS "[ViennaLS] VTK_SMP_ENABLE_OPENMP=${VTK_SMP_ENABLE_OPENMP}") + message(STATUS "[ViennaLS] VTK_SMP_ENABLE_STDTHREAD=${VTK_SMP_ENABLE_STDTHREAD}") + message(STATUS "[ViennaLS] VTK_SMP_ENABLE_TBB=${VTK_SMP_ENABLE_TBB}") + target_compile_definitions(${PROJECT_NAME} INTERFACE VIENNALS_USE_VTK=1) set(VTK_LIBRARIES From d1472b4e3ce77c60a7fd16e673bf529bed04ddc7 Mon Sep 17 00:00:00 2001 From: filipovic Date: Thu, 18 Jun 2026 08:40:55 +0200 Subject: [PATCH 12/35] allow enabling ParlallelDIY --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 85bced72..33b46818 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -276,7 +276,7 @@ elseif(VIENNALS_USE_VTK) # Safer than hard NO unless you are certain no selected module can need it. "VTK_GROUP_ENABLE_Parallel DONT_WANT" - "VTK_MODULE_ENABLE_VTK_ParallelDIY NO" + "VTK_MODULE_ENABLE_VTK_ParallelDIY DONT_WANT" "VTK_MODULE_ENABLE_VTK_ParallelCore DONT_WANT" # No VTK Python wrapping; ViennaLS uses pybind11. From e7936f8b293924195ad37af5ced85b349032d78f Mon Sep 17 00:00:00 2001 From: filipovic Date: Thu, 18 Jun 2026 09:56:42 +0200 Subject: [PATCH 13/35] remove ParallelDIY from Windows builds --- CMakeLists.txt | 56 ++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 47 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 33b46818..170ea9a5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -274,11 +274,6 @@ elseif(VIENNALS_USE_VTK) "VTK_GROUP_ENABLE_Qt NO" "VTK_GROUP_ENABLE_MPI NO" - # Safer than hard NO unless you are certain no selected module can need it. - "VTK_GROUP_ENABLE_Parallel DONT_WANT" - "VTK_MODULE_ENABLE_VTK_ParallelDIY DONT_WANT" - "VTK_MODULE_ENABLE_VTK_ParallelCore DONT_WANT" - # No VTK Python wrapping; ViennaLS uses pybind11. "VTK_ENABLE_WRAPPING NO" @@ -299,17 +294,47 @@ elseif(VIENNALS_USE_VTK) "VTK_MODULE_ENABLE_VTK_FiltersCore YES" "VTK_MODULE_ENABLE_VTK_FiltersGeneral YES" "VTK_MODULE_ENABLE_VTK_FiltersGeometry YES") + + if(MSVC) + list( + APPEND + VTK_OPTIONS + "VTK_GROUP_ENABLE_Parallel DONT_WANT" + "VTK_MODULE_ENABLE_VTK_ParallelDIY NO" + "VTK_MODULE_ENABLE_VTK_ParallelCore DONT_WANT") + else() + list( + APPEND + VTK_OPTIONS + "VTK_GROUP_ENABLE_Parallel DONT_WANT" + "VTK_MODULE_ENABLE_VTK_ParallelDIY DONT_WANT" + "VTK_MODULE_ENABLE_VTK_ParallelCore DONT_WANT") + endif() + if(VIENNALS_VTK_RENDERING) list( APPEND VTK_OPTIONS "VTK_MODULE_ENABLE_VTK_RenderingCore YES" "VTK_MODULE_ENABLE_VTK_RenderingOpenGL2 YES" - "VTK_MODULE_ENABLE_VTK_RenderingUI YES" - "VTK_MODULE_ENABLE_VTK_InteractionStyle YES" "VTK_MODULE_ENABLE_VTK_RenderingFreeType YES" "VTK_MODULE_ENABLE_VTK_IOImage YES" "VTK_MODULE_ENABLE_VTK_RenderingAnnotation YES") + + if(NOT MSVC) + list( + APPEND + VTK_OPTIONS + "VTK_MODULE_ENABLE_VTK_RenderingUI YES" + "VTK_MODULE_ENABLE_VTK_InteractionStyle YES") + else() + message(STATUS "[ViennaLS] Disabling VTK RenderingUI/InteractionStyle on MSVC to avoid VTK ParallelDIY/stdext build failure") + list( + APPEND + VTK_OPTIONS + "VTK_MODULE_ENABLE_VTK_RenderingUI NO" + "VTK_MODULE_ENABLE_VTK_InteractionStyle NO") + endif() endif() # macOS-specific adds @@ -327,6 +352,12 @@ elseif(VIENNALS_USE_VTK) set(VTK_SMP_ENABLE_OPENMP ON CACHE BOOL "" FORCE) set(VTK_SMP_ENABLE_TBB OFF CACHE BOOL "" FORCE) + if(MSVC) + set(VTK_MODULE_ENABLE_VTK_ParallelDIY "NO" CACHE STRING "" FORCE) + set(VTK_MODULE_ENABLE_VTK_RenderingUI "NO" CACHE STRING "" FORCE) + set(VTK_MODULE_ENABLE_VTK_InteractionStyle "NO" CACHE STRING "" FORCE) + endif() + CPMFindPackage( NAME VTK GIT_TAG v9.3.1 @@ -363,11 +394,18 @@ elseif(VIENNALS_USE_VTK) VTK_LIBRARIES VTK::RenderingCore VTK::RenderingOpenGL2 - VTK::RenderingUI - VTK::InteractionStyle VTK::RenderingFreeType VTK::RenderingAnnotation VTK::IOImage) + + if(NOT MSVC) + list( + APPEND + VTK_LIBRARIES + VTK::RenderingUI + VTK::InteractionStyle) + endif() + target_compile_definitions(${PROJECT_NAME} INTERFACE VIENNALS_VTK_RENDERING=1) endif() target_link_libraries(${PROJECT_NAME} INTERFACE ${VTK_LIBRARIES}) From 14e572457cafdd13a17335f8c08382fea42cfd6a Mon Sep 17 00:00:00 2001 From: filipovic Date: Thu, 18 Jun 2026 10:11:20 +0200 Subject: [PATCH 14/35] reintroduce RenderingUI for windows --- CMakeLists.txt | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 170ea9a5..87726e3f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -317,6 +317,7 @@ elseif(VIENNALS_USE_VTK) VTK_OPTIONS "VTK_MODULE_ENABLE_VTK_RenderingCore YES" "VTK_MODULE_ENABLE_VTK_RenderingOpenGL2 YES" + "VTK_MODULE_ENABLE_VTK_RenderingUI YES" "VTK_MODULE_ENABLE_VTK_RenderingFreeType YES" "VTK_MODULE_ENABLE_VTK_IOImage YES" "VTK_MODULE_ENABLE_VTK_RenderingAnnotation YES") @@ -325,14 +326,12 @@ elseif(VIENNALS_USE_VTK) list( APPEND VTK_OPTIONS - "VTK_MODULE_ENABLE_VTK_RenderingUI YES" "VTK_MODULE_ENABLE_VTK_InteractionStyle YES") else() - message(STATUS "[ViennaLS] Disabling VTK RenderingUI/InteractionStyle on MSVC to avoid VTK ParallelDIY/stdext build failure") + message(STATUS "[ViennaLS] Disabling VTK InteractionStyle on MSVC to avoid VTK ParallelDIY/stdext build failure") list( APPEND VTK_OPTIONS - "VTK_MODULE_ENABLE_VTK_RenderingUI NO" "VTK_MODULE_ENABLE_VTK_InteractionStyle NO") endif() endif() @@ -354,7 +353,6 @@ elseif(VIENNALS_USE_VTK) if(MSVC) set(VTK_MODULE_ENABLE_VTK_ParallelDIY "NO" CACHE STRING "" FORCE) - set(VTK_MODULE_ENABLE_VTK_RenderingUI "NO" CACHE STRING "" FORCE) set(VTK_MODULE_ENABLE_VTK_InteractionStyle "NO" CACHE STRING "" FORCE) endif() @@ -394,6 +392,7 @@ elseif(VIENNALS_USE_VTK) VTK_LIBRARIES VTK::RenderingCore VTK::RenderingOpenGL2 + VTK::RenderingUI VTK::RenderingFreeType VTK::RenderingAnnotation VTK::IOImage) @@ -402,7 +401,6 @@ elseif(VIENNALS_USE_VTK) list( APPEND VTK_LIBRARIES - VTK::RenderingUI VTK::InteractionStyle) endif() From 47ee094f5cde5b6c257a8df7cfc114a6c75f8bc8 Mon Sep 17 00:00:00 2001 From: filipovic Date: Thu, 18 Jun 2026 12:00:30 +0200 Subject: [PATCH 15/35] path VTK use of checked_array_iterator on windows builds --- CMakeLists.txt | 84 ++++++++++++++++++++++--------------------------- cmake/vtk.cmake | 51 ++++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+), 47 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 87726e3f..c1dcf05e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -293,23 +293,11 @@ elseif(VIENNALS_USE_VTK) "VTK_MODULE_ENABLE_VTK_IOXML YES" "VTK_MODULE_ENABLE_VTK_FiltersCore YES" "VTK_MODULE_ENABLE_VTK_FiltersGeneral YES" - "VTK_MODULE_ENABLE_VTK_FiltersGeometry YES") - - if(MSVC) - list( - APPEND - VTK_OPTIONS - "VTK_GROUP_ENABLE_Parallel DONT_WANT" - "VTK_MODULE_ENABLE_VTK_ParallelDIY NO" - "VTK_MODULE_ENABLE_VTK_ParallelCore DONT_WANT") - else() - list( - APPEND - VTK_OPTIONS + "VTK_MODULE_ENABLE_VTK_FiltersGeometry YES" + "VTK_GROUP_ENABLE_Parallel DONT_WANT" "VTK_MODULE_ENABLE_VTK_ParallelDIY DONT_WANT" "VTK_MODULE_ENABLE_VTK_ParallelCore DONT_WANT") - endif() if(VIENNALS_VTK_RENDERING) list( @@ -318,22 +306,10 @@ elseif(VIENNALS_USE_VTK) "VTK_MODULE_ENABLE_VTK_RenderingCore YES" "VTK_MODULE_ENABLE_VTK_RenderingOpenGL2 YES" "VTK_MODULE_ENABLE_VTK_RenderingUI YES" + "VTK_MODULE_ENABLE_VTK_InteractionStyle YES" "VTK_MODULE_ENABLE_VTK_RenderingFreeType YES" "VTK_MODULE_ENABLE_VTK_IOImage YES" "VTK_MODULE_ENABLE_VTK_RenderingAnnotation YES") - - if(NOT MSVC) - list( - APPEND - VTK_OPTIONS - "VTK_MODULE_ENABLE_VTK_InteractionStyle YES") - else() - message(STATUS "[ViennaLS] Disabling VTK InteractionStyle on MSVC to avoid VTK ParallelDIY/stdext build failure") - list( - APPEND - VTK_OPTIONS - "VTK_MODULE_ENABLE_VTK_InteractionStyle NO") - endif() endif() # macOS-specific adds @@ -351,18 +327,40 @@ elseif(VIENNALS_USE_VTK) set(VTK_SMP_ENABLE_OPENMP ON CACHE BOOL "" FORCE) set(VTK_SMP_ENABLE_TBB OFF CACHE BOOL "" FORCE) - if(MSVC) - set(VTK_MODULE_ENABLE_VTK_ParallelDIY "NO" CACHE STRING "" FORCE) - set(VTK_MODULE_ENABLE_VTK_InteractionStyle "NO" CACHE STRING "" FORCE) + if(NOT VIENNALS_PACKAGE_PYTHON) + find_package(VTK 9.0.0 QUIET) endif() - CPMFindPackage( - NAME VTK - GIT_TAG v9.3.1 - VERSION 9.0.0 - GIT_REPOSITORY "https://gitlab.kitware.com/vtk/vtk" - EXCLUDE_FROM_ALL ${VIENNALS_BUILD_PYTHON} - OPTIONS ${VTK_OPTIONS}) + if(VTK_FOUND) + message(STATUS "[ViennaLS] Using system VTK ${VTK_VERSION}") + else() + message(STATUS "[ViennaLS] Using bundled VTK v9.3.1") + + # Apply CPM-style options manually because DOWNLOAD_ONLY does not configure VTK. + foreach(_vtk_option IN LISTS VTK_OPTIONS) + if(_vtk_option MATCHES "^([^ ]+) +(.*)$") + set("${CMAKE_MATCH_1}" "${CMAKE_MATCH_2}" CACHE STRING "" FORCE) + else() + message(FATAL_ERROR "[ViennaLS] Invalid VTK option: ${_vtk_option}") + endif() + endforeach() + + CPMAddPackage( + NAME VTK + GIT_TAG v9.3.1 + GIT_REPOSITORY "https://gitlab.kitware.com/vtk/vtk" + DOWNLOAD_ONLY YES) + + if(VTK_ADDED) + viennals_patch_vtk_msvc_stdext("${VTK_SOURCE_DIR}") + + if(VIENNALS_BUILD_PYTHON) + add_subdirectory("${VTK_SOURCE_DIR}" "${VTK_BINARY_DIR}" EXCLUDE_FROM_ALL) + else() + add_subdirectory("${VTK_SOURCE_DIR}" "${VTK_BINARY_DIR}") + endif() + endif() + endif() message(STATUS "[ViennaLS] VTK_SMP_IMPLEMENTATION_TYPE=${VTK_SMP_IMPLEMENTATION_TYPE}") message(STATUS "[ViennaLS] VTK_SMP_ENABLE_OPENMP=${VTK_SMP_ENABLE_OPENMP}") @@ -384,26 +382,18 @@ elseif(VIENNALS_USE_VTK) VTK::IOXML VTK::FiltersCore VTK::FiltersGeneral - VTK::FiltersGeometry - CACHE INTERNAL "VTK Libraries") + VTK::FiltersGeometry) if(VIENNALS_VTK_RENDERING) list( APPEND VTK_LIBRARIES VTK::RenderingCore VTK::RenderingOpenGL2 + VTK::InteractionStyle VTK::RenderingUI VTK::RenderingFreeType VTK::RenderingAnnotation VTK::IOImage) - - if(NOT MSVC) - list( - APPEND - VTK_LIBRARIES - VTK::InteractionStyle) - endif() - target_compile_definitions(${PROJECT_NAME} INTERFACE VIENNALS_VTK_RENDERING=1) endif() target_link_libraries(${PROJECT_NAME} INTERFACE ${VTK_LIBRARIES}) diff --git a/cmake/vtk.cmake b/cmake/vtk.cmake index 9ed5faf4..ffc837bb 100644 --- a/cmake/vtk.cmake +++ b/cmake/vtk.cmake @@ -58,3 +58,54 @@ macro(import_vtk_python) message(STATUS "[ViennaLS] Successfully created VTK::PythonLibs target") endmacro() + +function(viennals_patch_vtk_msvc_stdext VTK_SOURCE_DIR) + if(NOT MSVC) + return() + endif() + + set(_vtk_fmt_header + "${VTK_SOURCE_DIR}/ThirdParty/diy2/vtkdiy2/include/vtkdiy2/fmt/format.h") + + if(NOT EXISTS "${_vtk_fmt_header}") + message( + WARNING + "[ViennaLS] Could not find VTK diy2/fmt header for MSVC stdext patch: ${_vtk_fmt_header}" + ) + return() + endif() + + file(READ "${_vtk_fmt_header}" _vtk_fmt_contents) + + set(_patched_guard + "#if defined(_SECURE_SCL) && (!defined(_MSC_VER) || _MSC_VER < 1951)") + + string(FIND "${_vtk_fmt_contents}" "${_patched_guard}" _already_patched) + + if(NOT _already_patched EQUAL -1) + message(STATUS "[ViennaLS] VTK MSVC stdext patch already applied") + return() + endif() + + set(_old_guard "#ifdef _SECURE_SCL") + + string(FIND "${_vtk_fmt_contents}" "${_old_guard}" _old_guard_pos) + + if(_old_guard_pos EQUAL -1) + message( + WARNING + "[ViennaLS] VTK MSVC stdext patch was not applied; expected guard not found in ${_vtk_fmt_header}" + ) + return() + endif() + + string(REPLACE + "${_old_guard}" + "${_patched_guard}" + _vtk_fmt_contents + "${_vtk_fmt_contents}") + + file(WRITE "${_vtk_fmt_header}" "${_vtk_fmt_contents}") + + message(STATUS "[ViennaLS] Applied VTK MSVC stdext patch") +endfunction() \ No newline at end of file From 5eab553652fee3d55318e1f0c5369b33a61b02e1 Mon Sep 17 00:00:00 2001 From: filipovic Date: Thu, 18 Jun 2026 14:10:00 +0200 Subject: [PATCH 16/35] add patch for omp_set_nested warning, add macos-15-intel workflow, add packaged wheel tests --- .github/workflows/python.yml | 20 +++++++++++- CMakeLists.txt | 4 ++- cmake/vtk.cmake | 59 ++++++++++++++++++++++++++++++++++++ pyproject.toml | 4 +-- 4 files changed, 82 insertions(+), 5 deletions(-) diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index dcc9a97f..c9add103 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -24,6 +24,7 @@ jobs: - os: ubuntu-latest container: ghcr.io/viennatools/vienna-builder:cuda-suite-python-nocuda - os: windows-latest + - os: macos-15-intel - os: macos-latest runs-on: ${{ matrix.os }} @@ -59,7 +60,7 @@ jobs: New-Item -ItemType Directory -Force -Path "${{ env.VCPKG_DEFAULT_BINARY_CACHE }}" - name: 📋 Install MacOS Dependencies - if: ${{ matrix.os == 'macos-latest' }} + if: ${{ startsWith(matrix.os, 'macos-') }} run: brew install vtk - name: 🦥 Cache vcpkg binary @@ -113,7 +114,12 @@ jobs: - os: windows-latest skip: "cp36-* cp37-* cp38-* cp39-* pp37-* pp38-* pp39-*" + - os: macos-15-intel + archs: x86_64 + skip: "cp36-* cp37-* cp38-* cp39-* cp310-* pp37-* pp38-* pp39-*" + - os: macos-latest + archs: arm64 skip: "cp36-* cp37-* cp38-* cp39-* cp310-* pp37-* pp38-* pp39-*" runs-on: ${{ matrix.os }} @@ -141,10 +147,16 @@ jobs: run: python -m cibuildwheel --output-dir wheelhouse env: CIBW_SKIP: ${{ matrix.skip }} + CIBW_TEST_COMMAND: >- + python -c "import viennals; + print(viennals.__file__); + print(viennals.d2); + print(viennals.d3)" CIBW_CONFIG_SETTINGS: >- cmake.define.VIENNALS_PACKAGE_PYTHON=ON cmake.define.VIENNALS_IS_CI=ON cmake.define.VIENNALS_VTK_RENDERING=ON + cmake.define.USE_IPO=OFF - name: 🏗️ Build Wheels (Other) if: ${{ matrix.os != 'ubuntu-latest' }} @@ -152,6 +164,12 @@ jobs: env: CIBW_SKIP: ${{ matrix.skip }} CIBW_ARCHS_WINDOWS: auto64 + CIBW_ARCHS_MACOS: ${{ matrix.archs }} + CIBW_TEST_COMMAND: >- + python -c "import viennals; + print(viennals.__file__); + print(viennals.d2); + print(viennals.d3)" CIBW_CONFIG_SETTINGS: >- cmake.define.VIENNALS_PACKAGE_PYTHON=ON cmake.define.VIENNALS_IS_CI=ON diff --git a/CMakeLists.txt b/CMakeLists.txt index c1dcf05e..3f67e4f0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -353,6 +353,7 @@ elseif(VIENNALS_USE_VTK) if(VTK_ADDED) viennals_patch_vtk_msvc_stdext("${VTK_SOURCE_DIR}") + viennals_patch_vtk_openmp_nested("${VTK_SOURCE_DIR}") if(VIENNALS_BUILD_PYTHON) add_subdirectory("${VTK_SOURCE_DIR}" "${VTK_BINARY_DIR}" EXCLUDE_FROM_ALL) @@ -382,7 +383,8 @@ elseif(VIENNALS_USE_VTK) VTK::IOXML VTK::FiltersCore VTK::FiltersGeneral - VTK::FiltersGeometry) + VTK::FiltersGeometry + CACHE INTERNAL "VTK Libraries") if(VIENNALS_VTK_RENDERING) list( APPEND diff --git a/cmake/vtk.cmake b/cmake/vtk.cmake index ffc837bb..509701c3 100644 --- a/cmake/vtk.cmake +++ b/cmake/vtk.cmake @@ -108,4 +108,63 @@ function(viennals_patch_vtk_msvc_stdext VTK_SOURCE_DIR) file(WRITE "${_vtk_fmt_header}" "${_vtk_fmt_contents}") message(STATUS "[ViennaLS] Applied VTK MSVC stdext patch") +endfunction() + +function(viennals_patch_vtk_openmp_nested VTK_SOURCE_DIR) + set(_vtk_smp_openmp + "${VTK_SOURCE_DIR}/Common/Core/SMP/OpenMP/vtkSMPTools.cxx") + + if(NOT EXISTS "${_vtk_smp_openmp}") + message( + WARNING + "[ViennaLS] Could not find VTK OpenMP SMP source for omp_set_nested patch: ${_vtk_smp_openmp}" + ) + return() + endif() + + file(READ "${_vtk_smp_openmp}" _vtk_smp_contents) + + string(FIND "${_vtk_smp_contents}" "VIENNALS_PATCH_OMP_SET_NESTED" _already_patched) + + if(NOT _already_patched EQUAL -1) + message(STATUS "[ViennaLS] VTK OpenMP nested-parallelism patch already applied") + return() + endif() + + string(FIND "${_vtk_smp_contents}" "omp_set_nested(" _has_set_nested) + + if(_has_set_nested EQUAL -1) + message(STATUS "[ViennaLS] VTK OpenMP nested-parallelism patch not needed") + return() + endif() + + # Replace: + # omp_set_nested(isNested); + # + # with the modern OpenMP 5.0 equivalent when available. + # + # OpenMP semantics: + # omp_set_nested(true) -> max-active-levels = supported active levels + # omp_set_nested(false) -> max-active-levels = 1 + string(REGEX REPLACE + "omp_set_nested\\(([^\\)]*)\\);" + "#if defined(_OPENMP) && _OPENMP >= 201811\n" + " /* VIENNALS_PATCH_OMP_SET_NESTED */\n" + " omp_set_max_active_levels((\\1) ? omp_get_supported_active_levels() : 1);\n" + "#else\n" + " omp_set_nested(\\1);\n" + "#endif" + _vtk_smp_contents + "${_vtk_smp_contents}") + + # Also avoid the matching deprecated query routine if VTK uses it. + string(REGEX REPLACE + "omp_get_nested\\(\\)" + "/* VIENNALS_PATCH_OMP_GET_NESTED */ (omp_get_max_active_levels() > 1)" + _vtk_smp_contents + "${_vtk_smp_contents}") + + file(WRITE "${_vtk_smp_openmp}" "${_vtk_smp_contents}") + + message(STATUS "[ViennaLS] Applied VTK OpenMP nested-parallelism patch") endfunction() \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 1070a706..4b5cc346 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,7 +20,5 @@ Issues = "https://github.com/ViennaTools/ViennaLS/issues" [tool.scikit-build] build-dir = "build" -cmake.args = [ - "-DVIENNALS_BUILD_PYTHON=ON", -] +cmake.args = ["-DVIENNALS_BUILD_PYTHON=ON"] wheel.packages = ["python/viennals"] From 9a493db19550e0264c90d801e3fe588183d024fe Mon Sep 17 00:00:00 2001 From: filipovic Date: Thu, 18 Jun 2026 14:18:07 +0200 Subject: [PATCH 17/35] install macos depencencies to both macos builds --- .github/workflows/build.yml | 2 +- .github/workflows/python.yml | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4dae3029..cb0de092 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -48,7 +48,7 @@ jobs: os: ${{ matrix.os }} - name: 📋 Install MacOS Dependencies - if: ${{ matrix.os == 'macos-latest' }} + if: ${{ startsWith(matrix.os, 'macos-') }} run: brew install vtk - name: 🖥️ Setup vcpkg (Windows) diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index c9add103..bac54ec7 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -156,7 +156,6 @@ jobs: cmake.define.VIENNALS_PACKAGE_PYTHON=ON cmake.define.VIENNALS_IS_CI=ON cmake.define.VIENNALS_VTK_RENDERING=ON - cmake.define.USE_IPO=OFF - name: 🏗️ Build Wheels (Other) if: ${{ matrix.os != 'ubuntu-latest' }} From 848113aa65e6307f1d9e05c6cef4045f46b695fb Mon Sep 17 00:00:00 2001 From: filipovic Date: Thu, 18 Jun 2026 14:21:29 +0200 Subject: [PATCH 18/35] add macos-15-intel to build and action yaml --- .github/actions/setup/action.yml | 6 +++--- .github/workflows/build.yml | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml index eabde0a8..aab6b045 100644 --- a/.github/actions/setup/action.yml +++ b/.github/actions/setup/action.yml @@ -20,7 +20,7 @@ runs: - name: 📋 Install OpenMP shell: bash - if: ${{ inputs.os == 'macos-latest' }} + if: ${{ startsWith(matrix.os, 'macos-') }} run: | brew install libomp echo "OpenMP_ROOT=$(brew --prefix)/opt/libomp" >> $GITHUB_ENV @@ -36,7 +36,7 @@ runs: echo "CMAKE_GIT_COMMAND=$(which git)" >> "$GITHUB_ENV" - name: Install Git LFS and configure (macOS) - if: ${{ inputs.os == 'macos-latest' }} + if: ${{ startsWith(matrix.os, 'macos-') }} shell: bash run: | brew install git-lfs || true @@ -47,7 +47,7 @@ runs: - name: 💻 Setup Deployment Target shell: bash - if: ${{ inputs.os == 'macos-latest' }} + if: ${{ startsWith(matrix.os, 'macos-') }} run: | echo "MACOSX_DEPLOYMENT_TARGET=15.0" >> $GITHUB_ENV diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index cb0de092..959353e7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -18,6 +18,7 @@ jobs: - Debug os: + - macos-15-intel - macos-latest - windows-latest From a9873ce94507e65c00ba69c3bc91751808627bb7 Mon Sep 17 00:00:00 2001 From: filipovic Date: Thu, 18 Jun 2026 14:28:17 +0200 Subject: [PATCH 19/35] remove cache internal for vtk libs --- .github/workflows/python.yml | 1 + CMakeLists.txt | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index bac54ec7..c9add103 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -156,6 +156,7 @@ jobs: cmake.define.VIENNALS_PACKAGE_PYTHON=ON cmake.define.VIENNALS_IS_CI=ON cmake.define.VIENNALS_VTK_RENDERING=ON + cmake.define.USE_IPO=OFF - name: 🏗️ Build Wheels (Other) if: ${{ matrix.os != 'ubuntu-latest' }} diff --git a/CMakeLists.txt b/CMakeLists.txt index 3f67e4f0..221f2d14 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -383,8 +383,7 @@ elseif(VIENNALS_USE_VTK) VTK::IOXML VTK::FiltersCore VTK::FiltersGeneral - VTK::FiltersGeometry - CACHE INTERNAL "VTK Libraries") + VTK::FiltersGeometry) if(VIENNALS_VTK_RENDERING) list( APPEND From 12b6284a5df38b71b2782794ba869134ab30e1bc Mon Sep 17 00:00:00 2001 From: filipov Date: Thu, 18 Jun 2026 14:55:08 +0200 Subject: [PATCH 20/35] fix omp_set_nested patch, windows viennals.libs missing --- cmake/vtk.cmake | 17 +++++++++---- python/CMakeLists.txt | 56 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 67 insertions(+), 6 deletions(-) diff --git a/cmake/vtk.cmake b/cmake/vtk.cmake index 509701c3..16574374 100644 --- a/cmake/vtk.cmake +++ b/cmake/vtk.cmake @@ -141,16 +141,23 @@ function(viennals_patch_vtk_openmp_nested VTK_SOURCE_DIR) # Replace: # omp_set_nested(isNested); # - # with the modern OpenMP 5.0 equivalent when available. + # with the modern max-active-levels control. + # + # Apple Clang/Homebrew libomp can expose omp_set_max_active_levels() while + # still advertising an older _OPENMP value, so gating on the 201811 macro + # leaves the deprecated API call in place on macOS. # # OpenMP semantics: - # omp_set_nested(true) -> max-active-levels = supported active levels + # omp_set_nested(true) -> enable nested parallelism # omp_set_nested(false) -> max-active-levels = 1 + # + # Setting a large max-active-levels value is clamped by the runtime to the + # supported limit, so it is a practical substitute for the "true" case. string(REGEX REPLACE "omp_set_nested\\(([^\\)]*)\\);" - "#if defined(_OPENMP) && _OPENMP >= 201811\n" + "#if defined(_OPENMP) && _OPENMP >= 200805\n" " /* VIENNALS_PATCH_OMP_SET_NESTED */\n" - " omp_set_max_active_levels((\\1) ? omp_get_supported_active_levels() : 1);\n" + " omp_set_max_active_levels((\\1) ? 1024 : 1);\n" "#else\n" " omp_set_nested(\\1);\n" "#endif" @@ -167,4 +174,4 @@ function(viennals_patch_vtk_openmp_nested VTK_SOURCE_DIR) file(WRITE "${_vtk_smp_openmp}" "${_vtk_smp_contents}") message(STATUS "[ViennaLS] Applied VTK OpenMP nested-parallelism patch") -endfunction() \ No newline at end of file +endfunction() diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index b7c8a097..79209dbd 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -100,6 +100,60 @@ if((VIENNALS_PACKAGE_PYTHON AND NOT APPLE) OR MSVC) # Other package builds still need this staged dependency folder. viennacore_setup_vtk_env(${MOD} ${VIENNALS_LIB_FOLDER}) + if(MSVC) + # /openmp:llvm links against the LLVM OpenMP runtime, which is usually + # available on GitHub runners but not on end-user Windows machines. + get_filename_component(_VIENNALS_CLANG_BIN_DIR "${CMAKE_CXX_COMPILER}" DIRECTORY) + set(_VIENNALS_OPENMP_DLL_CANDIDATES) + + if(DEFINED ENV{VCINSTALLDIR}) + list( + APPEND + _VIENNALS_OPENMP_DLL_CANDIDATES + "$ENV{VCINSTALLDIR}/Tools/Llvm/bin/libomp140.x86_64.dll" + "$ENV{VCINSTALLDIR}/Tools/Llvm/x64/bin/libomp140.x86_64.dll") + endif() + + if(DEFINED ENV{VCToolsInstallDir}) + list( + APPEND + _VIENNALS_OPENMP_DLL_CANDIDATES + "$ENV{VCToolsInstallDir}/../../Llvm/bin/libomp140.x86_64.dll" + "$ENV{VCToolsInstallDir}/../../Llvm/x64/bin/libomp140.x86_64.dll") + endif() + + list( + APPEND + _VIENNALS_OPENMP_DLL_CANDIDATES + "${_VIENNALS_CLANG_BIN_DIR}/../../../../../../Tools/Llvm/bin/libomp140.x86_64.dll" + "${_VIENNALS_CLANG_BIN_DIR}/../../../../../../Tools/Llvm/x64/bin/libomp140.x86_64.dll") + + unset(_VIENNALS_OPENMP_DLL) + foreach(_VIENNALS_OPENMP_DLL_CANDIDATE IN LISTS _VIENNALS_OPENMP_DLL_CANDIDATES) + get_filename_component( + _VIENNALS_OPENMP_DLL_CANDIDATE_REAL "${_VIENNALS_OPENMP_DLL_CANDIDATE}" ABSOLUTE) + if(EXISTS "${_VIENNALS_OPENMP_DLL_CANDIDATE_REAL}") + set(_VIENNALS_OPENMP_DLL "${_VIENNALS_OPENMP_DLL_CANDIDATE_REAL}") + break() + endif() + endforeach() + + if(_VIENNALS_OPENMP_DLL) + add_custom_command( + TARGET ${MOD} + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E make_directory "${VIENNALS_LIB_FOLDER}" + COMMAND ${CMAKE_COMMAND} -E copy_if_different "${_VIENNALS_OPENMP_DLL}" + "${VIENNALS_LIB_FOLDER}/") + else() + message( + WARNING + "[ViennaLS] Could not locate libomp140.x86_64.dll. Windows wheels built " + "with /openmp:llvm may fail to import on machines without the LLVM OpenMP runtime." + ) + endif() + endif() + if(VIENNALS_USE_GPU) foreach(_CUDA_TARGET CUDA::cudart CUDA::cusparse) if(TARGET ${_CUDA_TARGET}) @@ -113,7 +167,7 @@ if((VIENNALS_PACKAGE_PYTHON AND NOT APPLE) OR MSVC) endif() endif() -if(NOT VIENNALS_PACKAGE_PYTHON) +if((VIENNALS_PACKAGE_PYTHON AND NOT APPLE) OR MSVC) install( DIRECTORY ${VIENNALS_LIB_FOLDER} DESTINATION . From d2ffbbc0dcb7adbf6ba7705038520e358c27da7e Mon Sep 17 00:00:00 2001 From: filipovic Date: Thu, 18 Jun 2026 21:46:21 +0200 Subject: [PATCH 21/35] revert copying entire lib directory, only copy dll files for windows --- python/CMakeLists.txt | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index 79209dbd..09df10e2 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -167,9 +167,21 @@ if((VIENNALS_PACKAGE_PYTHON AND NOT APPLE) OR MSVC) endif() endif() -if((VIENNALS_PACKAGE_PYTHON AND NOT APPLE) OR MSVC) +if(NOT VIENNALS_PACKAGE_PYTHON) + # Dev/test builds: install the whole lib folder (VTK DLLs from vcpkg on + # Windows, VTK .so on Linux, etc.) so the module can be imported in-place. + install( + DIRECTORY ${VIENNALS_LIB_FOLDER} + DESTINATION . + OPTIONAL) +elseif(MSVC) + # Package build on Windows: static VTK is already compiled into _core.pyd. + # Only DLLs are needed at runtime (libomp140.x86_64.dll etc.). + # Installing the full VIENNALS_LIB_FOLDER would add hundreds of MBs of .lib + # files; restrict to *.dll only. install( DIRECTORY ${VIENNALS_LIB_FOLDER} DESTINATION . + FILES_MATCHING PATTERN "*.dll" OPTIONAL) endif() From d8ea8521e47567a93946959859754116ce7dd17c Mon Sep 17 00:00:00 2001 From: filipovic Date: Thu, 18 Jun 2026 22:18:15 +0200 Subject: [PATCH 22/35] fix cmake syntax error, --- python/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index 09df10e2..09e93b18 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -182,6 +182,6 @@ elseif(MSVC) install( DIRECTORY ${VIENNALS_LIB_FOLDER} DESTINATION . - FILES_MATCHING PATTERN "*.dll" - OPTIONAL) + OPTIONAL + FILES_MATCHING PATTERN "*.dll") endif() From c38474830a1a254cdc1cc50200a58517e415a260 Mon Sep 17 00:00:00 2001 From: filipovic Date: Fri, 19 Jun 2026 08:51:09 +0200 Subject: [PATCH 23/35] cache vcpkg for windows --- .github/workflows/python.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index c9add103..da1a8238 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -63,15 +63,16 @@ jobs: if: ${{ startsWith(matrix.os, 'macos-') }} run: brew install vtk - - name: 🦥 Cache vcpkg binary + - name: 🦥 Cache vcpkg installed if: ${{ matrix.os == 'windows-latest' }} + id: vcpkg-installed-cache uses: actions/cache@v4 with: - path: ${{ env.VCPKG_DEFAULT_BINARY_CACHE }} - key: vcpkg-${{ matrix.os }}-Release-${{ env.VCPKG_COMMIT }} + path: ${{ github.workspace }}/vcpkg_installed + key: vcpkg-installed-${{ matrix.os }}-${{ env.VCPKG_COMMIT }}-${{ hashFiles('vcpkg.json') }} - name: 🛠️ Build VTK (Windows) - if: ${{ matrix.os == 'windows-latest' }} + if: ${{ matrix.os == 'windows-latest' && steps.vcpkg-installed-cache.outputs.cache-hit != 'true' }} shell: pwsh run: | ./vcpkg/vcpkg install --triplet x64-windows From 2b413215de9b796aa633a0c53bd30d5dd14afed5 Mon Sep 17 00:00:00 2001 From: filipov Date: Fri, 19 Jun 2026 09:00:55 +0200 Subject: [PATCH 24/35] update dll copying to libs --- python/CMakeLists.txt | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index 09e93b18..25fc2287 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -103,9 +103,20 @@ if((VIENNALS_PACKAGE_PYTHON AND NOT APPLE) OR MSVC) if(MSVC) # /openmp:llvm links against the LLVM OpenMP runtime, which is usually # available on GitHub runners but not on end-user Windows machines. - get_filename_component(_VIENNALS_CLANG_BIN_DIR "${CMAKE_CXX_COMPILER}" DIRECTORY) + set(CMAKE_INSTALL_OPENMP_LIBRARIES TRUE) + set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP TRUE) + include(InstallRequiredSystemLibraries) + + get_filename_component(_VIENNALS_COMPILER_BIN_DIR "${CMAKE_CXX_COMPILER}" DIRECTORY) set(_VIENNALS_OPENMP_DLL_CANDIDATES) + foreach(_VIENNALS_SYSTEM_RUNTIME IN LISTS CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS) + get_filename_component(_VIENNALS_SYSTEM_RUNTIME_NAME "${_VIENNALS_SYSTEM_RUNTIME}" NAME) + if(_VIENNALS_SYSTEM_RUNTIME_NAME MATCHES "^libomp.*\\.dll$") + list(APPEND _VIENNALS_OPENMP_DLL_CANDIDATES "${_VIENNALS_SYSTEM_RUNTIME}") + endif() + endforeach() + if(DEFINED ENV{VCINSTALLDIR}) list( APPEND @@ -125,8 +136,13 @@ if((VIENNALS_PACKAGE_PYTHON AND NOT APPLE) OR MSVC) list( APPEND _VIENNALS_OPENMP_DLL_CANDIDATES - "${_VIENNALS_CLANG_BIN_DIR}/../../../../../../Tools/Llvm/bin/libomp140.x86_64.dll" - "${_VIENNALS_CLANG_BIN_DIR}/../../../../../../Tools/Llvm/x64/bin/libomp140.x86_64.dll") + "${_VIENNALS_COMPILER_BIN_DIR}/libomp140.x86_64.dll" + "${_VIENNALS_COMPILER_BIN_DIR}/../libomp140.x86_64.dll" + "${_VIENNALS_COMPILER_BIN_DIR}/../../bin/libomp140.x86_64.dll" + "${_VIENNALS_COMPILER_BIN_DIR}/../../../../../Llvm/bin/libomp140.x86_64.dll" + "${_VIENNALS_COMPILER_BIN_DIR}/../../../../../Llvm/x64/bin/libomp140.x86_64.dll" + "${_VIENNALS_COMPILER_BIN_DIR}/../../../../../../Tools/Llvm/bin/libomp140.x86_64.dll" + "${_VIENNALS_COMPILER_BIN_DIR}/../../../../../../Tools/Llvm/x64/bin/libomp140.x86_64.dll") unset(_VIENNALS_OPENMP_DLL) foreach(_VIENNALS_OPENMP_DLL_CANDIDATE IN LISTS _VIENNALS_OPENMP_DLL_CANDIDATES) @@ -139,12 +155,26 @@ if((VIENNALS_PACKAGE_PYTHON AND NOT APPLE) OR MSVC) endforeach() if(_VIENNALS_OPENMP_DLL) + message(STATUS "[ViennaLS] Bundling LLVM OpenMP runtime: ${_VIENNALS_OPENMP_DLL}") add_custom_command( TARGET ${MOD} POST_BUILD COMMAND ${CMAKE_COMMAND} -E make_directory "${VIENNALS_LIB_FOLDER}" COMMAND ${CMAKE_COMMAND} -E copy_if_different "${_VIENNALS_OPENMP_DLL}" - "${VIENNALS_LIB_FOLDER}/") + "${VIENNALS_LIB_FOLDER}/" + VERBATIM) + + if(VIENNALS_PACKAGE_PYTHON) + install( + PROGRAMS "${_VIENNALS_OPENMP_DLL}" + DESTINATION ${PKG}.libs) + endif() + elseif(VIENNALS_PACKAGE_PYTHON) + message( + FATAL_ERROR + "[ViennaLS] Could not locate libomp140.x86_64.dll for a Windows wheel build. " + "The produced wheel would fail to import on machines without the LLVM OpenMP runtime." + ) else() message( WARNING From b1f8af306b8e9bf78c4b1edd35040bc95cadaba8 Mon Sep 17 00:00:00 2001 From: filipov Date: Fri, 19 Jun 2026 09:23:30 +0200 Subject: [PATCH 25/35] add debug lines --- .github/workflows/python.yml | 25 +++++++++ cmake/vtk.cmake | 106 ++++++++++++++++------------------- python/CMakeLists.txt | 36 +++++++++++- 3 files changed, 108 insertions(+), 59 deletions(-) diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index da1a8238..f9caff8b 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -143,6 +143,31 @@ jobs: - name: 🛞 CIBuildWheel run: pip install cibuildwheel==3.4.0 --break-system-packages + - name: Inspect OpenMP runtime (Windows) + if: ${{ matrix.os == 'windows-latest' }} + shell: pwsh + run: | + $roots = @( + $env:llvmX64, + $env:VCToolsRedistDir, + $env:VCINSTALLDIR, + $env:VCToolsInstallDir, + 'C:\Program Files\LLVM\bin', + 'C:\Program Files (x86)\LLVM\bin' + ) | Where-Object { $_ -and (Test-Path $_) } | Select-Object -Unique + + $matches = @() + foreach ($root in $roots) { + Write-Host "Searching $root" + $matches += Get-ChildItem -Path $root -Filter libomp140.x86_64.dll -Recurse -ErrorAction SilentlyContinue + } + + if ($matches.Count -eq 0) { + Write-Warning "libomp140.x86_64.dll was not found in the Visual Studio or LLVM runtime locations." + } else { + $matches | Select-Object -ExpandProperty FullName + } + - name: 🏗️ Build Wheels (Linux) if: ${{ matrix.os == 'ubuntu-latest' }} run: python -m cibuildwheel --output-dir wheelhouse diff --git a/cmake/vtk.cmake b/cmake/vtk.cmake index 16574374..81066d12 100644 --- a/cmake/vtk.cmake +++ b/cmake/vtk.cmake @@ -111,67 +111,57 @@ function(viennals_patch_vtk_msvc_stdext VTK_SOURCE_DIR) endfunction() function(viennals_patch_vtk_openmp_nested VTK_SOURCE_DIR) - set(_vtk_smp_openmp - "${VTK_SOURCE_DIR}/Common/Core/SMP/OpenMP/vtkSMPTools.cxx") - - if(NOT EXISTS "${_vtk_smp_openmp}") - message( - WARNING - "[ViennaLS] Could not find VTK OpenMP SMP source for omp_set_nested patch: ${_vtk_smp_openmp}" - ) - return() - endif() - - file(READ "${_vtk_smp_openmp}" _vtk_smp_contents) - - string(FIND "${_vtk_smp_contents}" "VIENNALS_PATCH_OMP_SET_NESTED" _already_patched) - - if(NOT _already_patched EQUAL -1) - message(STATUS "[ViennaLS] VTK OpenMP nested-parallelism patch already applied") + file( + GLOB_RECURSE _vtk_smp_openmp_sources + "${VTK_SOURCE_DIR}/Common/Core/SMP/OpenMP/*.cxx" + "${VTK_SOURCE_DIR}/Common/Core/SMP/OpenMP/*.txx" + "${VTK_SOURCE_DIR}/Common/Core/SMP/OpenMP/*.h") + + if(NOT _vtk_smp_openmp_sources) + message(WARNING "[ViennaLS] Could not find VTK OpenMP SMP sources for omp_set_nested patch") return() endif() - string(FIND "${_vtk_smp_contents}" "omp_set_nested(" _has_set_nested) - - if(_has_set_nested EQUAL -1) + set(_vtk_smp_openmp_patch_count 0) + + foreach(_vtk_smp_openmp IN LISTS _vtk_smp_openmp_sources) + file(READ "${_vtk_smp_openmp}" _vtk_smp_contents) + + string(FIND "${_vtk_smp_contents}" "omp_set_nested(" _has_set_nested) + string(FIND "${_vtk_smp_contents}" "omp_get_nested()" _has_get_nested) + + if(_has_set_nested EQUAL -1 AND _has_get_nested EQUAL -1) + continue() + endif() + + if(NOT _has_set_nested EQUAL -1) + # omp_set_nested is deprecated. Use max-active-levels directly so the + # deprecated call is removed even when a compiler reports an old _OPENMP + # macro while linking against a modern runtime. + string(REGEX REPLACE + "omp_set_nested\\(([^\\)]*)\\);" + "/* VIENNALS_PATCH_OMP_SET_NESTED */\n" + " omp_set_max_active_levels((\\1) ? 1024 : 1);" + _vtk_smp_contents + "${_vtk_smp_contents}") + endif() + + if(NOT _has_get_nested EQUAL -1) + string(REGEX REPLACE + "omp_get_nested\\(\\)" + "/* VIENNALS_PATCH_OMP_GET_NESTED */ (omp_get_max_active_levels() > 1)" + _vtk_smp_contents + "${_vtk_smp_contents}") + endif() + + file(WRITE "${_vtk_smp_openmp}" "${_vtk_smp_contents}") + math(EXPR _vtk_smp_openmp_patch_count "${_vtk_smp_openmp_patch_count} + 1") + message(STATUS "[ViennaLS] Patched VTK OpenMP nested-parallelism source: ${_vtk_smp_openmp}") + endforeach() + + if(_vtk_smp_openmp_patch_count EQUAL 0) message(STATUS "[ViennaLS] VTK OpenMP nested-parallelism patch not needed") - return() + else() + message(STATUS "[ViennaLS] Applied VTK OpenMP nested-parallelism patch") endif() - - # Replace: - # omp_set_nested(isNested); - # - # with the modern max-active-levels control. - # - # Apple Clang/Homebrew libomp can expose omp_set_max_active_levels() while - # still advertising an older _OPENMP value, so gating on the 201811 macro - # leaves the deprecated API call in place on macOS. - # - # OpenMP semantics: - # omp_set_nested(true) -> enable nested parallelism - # omp_set_nested(false) -> max-active-levels = 1 - # - # Setting a large max-active-levels value is clamped by the runtime to the - # supported limit, so it is a practical substitute for the "true" case. - string(REGEX REPLACE - "omp_set_nested\\(([^\\)]*)\\);" - "#if defined(_OPENMP) && _OPENMP >= 200805\n" - " /* VIENNALS_PATCH_OMP_SET_NESTED */\n" - " omp_set_max_active_levels((\\1) ? 1024 : 1);\n" - "#else\n" - " omp_set_nested(\\1);\n" - "#endif" - _vtk_smp_contents - "${_vtk_smp_contents}") - - # Also avoid the matching deprecated query routine if VTK uses it. - string(REGEX REPLACE - "omp_get_nested\\(\\)" - "/* VIENNALS_PATCH_OMP_GET_NESTED */ (omp_get_max_active_levels() > 1)" - _vtk_smp_contents - "${_vtk_smp_contents}") - - file(WRITE "${_vtk_smp_openmp}" "${_vtk_smp_contents}") - - message(STATUS "[ViennaLS] Applied VTK OpenMP nested-parallelism patch") endfunction() diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index 25fc2287..e50d2491 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -133,6 +133,33 @@ if((VIENNALS_PACKAGE_PYTHON AND NOT APPLE) OR MSVC) "$ENV{VCToolsInstallDir}/../../Llvm/x64/bin/libomp140.x86_64.dll") endif() + if(DEFINED ENV{llvmX64}) + list(APPEND _VIENNALS_OPENMP_DLL_CANDIDATES "$ENV{llvmX64}/libomp140.x86_64.dll") + endif() + + if(DEFINED ENV{VCToolsRedistDir}) + file( + GLOB_RECURSE _VIENNALS_OPENMP_REDIST_DLLS + "$ENV{VCToolsRedistDir}/*libomp140.x86_64.dll") + list(APPEND _VIENNALS_OPENMP_DLL_CANDIDATES ${_VIENNALS_OPENMP_REDIST_DLLS}) + endif() + + if(DEFINED ENV{VCINSTALLDIR}) + file( + GLOB_RECURSE _VIENNALS_OPENMP_VC_REDIST_DLLS + "$ENV{VCINSTALLDIR}/Redist/MSVC/*libomp140.x86_64.dll") + list(APPEND _VIENNALS_OPENMP_DLL_CANDIDATES ${_VIENNALS_OPENMP_VC_REDIST_DLLS}) + endif() + + find_file( + _VIENNALS_OPENMP_DLL_FROM_PATH + NAMES libomp140.x86_64.dll + PATHS ENV PATH + NO_DEFAULT_PATH) + if(_VIENNALS_OPENMP_DLL_FROM_PATH) + list(APPEND _VIENNALS_OPENMP_DLL_CANDIDATES "${_VIENNALS_OPENMP_DLL_FROM_PATH}") + endif() + list( APPEND _VIENNALS_OPENMP_DLL_CANDIDATES @@ -144,10 +171,14 @@ if((VIENNALS_PACKAGE_PYTHON AND NOT APPLE) OR MSVC) "${_VIENNALS_COMPILER_BIN_DIR}/../../../../../../Tools/Llvm/bin/libomp140.x86_64.dll" "${_VIENNALS_COMPILER_BIN_DIR}/../../../../../../Tools/Llvm/x64/bin/libomp140.x86_64.dll") + list(REMOVE_DUPLICATES _VIENNALS_OPENMP_DLL_CANDIDATES) + unset(_VIENNALS_OPENMP_DLL) + set(_VIENNALS_OPENMP_DLL_SEARCH_LOG) foreach(_VIENNALS_OPENMP_DLL_CANDIDATE IN LISTS _VIENNALS_OPENMP_DLL_CANDIDATES) get_filename_component( _VIENNALS_OPENMP_DLL_CANDIDATE_REAL "${_VIENNALS_OPENMP_DLL_CANDIDATE}" ABSOLUTE) + list(APPEND _VIENNALS_OPENMP_DLL_SEARCH_LOG "${_VIENNALS_OPENMP_DLL_CANDIDATE_REAL}") if(EXISTS "${_VIENNALS_OPENMP_DLL_CANDIDATE_REAL}") set(_VIENNALS_OPENMP_DLL "${_VIENNALS_OPENMP_DLL_CANDIDATE_REAL}") break() @@ -170,10 +201,13 @@ if((VIENNALS_PACKAGE_PYTHON AND NOT APPLE) OR MSVC) DESTINATION ${PKG}.libs) endif() elseif(VIENNALS_PACKAGE_PYTHON) + string(REPLACE ";" "\n " _VIENNALS_OPENMP_DLL_SEARCH_LOG_TEXT + "${_VIENNALS_OPENMP_DLL_SEARCH_LOG}") message( FATAL_ERROR "[ViennaLS] Could not locate libomp140.x86_64.dll for a Windows wheel build. " - "The produced wheel would fail to import on machines without the LLVM OpenMP runtime." + "The produced wheel would fail to import on machines without the LLVM OpenMP runtime. " + "Searched:\n ${_VIENNALS_OPENMP_DLL_SEARCH_LOG_TEXT}" ) else() message( From 80cba853fb76e7fa88b92bebc3dfa115b6b2a30c Mon Sep 17 00:00:00 2001 From: filipov Date: Fri, 19 Jun 2026 10:35:04 +0200 Subject: [PATCH 26/35] inspect wheel contents, fix depreciated Node.js 20 --- .github/actions/setup/action.yml | 16 ++++++++---- .github/workflows/build.yml | 2 +- .github/workflows/docs.yml | 2 +- .github/workflows/format.yml | 4 +-- .github/workflows/python.yml | 43 ++++++++++++++++++++++++++------ 5 files changed, 50 insertions(+), 17 deletions(-) diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml index aab6b045..7cdfd47d 100644 --- a/.github/actions/setup/action.yml +++ b/.github/actions/setup/action.yml @@ -10,17 +10,24 @@ runs: using: "composite" steps: + - name: Remove unused Homebrew taps + shell: bash + if: ${{ startsWith(inputs.os, 'macos-') }} + run: | + brew untap aws/tap azure/bicep || true + - name: 🩹 Enable Long Paths shell: bash if: ${{ inputs.os == 'windows-latest' }} run: git config --system core.longpaths true - name: 🖥️ Enable MSVC Dev Console - uses: ilammy/msvc-dev-cmd@v1 + if: ${{ inputs.os == 'windows-latest' }} + uses: microsoft/setup-msbuild@v3 - name: 📋 Install OpenMP shell: bash - if: ${{ startsWith(matrix.os, 'macos-') }} + if: ${{ startsWith(inputs.os, 'macos-') }} run: | brew install libomp echo "OpenMP_ROOT=$(brew --prefix)/opt/libomp" >> $GITHUB_ENV @@ -36,7 +43,7 @@ runs: echo "CMAKE_GIT_COMMAND=$(which git)" >> "$GITHUB_ENV" - name: Install Git LFS and configure (macOS) - if: ${{ startsWith(matrix.os, 'macos-') }} + if: ${{ startsWith(inputs.os, 'macos-') }} shell: bash run: | brew install git-lfs || true @@ -47,7 +54,6 @@ runs: - name: 💻 Setup Deployment Target shell: bash - if: ${{ startsWith(matrix.os, 'macos-') }} + if: ${{ startsWith(inputs.os, 'macos-') }} run: | echo "MACOSX_DEPLOYMENT_TARGET=15.0" >> $GITHUB_ENV - diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 959353e7..0f4e67ec 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -41,7 +41,7 @@ jobs: steps: - name: 📥 Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: 🖥️ Setup Environment uses: ./.github/actions/setup diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index dcea44bb..aa3efba7 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -25,7 +25,7 @@ jobs: run: pacman --noconfirm -Syu doxygen git - name: 📥 Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: submodules: "recursive" diff --git a/.github/workflows/format.yml b/.github/workflows/format.yml index 850a285c..44963bfb 100644 --- a/.github/workflows/format.yml +++ b/.github/workflows/format.yml @@ -18,7 +18,7 @@ jobs: steps: - name: 📥 Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: set-safe-directory: true @@ -35,6 +35,6 @@ jobs: - name: 🔍 Check Format run: | - git config --global --add safe.directory $(pwd) # "set-safe-directory" seems bugged in actions/checkout@v4 + git config --global --add safe.directory $(pwd) # "set-safe-directory" seems bugged in actions/checkout@v5 cmake -B build cmake --build build --target format-check diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index f9caff8b..545ed581 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -38,7 +38,7 @@ jobs: steps: - name: 📥 Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: 🖥️ Setup Environment uses: ./.github/actions/setup @@ -98,7 +98,7 @@ jobs: ./venv/bin/python -c "import viennals; print(viennals.__doc__)" - name: 📦 Upload Artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: Pre-Built (${{ matrix.os }}) path: venv @@ -110,18 +110,18 @@ jobs: matrix: include: - os: ubuntu-latest - skip: "cp36-* cp37-* cp38-* cp39-* pp37-* pp38-* pp39-* *-manylinux_i686 *-musllinux_*" + skip: "cp38-* cp39-* *-manylinux_i686 *-musllinux_*" - os: windows-latest - skip: "cp36-* cp37-* cp38-* cp39-* pp37-* pp38-* pp39-*" + skip: "cp38-* cp39-*" - os: macos-15-intel archs: x86_64 - skip: "cp36-* cp37-* cp38-* cp39-* cp310-* pp37-* pp38-* pp39-*" + skip: "cp38-* cp39-* cp310-*" - os: macos-latest archs: arm64 - skip: "cp36-* cp37-* cp38-* cp39-* cp310-* pp37-* pp38-* pp39-*" + skip: "cp38-* cp39-* cp310-*" runs-on: ${{ matrix.os }} @@ -133,7 +133,7 @@ jobs: steps: - name: 📥 Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: 🖥️ Setup Environment uses: ./.github/actions/setup @@ -206,8 +206,11 @@ jobs: run: | python - <<'PY' import glob + import sys import zipfile + missing = [] + for wheel in glob.glob("wheelhouse/*.whl"): print("\n" + wheel) with zipfile.ZipFile(wheel) as zf: @@ -215,10 +218,34 @@ jobs: for entry in entries[:40]: size_mb = entry.file_size / 1024 / 1024 print(f"{size_mb:8.2f} MB {entry.filename}") + + names = [entry.filename for entry in entries] + if "win_amd64" in wheel: + libs = [name for name in names if name.startswith("viennals.libs/")] + openmp = [ + name + for name in libs + if name.lower() == "viennals.libs/libomp140.x86_64.dll" + ] + + print("\nWindows runtime libraries:") + for name in libs: + print(f" {name}") + + if not libs: + missing.append(f"{wheel}: missing viennals.libs/") + if not openmp: + missing.append(f"{wheel}: missing viennals.libs/libomp140.x86_64.dll") + + if missing: + print("\nWheel runtime checks failed:", file=sys.stderr) + for item in missing: + print(f" {item}", file=sys.stderr) + raise SystemExit(1) PY - name: 📦 Upload Artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: wheels-${{ matrix.os }} path: ./wheelhouse/*.whl From a41d67e545f90a0d0b25cc3cf938488b4299ef02 Mon Sep 17 00:00:00 2001 From: filipov Date: Fri, 19 Jun 2026 11:00:30 +0200 Subject: [PATCH 27/35] fix warnings --- .github/actions/setup/action.yml | 1 + CMakeLists.txt | 15 +++++++++++---- include/viennals/lsMesh.hpp | 4 ++-- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml index 7cdfd47d..e972b99b 100644 --- a/.github/actions/setup/action.yml +++ b/.github/actions/setup/action.yml @@ -14,6 +14,7 @@ runs: shell: bash if: ${{ startsWith(inputs.os, 'macos-') }} run: | + brew uninstall --formula azure/bicep/bicep || true brew untap aws/tap azure/bicep || true - name: 🩹 Enable Long Paths diff --git a/CMakeLists.txt b/CMakeLists.txt index 221f2d14..bd82dea7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -55,7 +55,15 @@ if(VIENNALS_BUILD_PYTHON) endif() if(MSVC) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -openmp:llvm /bigobj") + if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.30) + set(OpenMP_RUNTIME_MSVC + "llvm" + CACHE STRING "MSVC OpenMP runtime selected for FindOpenMP" FORCE) + else() + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -openmp:llvm") + endif() + + add_compile_options("$<$:/bigobj>") endif() # Reduce wheel size when packaging Python wheels. @@ -248,10 +256,9 @@ elseif(VIENNALS_USE_VTK) "VTK_LEGACY_REMOVE ON" # VTK threading backend. - # OpenMP gives full parallelism on all platforms. On MSVC the detected - # spec-date is 2.0 (from /openmp), but ViennaLS passes /openmp:llvm which + # OpenMP gives full parallelism on all platforms. On MSVC, CMake may still + # report an old OpenMP spec date, but OpenMP_RUNTIME_MSVC=llvm selects the LLVM runtime. # makes LLVM OpenMP 5.0 the actual runtime — the cmake atomics warning is - # cosmetic only. # # STDThread is intentionally kept OFF. vtkSMPToolsImpl.txx declares the # explicit specialisation of IsParallelScope() for STDThread, but diff --git a/include/viennals/lsMesh.hpp b/include/viennals/lsMesh.hpp index 4f1b3868..bb360619 100644 --- a/include/viennals/lsMesh.hpp +++ b/include/viennals/lsMesh.hpp @@ -179,11 +179,11 @@ template class Mesh { if (it != newNodes.end()) { adjusted = true; // if duplicate point, save it to be replaced - unsigned nodeId = std::distance(newNodes.begin(), it); + unsigned nodeId = static_cast(std::distance(newNodes.begin(), it)); duplicates.emplace_back(i, nodeId); } else { if (adjusted) - duplicates.push_back(std::make_pair(i, newNodes.size())); + duplicates.emplace_back(i, static_cast(newNodes.size())); newNodes.push_back(nodes[i]); } } From 308739a5227d2dcf42dcb7d3cfd65a6b3b30e6a3 Mon Sep 17 00:00:00 2001 From: filipov Date: Fri, 19 Jun 2026 11:31:30 +0200 Subject: [PATCH 28/35] fix omp_set_nested patch regex --- .github/workflows/python.yml | 4 ++++ cmake/vtk.cmake | 14 +++++++++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index 545ed581..4315c308 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -227,6 +227,8 @@ jobs: for name in libs if name.lower() == "viennals.libs/libomp140.x86_64.dll" ] + core = next(name for name in names if name.startswith("viennals/_core") and name.endswith(".pyd")) + core_bytes = zf.read(core) print("\nWindows runtime libraries:") for name in libs: @@ -236,6 +238,8 @@ jobs: missing.append(f"{wheel}: missing viennals.libs/") if not openmp: missing.append(f"{wheel}: missing viennals.libs/libomp140.x86_64.dll") + if b"omp_set_nested" in core_bytes: + missing.append(f"{wheel}: _core.pyd still references deprecated omp_set_nested") if missing: print("\nWheel runtime checks failed:", file=sys.stderr) diff --git a/cmake/vtk.cmake b/cmake/vtk.cmake index 81066d12..2cbd6275 100644 --- a/cmake/vtk.cmake +++ b/cmake/vtk.cmake @@ -139,9 +139,9 @@ function(viennals_patch_vtk_openmp_nested VTK_SOURCE_DIR) # deprecated call is removed even when a compiler reports an old _OPENMP # macro while linking against a modern runtime. string(REGEX REPLACE - "omp_set_nested\\(([^\\)]*)\\);" - "/* VIENNALS_PATCH_OMP_SET_NESTED */\n" - " omp_set_max_active_levels((\\1) ? 1024 : 1);" + [[omp_set_nested\(([^)]*)\);]] + [[/* VIENNALS_PATCH_OMP_SET_NESTED */ + omp_set_max_active_levels((\1) ? 1024 : 1);]] _vtk_smp_contents "${_vtk_smp_contents}") endif() @@ -154,6 +154,14 @@ function(viennals_patch_vtk_openmp_nested VTK_SOURCE_DIR) "${_vtk_smp_contents}") endif() + string(FIND "${_vtk_smp_contents}" "omp_set_nested(" _still_has_set_nested) + if(NOT _still_has_set_nested EQUAL -1) + message( + FATAL_ERROR + "[ViennaLS] VTK OpenMP nested-parallelism patch did not remove omp_set_nested from ${_vtk_smp_openmp}" + ) + endif() + file(WRITE "${_vtk_smp_openmp}" "${_vtk_smp_contents}") math(EXPR _vtk_smp_openmp_patch_count "${_vtk_smp_openmp_patch_count} + 1") message(STATUS "[ViennaLS] Patched VTK OpenMP nested-parallelism source: ${_vtk_smp_openmp}") From faab5e0d8718031ff4173c3931ab67cdd361528e Mon Sep 17 00:00:00 2001 From: filipovic Date: Fri, 19 Jun 2026 15:50:40 +0200 Subject: [PATCH 29/35] Use cached vcpkg for windows test --- .github/workflows/build.yml | 2 +- .github/workflows/python.yml | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0f4e67ec..f903fc8f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -68,7 +68,7 @@ jobs: - name: 🦥 Cache vcpkg binary (Windows) if: ${{ matrix.os == 'windows-latest' }} - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ${{ env.VCPKG_DEFAULT_BINARY_CACHE }} key: vcpkg-${{ matrix.os }}-${{ matrix.config }}-${{ env.VCPKG_COMMIT }} diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index 4315c308..995921f6 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -66,7 +66,7 @@ jobs: - name: 🦥 Cache vcpkg installed if: ${{ matrix.os == 'windows-latest' }} id: vcpkg-installed-cache - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ${{ github.workspace }}/vcpkg_installed key: vcpkg-installed-${{ matrix.os }}-${{ env.VCPKG_COMMIT }}-${{ hashFiles('vcpkg.json') }} @@ -85,9 +85,13 @@ jobs: $toolchain = "${{ github.workspace }}/vcpkg/scripts/buildsystems/vcpkg.cmake".Replace('\', '/') .\venv\Scripts\python -m pip install --upgrade pip + $vcpkgInstalled = "${{ github.workspace }}/vcpkg_installed".Replace('\', '/') + .\venv\Scripts\python -m pip install . ` --config-settings=cmake.define.CMAKE_TOOLCHAIN_FILE="$toolchain" ` - --config-settings=cmake.define.VCPKG_TARGET_TRIPLET="x64-windows" + --config-settings=cmake.define.VCPKG_TARGET_TRIPLET="x64-windows" ` + --config-settings=cmake.define.VCPKG_INSTALLED_DIR="$vcpkgInstalled" ` + --config-settings=cmake.define.VCPKG_MANIFEST_INSTALL=OFF .\venv\Scripts\python -c "import viennals; print(viennals.__doc__)" - name: 🐍 Build and check Python Module (Other) From c1b3ef492dd5562bf3d1eeef68d216e12427f425 Mon Sep 17 00:00:00 2001 From: filipovic Date: Fri, 19 Jun 2026 22:01:48 +0200 Subject: [PATCH 30/35] format --- CMakeLists.txt | 29 +++++++++++++------------ cmake/vtk.cmake | 43 ++++++++++++++----------------------- include/viennals/lsMesh.hpp | 3 ++- python/CMakeLists.txt | 41 +++++++++++------------------------ python/pyWrap.cpp | 8 +++---- 5 files changed, 50 insertions(+), 74 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bd82dea7..2a1e0b30 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -79,7 +79,6 @@ endif() if((CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang|AppleClang") AND VIENNALS_PACKAGE_PYTHON) string(APPEND CMAKE_C_FLAGS_RELEASE " -O3 -DNDEBUG -ffunction-sections -fdata-sections") string(APPEND CMAKE_CXX_FLAGS_RELEASE " -O3 -DNDEBUG -ffunction-sections -fdata-sections") - if(APPLE) string(APPEND CMAKE_MODULE_LINKER_FLAGS_RELEASE " -Wl,-dead_strip") string(APPEND CMAKE_SHARED_LINKER_FLAGS_RELEASE " -Wl,-dead_strip") @@ -254,7 +253,6 @@ elseif(VIENNALS_USE_VTK) "VTK_BUILD_ALL_MODULES OFF" "VTK_ENABLE_REMOTE_MODULES OFF" "VTK_LEGACY_REMOVE ON" - # VTK threading backend. # OpenMP gives full parallelism on all platforms. On MSVC, CMake may still # report an old OpenMP spec date, but OpenMP_RUNTIME_MSVC=llvm selects the LLVM runtime. @@ -270,23 +268,18 @@ elseif(VIENNALS_USE_VTK) "VTK_SMP_ENABLE_STDTHREAD OFF" "VTK_SMP_ENABLE_OPENMP ON" "VTK_SMP_ENABLE_TBB OFF" - # Keep the build small, but do not hard-forbid dependency resolution. "VTK_GROUP_ENABLE_Rendering DONT_WANT" "VTK_GROUP_ENABLE_Imaging DONT_WANT" "VTK_GROUP_ENABLE_Views DONT_WANT" "VTK_GROUP_ENABLE_Web DONT_WANT" - # These should stay hard-disabled for wheels. "VTK_GROUP_ENABLE_Qt NO" "VTK_GROUP_ENABLE_MPI NO" - # No VTK Python wrapping; ViennaLS uses pybind11. "VTK_ENABLE_WRAPPING NO" - # Avoid optional geospatial/projection dependency. "VTK_MODULE_ENABLE_VTK_libproj NO" - # Required VTK core/IO/filter modules. "VTK_MODULE_ENABLE_VTK_CommonExecutionModel YES" "VTK_MODULE_ENABLE_VTK_CommonMisc YES" @@ -301,7 +294,6 @@ elseif(VIENNALS_USE_VTK) "VTK_MODULE_ENABLE_VTK_FiltersCore YES" "VTK_MODULE_ENABLE_VTK_FiltersGeneral YES" "VTK_MODULE_ENABLE_VTK_FiltersGeometry YES" - "VTK_GROUP_ENABLE_Parallel DONT_WANT" "VTK_MODULE_ENABLE_VTK_ParallelDIY DONT_WANT" "VTK_MODULE_ENABLE_VTK_ParallelCore DONT_WANT") @@ -324,15 +316,22 @@ elseif(VIENNALS_USE_VTK) list(APPEND VTK_OPTIONS "VTK_MODULE_USE_EXTERNAL_VTK_png ON" "VTK_MODULE_USE_EXTERNAL_VTK_zlib ON") endif() - # Guarantee STDTHREAD stays OFF even if VTK's option() fires before CPM's # cache entry is written. See comment in VTK_OPTIONS above for why this # matters on MSVC. # Guarantee VTK uses OpenMP SMP for package builds. - set(VTK_SMP_IMPLEMENTATION_TYPE "OpenMP" CACHE STRING "" FORCE) - set(VTK_SMP_ENABLE_STDTHREAD OFF CACHE BOOL "" FORCE) - set(VTK_SMP_ENABLE_OPENMP ON CACHE BOOL "" FORCE) - set(VTK_SMP_ENABLE_TBB OFF CACHE BOOL "" FORCE) + set(VTK_SMP_IMPLEMENTATION_TYPE + "OpenMP" + CACHE STRING "" FORCE) + set(VTK_SMP_ENABLE_STDTHREAD + OFF + CACHE BOOL "" FORCE) + set(VTK_SMP_ENABLE_OPENMP + ON + CACHE BOOL "" FORCE) + set(VTK_SMP_ENABLE_TBB + OFF + CACHE BOOL "" FORCE) if(NOT VIENNALS_PACKAGE_PYTHON) find_package(VTK 9.0.0 QUIET) @@ -346,7 +345,9 @@ elseif(VIENNALS_USE_VTK) # Apply CPM-style options manually because DOWNLOAD_ONLY does not configure VTK. foreach(_vtk_option IN LISTS VTK_OPTIONS) if(_vtk_option MATCHES "^([^ ]+) +(.*)$") - set("${CMAKE_MATCH_1}" "${CMAKE_MATCH_2}" CACHE STRING "" FORCE) + set("${CMAKE_MATCH_1}" + "${CMAKE_MATCH_2}" + CACHE STRING "" FORCE) else() message(FATAL_ERROR "[ViennaLS] Invalid VTK option: ${_vtk_option}") endif() diff --git a/cmake/vtk.cmake b/cmake/vtk.cmake index 2cbd6275..8bd0ad34 100644 --- a/cmake/vtk.cmake +++ b/cmake/vtk.cmake @@ -64,21 +64,18 @@ function(viennals_patch_vtk_msvc_stdext VTK_SOURCE_DIR) return() endif() - set(_vtk_fmt_header - "${VTK_SOURCE_DIR}/ThirdParty/diy2/vtkdiy2/include/vtkdiy2/fmt/format.h") + set(_vtk_fmt_header "${VTK_SOURCE_DIR}/ThirdParty/diy2/vtkdiy2/include/vtkdiy2/fmt/format.h") if(NOT EXISTS "${_vtk_fmt_header}") message( WARNING - "[ViennaLS] Could not find VTK diy2/fmt header for MSVC stdext patch: ${_vtk_fmt_header}" - ) + "[ViennaLS] Could not find VTK diy2/fmt header for MSVC stdext patch: ${_vtk_fmt_header}") return() endif() file(READ "${_vtk_fmt_header}" _vtk_fmt_contents) - set(_patched_guard - "#if defined(_SECURE_SCL) && (!defined(_MSC_VER) || _MSC_VER < 1951)") + set(_patched_guard "#if defined(_SECURE_SCL) && (!defined(_MSC_VER) || _MSC_VER < 1951)") string(FIND "${_vtk_fmt_contents}" "${_patched_guard}" _already_patched) @@ -99,11 +96,7 @@ function(viennals_patch_vtk_msvc_stdext VTK_SOURCE_DIR) return() endif() - string(REPLACE - "${_old_guard}" - "${_patched_guard}" - _vtk_fmt_contents - "${_vtk_fmt_contents}") + string(REPLACE "${_old_guard}" "${_patched_guard}" _vtk_fmt_contents "${_vtk_fmt_contents}") file(WRITE "${_vtk_fmt_header}" "${_vtk_fmt_contents}") @@ -111,11 +104,9 @@ function(viennals_patch_vtk_msvc_stdext VTK_SOURCE_DIR) endfunction() function(viennals_patch_vtk_openmp_nested VTK_SOURCE_DIR) - file( - GLOB_RECURSE _vtk_smp_openmp_sources - "${VTK_SOURCE_DIR}/Common/Core/SMP/OpenMP/*.cxx" - "${VTK_SOURCE_DIR}/Common/Core/SMP/OpenMP/*.txx" - "${VTK_SOURCE_DIR}/Common/Core/SMP/OpenMP/*.h") + file(GLOB_RECURSE _vtk_smp_openmp_sources "${VTK_SOURCE_DIR}/Common/Core/SMP/OpenMP/*.cxx" + "${VTK_SOURCE_DIR}/Common/Core/SMP/OpenMP/*.txx" + "${VTK_SOURCE_DIR}/Common/Core/SMP/OpenMP/*.h") if(NOT _vtk_smp_openmp_sources) message(WARNING "[ViennaLS] Could not find VTK OpenMP SMP sources for omp_set_nested patch") @@ -138,20 +129,18 @@ function(viennals_patch_vtk_openmp_nested VTK_SOURCE_DIR) # omp_set_nested is deprecated. Use max-active-levels directly so the # deprecated call is removed even when a compiler reports an old _OPENMP # macro while linking against a modern runtime. - string(REGEX REPLACE - [[omp_set_nested\(([^)]*)\);]] - [[/* VIENNALS_PATCH_OMP_SET_NESTED */ - omp_set_max_active_levels((\1) ? 1024 : 1);]] - _vtk_smp_contents - "${_vtk_smp_contents}") + string(REGEX REPLACE [[omp_set_nested\(([^)]*)\);]] [[/* VIENNALS_PATCH_OMP_SET_NESTED */ + omp_set_max_active_levels((\1) ? 1024 : 1);]] _vtk_smp_contents "${_vtk_smp_contents}") + endif() if(NOT _has_get_nested EQUAL -1) - string(REGEX REPLACE - "omp_get_nested\\(\\)" - "/* VIENNALS_PATCH_OMP_GET_NESTED */ (omp_get_max_active_levels() > 1)" - _vtk_smp_contents - "${_vtk_smp_contents}") + string( + REGEX + REPLACE "omp_get_nested\\(\\)" + "/* VIENNALS_PATCH_OMP_GET_NESTED */ (omp_get_max_active_levels() > 1)" + _vtk_smp_contents "${_vtk_smp_contents}") + endif() string(FIND "${_vtk_smp_contents}" "omp_set_nested(" _still_has_set_nested) diff --git a/include/viennals/lsMesh.hpp b/include/viennals/lsMesh.hpp index bb360619..6f95e5ff 100644 --- a/include/viennals/lsMesh.hpp +++ b/include/viennals/lsMesh.hpp @@ -179,7 +179,8 @@ template class Mesh { if (it != newNodes.end()) { adjusted = true; // if duplicate point, save it to be replaced - unsigned nodeId = static_cast(std::distance(newNodes.begin(), it)); + unsigned nodeId = + static_cast(std::distance(newNodes.begin(), it)); duplicates.emplace_back(i, nodeId); } else { if (adjusted) diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index e50d2491..f3f86d8c 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -83,9 +83,7 @@ install( ARCHIVE DESTINATION ${PKG}) # Package files -install( - FILES ${CMAKE_SOURCE_DIR}/python/__init__.py - DESTINATION ${PKG}) +install(FILES ${CMAKE_SOURCE_DIR}/python/__init__.py DESTINATION ${PKG}) add_dependencies(${PROJECT_NAME} ${MOD}) @@ -118,17 +116,13 @@ if((VIENNALS_PACKAGE_PYTHON AND NOT APPLE) OR MSVC) endforeach() if(DEFINED ENV{VCINSTALLDIR}) - list( - APPEND - _VIENNALS_OPENMP_DLL_CANDIDATES + list(APPEND _VIENNALS_OPENMP_DLL_CANDIDATES "$ENV{VCINSTALLDIR}/Tools/Llvm/bin/libomp140.x86_64.dll" "$ENV{VCINSTALLDIR}/Tools/Llvm/x64/bin/libomp140.x86_64.dll") endif() if(DEFINED ENV{VCToolsInstallDir}) - list( - APPEND - _VIENNALS_OPENMP_DLL_CANDIDATES + list(APPEND _VIENNALS_OPENMP_DLL_CANDIDATES "$ENV{VCToolsInstallDir}/../../Llvm/bin/libomp140.x86_64.dll" "$ENV{VCToolsInstallDir}/../../Llvm/x64/bin/libomp140.x86_64.dll") endif() @@ -138,16 +132,12 @@ if((VIENNALS_PACKAGE_PYTHON AND NOT APPLE) OR MSVC) endif() if(DEFINED ENV{VCToolsRedistDir}) - file( - GLOB_RECURSE _VIENNALS_OPENMP_REDIST_DLLS - "$ENV{VCToolsRedistDir}/*libomp140.x86_64.dll") + file(GLOB_RECURSE _VIENNALS_OPENMP_REDIST_DLLS "$ENV{VCToolsRedistDir}/*libomp140.x86_64.dll") list(APPEND _VIENNALS_OPENMP_DLL_CANDIDATES ${_VIENNALS_OPENMP_REDIST_DLLS}) endif() if(DEFINED ENV{VCINSTALLDIR}) - file( - GLOB_RECURSE _VIENNALS_OPENMP_VC_REDIST_DLLS - "$ENV{VCINSTALLDIR}/Redist/MSVC/*libomp140.x86_64.dll") + file(GLOB_RECURSE _VIENNALS_OPENMP_VC_REDIST_DLLS "$ENV{VCINSTALLDIR}/Redist/MSVC/*libomp140.x86_64.dll") list(APPEND _VIENNALS_OPENMP_DLL_CANDIDATES ${_VIENNALS_OPENMP_VC_REDIST_DLLS}) endif() @@ -176,8 +166,8 @@ if((VIENNALS_PACKAGE_PYTHON AND NOT APPLE) OR MSVC) unset(_VIENNALS_OPENMP_DLL) set(_VIENNALS_OPENMP_DLL_SEARCH_LOG) foreach(_VIENNALS_OPENMP_DLL_CANDIDATE IN LISTS _VIENNALS_OPENMP_DLL_CANDIDATES) - get_filename_component( - _VIENNALS_OPENMP_DLL_CANDIDATE_REAL "${_VIENNALS_OPENMP_DLL_CANDIDATE}" ABSOLUTE) + get_filename_component(_VIENNALS_OPENMP_DLL_CANDIDATE_REAL + "${_VIENNALS_OPENMP_DLL_CANDIDATE}" ABSOLUTE) list(APPEND _VIENNALS_OPENMP_DLL_SEARCH_LOG "${_VIENNALS_OPENMP_DLL_CANDIDATE_REAL}") if(EXISTS "${_VIENNALS_OPENMP_DLL_CANDIDATE_REAL}") set(_VIENNALS_OPENMP_DLL "${_VIENNALS_OPENMP_DLL_CANDIDATE_REAL}") @@ -196,9 +186,7 @@ if((VIENNALS_PACKAGE_PYTHON AND NOT APPLE) OR MSVC) VERBATIM) if(VIENNALS_PACKAGE_PYTHON) - install( - PROGRAMS "${_VIENNALS_OPENMP_DLL}" - DESTINATION ${PKG}.libs) + install(PROGRAMS "${_VIENNALS_OPENMP_DLL}" DESTINATION ${PKG}.libs) endif() elseif(VIENNALS_PACKAGE_PYTHON) string(REPLACE ";" "\n " _VIENNALS_OPENMP_DLL_SEARCH_LOG_TEXT @@ -207,14 +195,11 @@ if((VIENNALS_PACKAGE_PYTHON AND NOT APPLE) OR MSVC) FATAL_ERROR "[ViennaLS] Could not locate libomp140.x86_64.dll for a Windows wheel build. " "The produced wheel would fail to import on machines without the LLVM OpenMP runtime. " - "Searched:\n ${_VIENNALS_OPENMP_DLL_SEARCH_LOG_TEXT}" - ) + "Searched:\n ${_VIENNALS_OPENMP_DLL_SEARCH_LOG_TEXT}") else() message( - WARNING - "[ViennaLS] Could not locate libomp140.x86_64.dll. Windows wheels built " - "with /openmp:llvm may fail to import on machines without the LLVM OpenMP runtime." - ) + WARNING "[ViennaLS] Could not locate libomp140.x86_64.dll. Windows wheels built " + "with /openmp:llvm may fail to import on machines without the LLVM OpenMP runtime.") endif() endif() @@ -246,6 +231,6 @@ elseif(MSVC) install( DIRECTORY ${VIENNALS_LIB_FOLDER} DESTINATION . - OPTIONAL - FILES_MATCHING PATTERN "*.dll") + OPTIONAL FILES_MATCHING + PATTERN "*.dll") endif() diff --git a/python/pyWrap.cpp b/python/pyWrap.cpp index 122b0ec2..33b7f2cd 100644 --- a/python/pyWrap.cpp +++ b/python/pyWrap.cpp @@ -39,10 +39,10 @@ class PylsVelocityField : public VelocityField { PYBIND11_MODULE(VIENNALS_MODULE_NAME, module) { module.doc() = "ViennaLS is a header-only C++ level set library developed for high " - "performance topography and semiconductor process simulations. The main design goals are " - "simplicity and efficiency, tailored towards scientific simulations. " - "ViennaLS can also be used for visualization applications, although this " - "is not the main design target."; + "performance topography and semiconductor process simulations. The main " + "design goals are simplicity and efficiency, tailored towards scientific " + "simulations. ViennaLS can also be used for visualization applications, " + "although this is not the main design target."; // set version string of python module module.attr("__version__") = versionString(); From 61531a7d65541814ae827ac8e6057fdca47de5db Mon Sep 17 00:00:00 2001 From: filipovic Date: Fri, 19 Jun 2026 22:06:24 +0200 Subject: [PATCH 31/35] format 2 --- CMakeLists.txt | 20 ++++++++++---------- python/CMakeLists.txt | 17 +++++++++-------- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2a1e0b30..79b008dc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -320,17 +320,17 @@ elseif(VIENNALS_USE_VTK) # cache entry is written. See comment in VTK_OPTIONS above for why this # matters on MSVC. # Guarantee VTK uses OpenMP SMP for package builds. - set(VTK_SMP_IMPLEMENTATION_TYPE - "OpenMP" + set(VTK_SMP_IMPLEMENTATION_TYPE + "OpenMP" CACHE STRING "" FORCE) - set(VTK_SMP_ENABLE_STDTHREAD - OFF + set(VTK_SMP_ENABLE_STDTHREAD + OFF CACHE BOOL "" FORCE) - set(VTK_SMP_ENABLE_OPENMP - ON + set(VTK_SMP_ENABLE_OPENMP + ON CACHE BOOL "" FORCE) - set(VTK_SMP_ENABLE_TBB - OFF + set(VTK_SMP_ENABLE_TBB + OFF CACHE BOOL "" FORCE) if(NOT VIENNALS_PACKAGE_PYTHON) @@ -345,8 +345,8 @@ elseif(VIENNALS_USE_VTK) # Apply CPM-style options manually because DOWNLOAD_ONLY does not configure VTK. foreach(_vtk_option IN LISTS VTK_OPTIONS) if(_vtk_option MATCHES "^([^ ]+) +(.*)$") - set("${CMAKE_MATCH_1}" - "${CMAKE_MATCH_2}" + set("${CMAKE_MATCH_1}" + "${CMAKE_MATCH_2}" CACHE STRING "" FORCE) else() message(FATAL_ERROR "[ViennaLS] Invalid VTK option: ${_vtk_option}") diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index f3f86d8c..7e05fd33 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -117,14 +117,14 @@ if((VIENNALS_PACKAGE_PYTHON AND NOT APPLE) OR MSVC) if(DEFINED ENV{VCINSTALLDIR}) list(APPEND _VIENNALS_OPENMP_DLL_CANDIDATES - "$ENV{VCINSTALLDIR}/Tools/Llvm/bin/libomp140.x86_64.dll" - "$ENV{VCINSTALLDIR}/Tools/Llvm/x64/bin/libomp140.x86_64.dll") + "$ENV{VCINSTALLDIR}/Tools/Llvm/bin/libomp140.x86_64.dll" + "$ENV{VCINSTALLDIR}/Tools/Llvm/x64/bin/libomp140.x86_64.dll") endif() if(DEFINED ENV{VCToolsInstallDir}) list(APPEND _VIENNALS_OPENMP_DLL_CANDIDATES - "$ENV{VCToolsInstallDir}/../../Llvm/bin/libomp140.x86_64.dll" - "$ENV{VCToolsInstallDir}/../../Llvm/x64/bin/libomp140.x86_64.dll") + "$ENV{VCToolsInstallDir}/../../Llvm/bin/libomp140.x86_64.dll" + "$ENV{VCToolsInstallDir}/../../Llvm/x64/bin/libomp140.x86_64.dll") endif() if(DEFINED ENV{llvmX64}) @@ -137,7 +137,8 @@ if((VIENNALS_PACKAGE_PYTHON AND NOT APPLE) OR MSVC) endif() if(DEFINED ENV{VCINSTALLDIR}) - file(GLOB_RECURSE _VIENNALS_OPENMP_VC_REDIST_DLLS "$ENV{VCINSTALLDIR}/Redist/MSVC/*libomp140.x86_64.dll") + file(GLOB_RECURSE _VIENNALS_OPENMP_VC_REDIST_DLLS + "$ENV{VCINSTALLDIR}/Redist/MSVC/*libomp140.x86_64.dll") list(APPEND _VIENNALS_OPENMP_DLL_CANDIDATES ${_VIENNALS_OPENMP_VC_REDIST_DLLS}) endif() @@ -166,7 +167,7 @@ if((VIENNALS_PACKAGE_PYTHON AND NOT APPLE) OR MSVC) unset(_VIENNALS_OPENMP_DLL) set(_VIENNALS_OPENMP_DLL_SEARCH_LOG) foreach(_VIENNALS_OPENMP_DLL_CANDIDATE IN LISTS _VIENNALS_OPENMP_DLL_CANDIDATES) - get_filename_component(_VIENNALS_OPENMP_DLL_CANDIDATE_REAL + get_filename_component(_VIENNALS_OPENMP_DLL_CANDIDATE_REAL "${_VIENNALS_OPENMP_DLL_CANDIDATE}" ABSOLUTE) list(APPEND _VIENNALS_OPENMP_DLL_SEARCH_LOG "${_VIENNALS_OPENMP_DLL_CANDIDATE_REAL}") if(EXISTS "${_VIENNALS_OPENMP_DLL_CANDIDATE_REAL}") @@ -199,7 +200,7 @@ if((VIENNALS_PACKAGE_PYTHON AND NOT APPLE) OR MSVC) else() message( WARNING "[ViennaLS] Could not locate libomp140.x86_64.dll. Windows wheels built " - "with /openmp:llvm may fail to import on machines without the LLVM OpenMP runtime.") + "with /openmp:llvm may fail to import on machines without the LLVM OpenMP runtime.") endif() endif() @@ -231,6 +232,6 @@ elseif(MSVC) install( DIRECTORY ${VIENNALS_LIB_FOLDER} DESTINATION . - OPTIONAL FILES_MATCHING + OPTIONAL FILES_MATCHING PATTERN "*.dll") endif() From 7b2868219930fce8ea84e8c48380b51884faed8c Mon Sep 17 00:00:00 2001 From: filipovic Date: Fri, 19 Jun 2026 22:15:45 +0200 Subject: [PATCH 32/35] vcpkg cache for windows iwhen running tests --- .github/workflows/build.yml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f903fc8f..19162df5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -66,15 +66,16 @@ jobs: New-Item -ItemType Directory -Force -Path "${{ env.VCPKG_DEFAULT_BINARY_CACHE }}" - - name: 🦥 Cache vcpkg binary (Windows) + - name: 🦥 Cache vcpkg installed if: ${{ matrix.os == 'windows-latest' }} + id: vcpkg-installed-cache uses: actions/cache@v5 with: - path: ${{ env.VCPKG_DEFAULT_BINARY_CACHE }} - key: vcpkg-${{ matrix.os }}-${{ matrix.config }}-${{ env.VCPKG_COMMIT }} + path: ${{ github.workspace }}/vcpkg_installed + key: vcpkg-installed-${{ matrix.os }}-${{ env.VCPKG_COMMIT }}-${{ hashFiles('vcpkg.json') }} - name: 🛠️ Build Dependencies (Windows) - if: ${{ matrix.os == 'windows-latest' }} + if: ${{ matrix.os == 'windows-latest' && steps.vcpkg-installed-cache.outputs.cache-hit != 'true' }} shell: pwsh run: | ./vcpkg/vcpkg install --triplet x64-windows @@ -82,7 +83,7 @@ jobs: - name: 🏗️ Compile (Windows) if: ${{ matrix.os == 'windows-latest' }} run: | - cmake -DVIENNALS_BUILD_TESTS=ON -DCMAKE_TOOLCHAIN_FILE=${{ github.workspace }}/vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows -B build + cmake -DVIENNALS_BUILD_TESTS=ON -DCMAKE_TOOLCHAIN_FILE=${{ github.workspace }}/vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows -DVCPKG_INSTALLED_DIR=${{ github.workspace }}/vcpkg_installed -DVCPKG_MANIFEST_INSTALL=OFF -B build cmake --build build --config ${{ matrix.config }} - name: 🏗️ Compile (other) From 698f237e2e51b00125b311080fb8282a91ed443a Mon Sep 17 00:00:00 2001 From: filipov Date: Fri, 19 Jun 2026 21:12:35 +0200 Subject: [PATCH 33/35] add vtk test script for omp_set_nested check --- .github/scripts/viennals_runtime_smoke.py | 102 ++++++++++++++++++++++ .github/workflows/python.yml | 10 +-- 2 files changed, 104 insertions(+), 8 deletions(-) create mode 100644 .github/scripts/viennals_runtime_smoke.py diff --git a/.github/scripts/viennals_runtime_smoke.py b/.github/scripts/viennals_runtime_smoke.py new file mode 100644 index 00000000..ebb261d4 --- /dev/null +++ b/.github/scripts/viennals_runtime_smoke.py @@ -0,0 +1,102 @@ +from __future__ import annotations + +import os +import subprocess +import sys +import tempfile +import textwrap + + +SMOKE_TEST = r""" +from pathlib import Path +import tempfile + +import viennals as vls + +print(vls.__file__) +print(vls.d2) +print(vls.d3) + +tmp = Path(tempfile.mkdtemp(prefix="viennals-runtime-smoke-")) + +# Exercise direct VTK mesh writing from the installed wheel. +mesh = vls.Mesh() +mesh.insertNextNode([0.0, 0.0, 0.0]) +mesh.insertNextNode([1.0, 0.0, 0.0]) +mesh.insertNextNode([0.0, 1.0, 0.0]) +mesh.insertNextTriangle([0, 1, 2]) +mesh_file = tmp / "mesh.vtp" +vls.VTKWriter(mesh, str(mesh_file)).apply() + +if not mesh_file.exists() or mesh_file.stat().st_size == 0: + raise RuntimeError(f"VTKWriter did not create {mesh_file}") + +# Exercise a small level-set-to-surface path before writing. This hits more of +# the bundled VTK runtime than importing the module or writing a hand-built mesh. +d2 = vls.d2 +bounds = [-1.0, 1.0, -1.0, 1.0] +bcs = [ + vls.BoundaryConditionEnum.REFLECTIVE_BOUNDARY, + vls.BoundaryConditionEnum.INFINITE_BOUNDARY, +] +domain = d2.Domain(bounds, bcs, 0.1) +d2.MakeGeometry(domain, d2.Sphere([0.0, 0.0], 0.5)).apply() + +surface = vls.Mesh() +d2.ToSurfaceMesh(domain, surface).apply() +surface_file = tmp / "surface.vtp" +vls.VTKWriter(surface, str(surface_file)).apply() + +if not surface_file.exists() or surface_file.stat().st_size == 0: + raise RuntimeError(f"VTKWriter did not create {surface_file}") + +# Exercise the higher-level VTK visualization writer when the wheel was built +# with VTK support. +d3 = vls.d3 +if hasattr(d3, "WriteVisualizationMesh"): + vis_domain = d3.Domain(0.25) + d3.MakeGeometry(vis_domain, d3.Sphere([0.0, 0.0, 0.0], 1.0)).apply() + vis_writer = d3.WriteVisualizationMesh(vis_domain) + vis_writer.setFileName(str(tmp / "visualization")) + vis_writer.apply() +""" + + +def main() -> int: + env = os.environ.copy() + # The test should catch runtime OpenMP warnings, not inherit a developer's + # local suppression setting. + env.pop("KMP_WARNINGS", None) + + result = subprocess.run( + [sys.executable, "-c", SMOKE_TEST], + capture_output=True, + cwd=tempfile.mkdtemp(prefix="viennals-runtime-smoke-run-"), + env=env, + text=True, + ) + + if result.stdout: + print(result.stdout, end="") + if result.stderr: + print(result.stderr, end="", file=sys.stderr) + + combined_output = result.stdout + result.stderr + if "omp_set_nested" in combined_output: + print( + textwrap.dedent( + """ + ViennaLS runtime smoke test detected deprecated OpenMP nested + parallelism output. This usually means a runtime path still + called omp_set_nested instead of omp_set_max_active_levels. + """ + ).strip(), + file=sys.stderr, + ) + return 1 + + return result.returncode + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index 995921f6..bb7d0b2c 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -178,10 +178,7 @@ jobs: env: CIBW_SKIP: ${{ matrix.skip }} CIBW_TEST_COMMAND: >- - python -c "import viennals; - print(viennals.__file__); - print(viennals.d2); - print(viennals.d3)" + python "{project}/.github/scripts/viennals_runtime_smoke.py" CIBW_CONFIG_SETTINGS: >- cmake.define.VIENNALS_PACKAGE_PYTHON=ON cmake.define.VIENNALS_IS_CI=ON @@ -196,10 +193,7 @@ jobs: CIBW_ARCHS_WINDOWS: auto64 CIBW_ARCHS_MACOS: ${{ matrix.archs }} CIBW_TEST_COMMAND: >- - python -c "import viennals; - print(viennals.__file__); - print(viennals.d2); - print(viennals.d3)" + python "{project}/.github/scripts/viennals_runtime_smoke.py" CIBW_CONFIG_SETTINGS: >- cmake.define.VIENNALS_PACKAGE_PYTHON=ON cmake.define.VIENNALS_IS_CI=ON From e69b200ab45004c184f40dbaa106bc6c0951dd4f Mon Sep 17 00:00:00 2001 From: filipov Date: Fri, 19 Jun 2026 21:39:17 +0200 Subject: [PATCH 34/35] add debug lines --- .github/scripts/viennals_runtime_smoke.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.github/scripts/viennals_runtime_smoke.py b/.github/scripts/viennals_runtime_smoke.py index ebb261d4..5abc269d 100644 --- a/.github/scripts/viennals_runtime_smoke.py +++ b/.github/scripts/viennals_runtime_smoke.py @@ -13,6 +13,7 @@ import viennals as vls +print("ViennaLS runtime smoke: imported viennals") print(vls.__file__) print(vls.d2) print(vls.d3) @@ -20,6 +21,7 @@ tmp = Path(tempfile.mkdtemp(prefix="viennals-runtime-smoke-")) # Exercise direct VTK mesh writing from the installed wheel. +print("ViennaLS runtime smoke: writing hand-built mesh with VTKWriter") mesh = vls.Mesh() mesh.insertNextNode([0.0, 0.0, 0.0]) mesh.insertNextNode([1.0, 0.0, 0.0]) @@ -30,9 +32,11 @@ if not mesh_file.exists() or mesh_file.stat().st_size == 0: raise RuntimeError(f"VTKWriter did not create {mesh_file}") +print(f"ViennaLS runtime smoke: wrote {mesh_file}") # Exercise a small level-set-to-surface path before writing. This hits more of # the bundled VTK runtime than importing the module or writing a hand-built mesh. +print("ViennaLS runtime smoke: writing level-set surface with VTKWriter") d2 = vls.d2 bounds = [-1.0, 1.0, -1.0, 1.0] bcs = [ @@ -49,16 +53,23 @@ if not surface_file.exists() or surface_file.stat().st_size == 0: raise RuntimeError(f"VTKWriter did not create {surface_file}") +print(f"ViennaLS runtime smoke: wrote {surface_file}") # Exercise the higher-level VTK visualization writer when the wheel was built # with VTK support. d3 = vls.d3 if hasattr(d3, "WriteVisualizationMesh"): + print("ViennaLS runtime smoke: writing visualization mesh") vis_domain = d3.Domain(0.25) d3.MakeGeometry(vis_domain, d3.Sphere([0.0, 0.0, 0.0], 1.0)).apply() vis_writer = d3.WriteVisualizationMesh(vis_domain) vis_writer.setFileName(str(tmp / "visualization")) vis_writer.apply() + print("ViennaLS runtime smoke: wrote visualization mesh") +else: + print("ViennaLS runtime smoke: WriteVisualizationMesh unavailable") + +print("ViennaLS runtime smoke: completed") """ From d65946d0818ba87b1bc73c0e96e1cb823b123337 Mon Sep 17 00:00:00 2001 From: filipov Date: Fri, 19 Jun 2026 22:24:14 +0200 Subject: [PATCH 35/35] clean up debug scripts --- .github/scripts/viennals_runtime_smoke.py | 113 ---------------------- .github/workflows/python.yml | 35 ++----- 2 files changed, 8 insertions(+), 140 deletions(-) delete mode 100644 .github/scripts/viennals_runtime_smoke.py diff --git a/.github/scripts/viennals_runtime_smoke.py b/.github/scripts/viennals_runtime_smoke.py deleted file mode 100644 index 5abc269d..00000000 --- a/.github/scripts/viennals_runtime_smoke.py +++ /dev/null @@ -1,113 +0,0 @@ -from __future__ import annotations - -import os -import subprocess -import sys -import tempfile -import textwrap - - -SMOKE_TEST = r""" -from pathlib import Path -import tempfile - -import viennals as vls - -print("ViennaLS runtime smoke: imported viennals") -print(vls.__file__) -print(vls.d2) -print(vls.d3) - -tmp = Path(tempfile.mkdtemp(prefix="viennals-runtime-smoke-")) - -# Exercise direct VTK mesh writing from the installed wheel. -print("ViennaLS runtime smoke: writing hand-built mesh with VTKWriter") -mesh = vls.Mesh() -mesh.insertNextNode([0.0, 0.0, 0.0]) -mesh.insertNextNode([1.0, 0.0, 0.0]) -mesh.insertNextNode([0.0, 1.0, 0.0]) -mesh.insertNextTriangle([0, 1, 2]) -mesh_file = tmp / "mesh.vtp" -vls.VTKWriter(mesh, str(mesh_file)).apply() - -if not mesh_file.exists() or mesh_file.stat().st_size == 0: - raise RuntimeError(f"VTKWriter did not create {mesh_file}") -print(f"ViennaLS runtime smoke: wrote {mesh_file}") - -# Exercise a small level-set-to-surface path before writing. This hits more of -# the bundled VTK runtime than importing the module or writing a hand-built mesh. -print("ViennaLS runtime smoke: writing level-set surface with VTKWriter") -d2 = vls.d2 -bounds = [-1.0, 1.0, -1.0, 1.0] -bcs = [ - vls.BoundaryConditionEnum.REFLECTIVE_BOUNDARY, - vls.BoundaryConditionEnum.INFINITE_BOUNDARY, -] -domain = d2.Domain(bounds, bcs, 0.1) -d2.MakeGeometry(domain, d2.Sphere([0.0, 0.0], 0.5)).apply() - -surface = vls.Mesh() -d2.ToSurfaceMesh(domain, surface).apply() -surface_file = tmp / "surface.vtp" -vls.VTKWriter(surface, str(surface_file)).apply() - -if not surface_file.exists() or surface_file.stat().st_size == 0: - raise RuntimeError(f"VTKWriter did not create {surface_file}") -print(f"ViennaLS runtime smoke: wrote {surface_file}") - -# Exercise the higher-level VTK visualization writer when the wheel was built -# with VTK support. -d3 = vls.d3 -if hasattr(d3, "WriteVisualizationMesh"): - print("ViennaLS runtime smoke: writing visualization mesh") - vis_domain = d3.Domain(0.25) - d3.MakeGeometry(vis_domain, d3.Sphere([0.0, 0.0, 0.0], 1.0)).apply() - vis_writer = d3.WriteVisualizationMesh(vis_domain) - vis_writer.setFileName(str(tmp / "visualization")) - vis_writer.apply() - print("ViennaLS runtime smoke: wrote visualization mesh") -else: - print("ViennaLS runtime smoke: WriteVisualizationMesh unavailable") - -print("ViennaLS runtime smoke: completed") -""" - - -def main() -> int: - env = os.environ.copy() - # The test should catch runtime OpenMP warnings, not inherit a developer's - # local suppression setting. - env.pop("KMP_WARNINGS", None) - - result = subprocess.run( - [sys.executable, "-c", SMOKE_TEST], - capture_output=True, - cwd=tempfile.mkdtemp(prefix="viennals-runtime-smoke-run-"), - env=env, - text=True, - ) - - if result.stdout: - print(result.stdout, end="") - if result.stderr: - print(result.stderr, end="", file=sys.stderr) - - combined_output = result.stdout + result.stderr - if "omp_set_nested" in combined_output: - print( - textwrap.dedent( - """ - ViennaLS runtime smoke test detected deprecated OpenMP nested - parallelism output. This usually means a runtime path still - called omp_set_nested instead of omp_set_max_active_levels. - """ - ).strip(), - file=sys.stderr, - ) - return 1 - - return result.returncode - - -if __name__ == "__main__": - raise SystemExit(main()) diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index bb7d0b2c..8f2faaac 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -147,38 +147,16 @@ jobs: - name: 🛞 CIBuildWheel run: pip install cibuildwheel==3.4.0 --break-system-packages - - name: Inspect OpenMP runtime (Windows) - if: ${{ matrix.os == 'windows-latest' }} - shell: pwsh - run: | - $roots = @( - $env:llvmX64, - $env:VCToolsRedistDir, - $env:VCINSTALLDIR, - $env:VCToolsInstallDir, - 'C:\Program Files\LLVM\bin', - 'C:\Program Files (x86)\LLVM\bin' - ) | Where-Object { $_ -and (Test-Path $_) } | Select-Object -Unique - - $matches = @() - foreach ($root in $roots) { - Write-Host "Searching $root" - $matches += Get-ChildItem -Path $root -Filter libomp140.x86_64.dll -Recurse -ErrorAction SilentlyContinue - } - - if ($matches.Count -eq 0) { - Write-Warning "libomp140.x86_64.dll was not found in the Visual Studio or LLVM runtime locations." - } else { - $matches | Select-Object -ExpandProperty FullName - } - - name: 🏗️ Build Wheels (Linux) if: ${{ matrix.os == 'ubuntu-latest' }} run: python -m cibuildwheel --output-dir wheelhouse env: CIBW_SKIP: ${{ matrix.skip }} CIBW_TEST_COMMAND: >- - python "{project}/.github/scripts/viennals_runtime_smoke.py" + python -c "import viennals; + print(viennals.__file__); + print(viennals.d2); + print(viennals.d3)" CIBW_CONFIG_SETTINGS: >- cmake.define.VIENNALS_PACKAGE_PYTHON=ON cmake.define.VIENNALS_IS_CI=ON @@ -193,7 +171,10 @@ jobs: CIBW_ARCHS_WINDOWS: auto64 CIBW_ARCHS_MACOS: ${{ matrix.archs }} CIBW_TEST_COMMAND: >- - python "{project}/.github/scripts/viennals_runtime_smoke.py" + python -c "import viennals; + print(viennals.__file__); + print(viennals.d2); + print(viennals.d3)" CIBW_CONFIG_SETTINGS: >- cmake.define.VIENNALS_PACKAGE_PYTHON=ON cmake.define.VIENNALS_IS_CI=ON