Repository navigation
Windows wheels, NuGet, Rust and Java natives from the clang-cl CMake build - #7202
Merged
Merged
Conversation
…l CMake build The wheel job of pip-build.yml builds MeshLib the way the clang-cl jobs of build-test-windows.yml do: CMake + Ninja with the image's clang-cl and lld-link, x64 on the 14.4 toolset with the vs2022 vcpkg triplet and CUDA 12.0.1, arm64 on VS2026 with CUDA 13.4.1; MSBuild leaves that job. The NuGet payload (DotNetPatchArchiveWindows-*, DotNetDllXml) now comes from the clang-cl jobs, so the C# bindings are generated and tested there too; the MSBuild VS2026 jobs keep generating and testing them, and keep shipping the C++ developer distribution. The Rust crate natives and the Maven natives jars are cut from the NuGet package, so they follow. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…undled one VsDevCmd puts in VCPKG_ROOT Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
clang-cl keeps /fp:precise as -ffp-contract=on, and on arm64 FMA is baseline, so three tests saw slightly different exact results than the cl builds: the multiway ICP pair count, the split of the precise edge-triangle intersections and the edge chosen to represent a projected point. The tests now accept both result sets, as MRMeshBooleanTests.cpp already does, and check the projected point through mesh.triPoint instead of its edge id. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
gdcm builds every module with the same GDCM_EXPORT macro, so gdcmMEXD.dll re-exports 153 gdcmDSED symbols (DataSet, DataElement, Tag...). CMake orders the link line with gdcmMEXD.lib before gdcmDSED.lib, so MRVoxels resolved them from gdcmMEXD and the CMake Windows packages shipped gdcmMEXD.dll plus its socket++ dependency, two DLLs the MSBuild packages never had (vcpkg autolink lists the libs alphabetically, DSED first). MRVoxels uses only the MSFF and DICT modules; MEXD is the DICOM network module. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Nothing shipped uses the MSBuild-built C bindings any more, so the MSBuild VS2026 jobs stop generating and testing the C# bindings. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Grantim
approved these changes
Oct 20, 2026
adalisk-emikhaylov
approved these changes
Oct 21, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The Windows binaries that reach users through the package managers now come from the clang-cl CMake build that #7193 added, instead of MSBuild + VS2026:
pip-build.ymlbuilds MeshLib the way the clang-cl jobs ofbuild-test-windows.ymldo: CMake + Ninja with the image's clang-cl and lld-link, then the samez-applocaldeployment and copy intosource\<arch>\Releasethat the bindings and the wheel script expect. x64 runs on the 14.4 (VS2022) toolset with thex64-windows-vs2022-meshlibtriplet and CUDA 12.0.1 (CUDA 12 needs that toolset, see Windows: build with clang-cl through CMake #7193), arm64 on VS2026 with CUDA 13.4.1. MSBuild and its setup step leave the job; MSYS2 and mrbind now install before the build, as in the other workflow.DotNetPatchArchiveWindows-*andDotNetDllXmluploads) move from the msvc-2026 MSBuild Release jobs to the clang-cl Release jobs, soBUILD_C_SHARPmoves to the clang-cl jobs: they generate the C# bindings, build the C# examples and run the C# unit tests against the clang-cl DLLs; the MSBuild VS2026 jobs no longer do, and keep producing the C++ developer distribution (MeshLibDistVS26*.zip), which is unchanged.pack_crate.shcuts the per-platform natives (meshlib_<version>_rust_native_windows-*.zip, which the crate'sbuild.rsdownloads andpack_maven.shturns into the natives jars) out of the NuGet package'sruntimes/win-*/native, so they follow the NuGet payload with no further change.Labels:
test-pip-buildruns the wheel jobs,upload-binariesruns the NuGet assembly (create-nuget-packagewith thepr-testnamespace).Artifact sizes against master
The pr-test release of this PR's run (v1.0.0.6322, run 39410264571) against master's v3.1.4.589:
The master wheels are the nightly run's of the same day (3.1.4.582, run 39357805778, MSBuild). Their DLLs change exactly as the nupkg's below; the largest part of a wheel, mrmeshpy.pyd (56 MB uncompressed), is built by the MSYS2 clang in both and stays the same, which is why the wheels grow by less than the natives.
Per binary, uncompressed KB, from the nupkg's
runtimes/win-*/native:The third-party difference is two DLLs the MSBuild packages never had, gdcmMEXD.dll and socketxx.dll (about 0.6 MB per architecture): CMake put gdcmMEXD.lib before gdcmDSED.lib on MRVoxels' link line and gdcm re-exports the DSED symbols from every module, so MRVoxels imported the DICOM network module and its socket++ dependency. a08afd0 drops gdcmMEXD from MRVoxels' link list; the sizes above predate it.
LTO does not help
Local clang-cl builds of this configuration with link-time optimization, same flags otherwise (Ryzen 9 3900X, 24 threads):
CMAKE_INTERPROCEDURAL_OPTIMIZATION=ON)-flto)LTO inlines more across translation units and the binaries grow; the speed-up stays within 1-4%, so it stays off.
🤖 Generated with Claude Code