From d1dfa7ea123c2f9061fa49ea96538301b808e88b Mon Sep 17 00:00:00 2001 From: roblabla Date: Wed, 14 Oct 2026 12:44:57 +0200 Subject: [PATCH] Default to the newest CRT toolset, including the unversioned one The default CRT version was the highest `Microsoft.VisualStudio.Component.VC..x86.x64` dependency of BuildTools. The problem is, the newest toolset of a given manifest isn't always one of them. For instance, take this manifest (which is the latest version of VS2019 at the time of writing): https://raw.githubusercontent.com/roblabla/msvc-manifest-history/208c7e13a9fb9fc3bf7561d7e2d49388ead8d60a/manifest.json Within it, the versioned components stop at 14.29.16.10. However, the toolset pointed to by the `Microsoft.VisualCpp.CRT.Headers` component is 14.29.16.11. See this dependency tree: Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -> Microsoft.VisualStudio.PackageGroup.VC.Tools.x86 -> Microsoft.VisualCpp.CRT.Headers -> Microsoft.VC.14.29.16.11.CRT.Headers.base Versus the versioned deptree: Microsoft.VisualStudio.Component.VC.14.29.16.10.x86.x64 -> Microsoft.VC.14.29.16.10.CRT.Headers -> Microsoft.VC.14.29.16.10.CRT.Headers.base This means that previously, xwin defaulted to an older version of the CRT, a different one from what the Visual Studio default would install. To fix this issue, the toolset the alias points at is now a candidate as well. The deterministic test pins a VS 2019 manifest, so its snapshot moves from the 16.10 to the 16.11 CRT. --crt-version also accepts a version that only exists as a headers package, so 14.29.16.11 can be requested explicitly. --- src/lib.rs | 31 ++++- .../deterministic__verify_deterministic.snap | 113 +++++++++--------- 2 files changed, 82 insertions(+), 62 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 4173218..5d50f04 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -377,23 +377,42 @@ fn get_crt( versions::Version::new(&user) .with_context(|| format!("invalid CRT version '{user}' specified"))?; - build_tools - .dependencies - .get(&format!( + anyhow::ensure!( + build_tools.dependencies.contains_key(&format!( "Microsoft.VisualStudio.Component.VC.{user}.x86.x64" - )) - .with_context(|| format!("CRT version '{user}' does not exist in the manifest"))?; + )) || pkgs.contains_key(&format!("Microsoft.VC.{user}.CRT.Headers.base")), + "CRT version '{user}' does not exist in the manifest" + ); user } else { + // By default, we want to install the latest version of the CRT. The + // easiest way is to use the Microsoft.VisualCpp.CRT.Headers alias, which + // always points to the latest version, and grab the actual version from + // its dependencies. + // + // While versioned components of the form `Microsoft.VisualStudio.Component.VC..*` exists, + // those don't always contain the latest version, especially in older + // versions of Visual Studio. + // newest one. + let latest_toolset = pkgs + .get("Microsoft.VisualCpp.CRT.Headers") + .into_iter() + .flat_map(|alias| alias.dependencies.keys()) + .filter_map(|key| { + key.strip_prefix("Microsoft.VC.")? + .strip_suffix(".CRT.Headers.base") + }); + let crt_version_rs_versions = build_tools .dependencies .keys() .filter_map(|key| { key.strip_prefix("Microsoft.VisualStudio.Component.VC.") .and_then(|s| s.strip_suffix(".x86.x64")) - .and_then(versions::Version::new) }) + .chain(latest_toolset) + .filter_map(versions::Version::new) .max() .context("unable to find latest CRT version")?; diff --git a/tests/snapshots/deterministic__verify_deterministic.snap b/tests/snapshots/deterministic__verify_deterministic.snap index 95c2a56..9225d33 100644 --- a/tests/snapshots/deterministic__verify_deterministic.snap +++ b/tests/snapshots/deterministic__verify_deterministic.snap @@ -4,7 +4,7 @@ expression: actual --- crt/include/ATLComMem.h @ b7eb4b56527ca224 crt/include/ATLComTime.h @ 9bf1e896332d1648 -crt/include/CodeAnalysis/Warnings.h @ 55ab60b57eb1dccc +crt/include/CodeAnalysis/Warnings.h @ f3ecb2f8261d50ca crt/include/CodeAnalysis/sourceannotations.h @ 29368f313ab290b crt/include/Manifest/PerMonitorHighDPIAware.manifest @ 3d0230dddbe0f807 crt/include/Manifest/dpiaware.manifest @ 95a8b8923d3c7a2 @@ -30,11 +30,11 @@ crt/include/array @ b6b05747c65d7b0f crt/include/atlacc.h @ 158df3c5609bf6fa crt/include/atlalloc.h @ ca726fa4a5b4378 crt/include/atlbase.h @ f069f26c819834de -crt/include/atlbuild.h @ bc1daf888158cac7 +crt/include/atlbuild.h @ 741cbf8ce5fee276 crt/include/atlchecked.h @ 55871d5dc2ca63c9 crt/include/atlcoll.h @ 870ec38f89f97cff crt/include/atlcom.h @ ce80a3a8e76cd3e6 -crt/include/atlcomcli.h @ b6a45e8e23b65263 +crt/include/atlcomcli.h @ 3daef620d04dbc1c crt/include/atlconv.h @ ccfbfb9a20ba6135 crt/include/atlcore.h @ c699c4f7509fd65b crt/include/atlctl.h @ 71eb95c969a34e63 @@ -67,7 +67,7 @@ crt/include/atlsimpstr.h @ 261861248bd779c7 crt/include/atlsnap.h @ 56fc7aff24225b9c crt/include/atlsocket.h @ 6018b8034fa59f5c crt/include/atlstdthunk.h @ cdc5b2fb984f2302 -crt/include/atlstr.h @ 48b2c4543d9c0760 +crt/include/atlstr.h @ 52bef8668b8ed7a6 crt/include/atlsync.h @ 470153fd51c9a73e crt/include/atlthunk.h @ 372e23d4e5c5e632 crt/include/atltime.h @ c3a3b363d478938 @@ -90,7 +90,7 @@ crt/include/cfenv @ c1f654070a5640af crt/include/cfguard.h @ c3d100cd3e0ba896 crt/include/cfloat @ a961d0a4895a1ae2 crt/include/charconv @ 1579c57c9b8202dc -crt/include/chrono @ 33722f1f747f43a +crt/include/chrono @ e69a0ee411770c82 crt/include/cinttypes @ dbd5840e8fbfc24c crt/include/ciso646 @ e3bc4729a8b929fd crt/include/cliext/adapter @ 36141e922acf9516 @@ -135,7 +135,7 @@ crt/include/concurrent_vector.h @ adcadc2eb16961f7 crt/include/condition_variable @ 24d21deae380570e crt/include/coroutine @ 43136410d35316b7 crt/include/crtdefs.h @ baa7a12f15ebd9c9 -crt/include/crtversion.h @ 3d290adda2d3fa84 +crt/include/crtversion.h @ 869daf0d4c47ea52 crt/include/csetjmp @ c3be9102d5b5e692 crt/include/csignal @ 6a687d064f6aaf05 crt/include/cstdalign @ 9bcb7e12534ba988 @@ -259,7 +259,7 @@ crt/include/experimental/unordered_map @ 6a154d70b250406b crt/include/experimental/unordered_set @ 22d3f21edbdb2add crt/include/experimental/vector @ 2a23ebb980470f91 crt/include/filesystem @ a7497ab98d5b5317 -crt/include/format @ ba4e8b32045d37e5 +crt/include/format @ 1e605ff9757cdae8 crt/include/forward_list @ 542b90e50e48b123 crt/include/fstream @ cffc9cfb0723abfc crt/include/functional @ de63157e528d4ae5 @@ -273,8 +273,9 @@ crt/include/immintrin.h @ af4b9cbc37f97b52 crt/include/initializer_list @ bef540e7adfbe9a3 crt/include/internal_concurrent_hash.h @ bb72e5bcaf0782f0 crt/include/internal_split_ordered_list.h @ da607c437e285eaa -crt/include/intrin.h @ f0b758b5046c8b32 -crt/include/intrin0.h @ 6b9ff796786c4b28 +crt/include/intrin.h @ 20da5a9215729422 +crt/include/intrin0.h @ 29d9c675a587aac6 +crt/include/intrin0.inl.h @ 4db95d7ecb1e0331 crt/include/invkprxy.h @ c88f9ce6e4731f2b crt/include/iomanip @ 6e8c32f79af6a2cb crt/include/ios @ a18d82db3e304d62 @@ -340,9 +341,9 @@ crt/include/ppltaskscheduler.h @ 3bf1c5eb839d69a0 crt/include/pplwin.h @ 90108f94f0b55608 crt/include/queue @ 318951fb34866b43 crt/include/random @ 450b744362e4b596 -crt/include/ranges @ 56b733e6b2e73cea +crt/include/ranges @ aab22690c6950dc8 crt/include/ratio @ 777e02879e903c63 -crt/include/regex @ c06640756b6b7541 +crt/include/regex @ 693b7bdc73fded52 crt/include/rtcapi.h @ cb872dfc0822a63e crt/include/rttidata.h @ 22379de71323554e crt/include/sal.h @ 86652daf4fc3bda6 @@ -417,7 +418,7 @@ crt/include/xlocmes @ c3cd79e1a2b8efd0 crt/include/xlocmon @ 584a2e05f027694c crt/include/xlocnum @ a01eff762b0e4ec2 crt/include/xloctime @ f9bc12a28c856130 -crt/include/xmemory @ 4c4f9630e60eab3b +crt/include/xmemory @ d165ce1eaacb0965 crt/include/xmmintrin.h @ 9646a5b3018fdc4a crt/include/xnode_handle.h @ aaaa3156f8a324e2 crt/include/xpolymorphic_allocator.h @ 8be15b0630367903 @@ -428,58 +429,58 @@ crt/include/xthreads.h @ e40f1410252abfe1 crt/include/xtimec.h @ 14b4645a484936ff crt/include/xtr1common @ 132c66d577948fb4 crt/include/xtree @ 153ee56fe7ba9bcc -crt/include/xutility @ 96f7342bdbb65c69 +crt/include/xutility @ b65c197f1217f33d crt/include/xxamp.h @ 7b966de893be040c crt/include/xxamp_inl.h @ cc2fcec909806cdd crt/include/ymath.h @ 6cfc2d778d7555b2 crt/include/yvals.h @ 811af4b0e64f4abf -crt/include/yvals_core.h @ cd26c06f6a34d6c1 +crt/include/yvals_core.h @ 7518367ac2a0402e crt/include/zmmintrin.h @ ca61f9cab10dedbd crt/lib/x86_64/LIBCMT.lib => libcmt.lib crt/lib/x86_64/MSVCRT.lib => msvcrt.lib -crt/lib/x86_64/Microsoft.VisualC.STLCLR.dll @ 878e88efc0058496 +crt/lib/x86_64/Microsoft.VisualC.STLCLR.dll @ 8e363538eeedaa2 crt/lib/x86_64/OLDNAMES.lib => oldnames.lib -crt/lib/x86_64/aligned_new.lib @ 4250e21e2b576da5 -crt/lib/x86_64/atls.lib @ 9bc512529bcd326f -crt/lib/x86_64/binmode.obj @ 437ef88a24383419 -crt/lib/x86_64/chkstk.obj @ 62e1047d74a124f7 -crt/lib/x86_64/commode.obj @ 9a422d4e7c458ccd -crt/lib/x86_64/comsupp.lib @ 24ef3c13ab50c764 -crt/lib/x86_64/comsuppw.lib @ 63f7d17fc2e2823e -crt/lib/x86_64/concrt.lib @ 6db7343409fda998 -crt/lib/x86_64/delayimp.lib @ 221b26a34b9ae018 -crt/lib/x86_64/exe_initialize_mta.lib @ 729fb1d53fe1f1b2 -crt/lib/x86_64/invalidcontinue.obj @ 31f74f81d0a2e030 -crt/lib/x86_64/iso_stdio_wide_specifiers.lib @ 5e95d1bae3c3d946 -crt/lib/x86_64/legacy_stdio_definitions.lib @ 83023b23074a030d -crt/lib/x86_64/legacy_stdio_float_rounding.obj @ c7b506dacdec68ea -crt/lib/x86_64/legacy_stdio_wide_specifiers.lib @ d1d505f02345a844 -crt/lib/x86_64/libcmt.lib @ 738ac63897fffc42 -crt/lib/x86_64/libconcrt.lib @ 2653295f54bac37a -crt/lib/x86_64/libconcrt1.lib @ 678aeedb71575808 -crt/lib/x86_64/libcpmt.lib @ 4b3b31ad564183d8 -crt/lib/x86_64/libcpmt1.lib @ 4c7cf3abea456ea6 -crt/lib/x86_64/libomp.lib @ e7edb54e9a4ee055 -crt/lib/x86_64/libvcruntime.lib @ c3657da1eae5589 -crt/lib/x86_64/loosefpmath.obj @ a0aa2a3af04fdd95 -crt/lib/x86_64/msvcmrt.lib @ 1a576a91dd7aeac3 -crt/lib/x86_64/msvcmrt_netcore.lib @ 1252014eee2fd34b -crt/lib/x86_64/msvcprt.lib @ 69bc0c15e8c26dd4 -crt/lib/x86_64/msvcrt.lib @ deb3de1604e7dde4 -crt/lib/x86_64/newmode.obj @ 7cb0dcaa003ca339 -crt/lib/x86_64/noarg.obj @ 5a458fa3875df3d3 -crt/lib/x86_64/noenv.obj @ 514eefd10e9ca39a -crt/lib/x86_64/notelemetry.obj @ 7455c5adb70f3ca6 -crt/lib/x86_64/nothrownew.obj @ 754cc035e02aaa0d -crt/lib/x86_64/oldnames.lib @ 457c412bb3ab0e00 -crt/lib/x86_64/ptrustm.lib @ 55d67126e5eee9c8 -crt/lib/x86_64/setargv.obj @ 927a567efa165537 -crt/lib/x86_64/threadlocale.obj @ d5f52cf6f7540528 -crt/lib/x86_64/vcamp.lib @ 83d4c236606bd8e5 -crt/lib/x86_64/vccorlib.lib @ 88dff09680406ce8 -crt/lib/x86_64/vcomp.lib @ 290001f1cf8658dc -crt/lib/x86_64/vcruntime.lib @ 13fe902a335d605f -crt/lib/x86_64/wsetargv.obj @ 887c6f64baebe131 +crt/lib/x86_64/aligned_new.lib @ 56f09da0675980d7 +crt/lib/x86_64/atls.lib @ 5e88a0cdcd85ec7e +crt/lib/x86_64/binmode.obj @ af0a9641006cc445 +crt/lib/x86_64/chkstk.obj @ a9901298cd1bbf80 +crt/lib/x86_64/commode.obj @ 5e27c2cfafb2c4c5 +crt/lib/x86_64/comsupp.lib @ ef768c0f8b6ae387 +crt/lib/x86_64/comsuppw.lib @ fa9edcda513275fc +crt/lib/x86_64/concrt.lib @ 80c673bcd4fffd2d +crt/lib/x86_64/delayimp.lib @ 22a358e359d994f6 +crt/lib/x86_64/exe_initialize_mta.lib @ 6a220451faa31dba +crt/lib/x86_64/invalidcontinue.obj @ bad4bb39d85abae1 +crt/lib/x86_64/iso_stdio_wide_specifiers.lib @ 9364d66902d99d26 +crt/lib/x86_64/legacy_stdio_definitions.lib @ 644db77fb203c2ab +crt/lib/x86_64/legacy_stdio_float_rounding.obj @ 6f43c4d80508a284 +crt/lib/x86_64/legacy_stdio_wide_specifiers.lib @ 40f4fa2496c667e7 +crt/lib/x86_64/libcmt.lib @ e4a9309d49d5c970 +crt/lib/x86_64/libconcrt.lib @ 2b752fc41c08867a +crt/lib/x86_64/libconcrt1.lib @ b6ad80ec367ca2b +crt/lib/x86_64/libcpmt.lib @ ad7817a9f0ca32d1 +crt/lib/x86_64/libcpmt1.lib @ 2b9c2b6ee8086bf5 +crt/lib/x86_64/libomp.lib @ 7856bbabf93f4820 +crt/lib/x86_64/libvcruntime.lib @ 70c49fbed433e130 +crt/lib/x86_64/loosefpmath.obj @ f195e3db6be0b16a +crt/lib/x86_64/msvcmrt.lib @ 2caab607682cfc93 +crt/lib/x86_64/msvcmrt_netcore.lib @ f8e20832d0392124 +crt/lib/x86_64/msvcprt.lib @ b931b44ad2501586 +crt/lib/x86_64/msvcrt.lib @ 8c3679e716fac19d +crt/lib/x86_64/newmode.obj @ ff4564b67615315 +crt/lib/x86_64/noarg.obj @ afdcf52b4846bb58 +crt/lib/x86_64/noenv.obj @ fdd2d8fecadb6c96 +crt/lib/x86_64/notelemetry.obj @ 7cec5c2193866318 +crt/lib/x86_64/nothrownew.obj @ aefdb511d162402d +crt/lib/x86_64/oldnames.lib @ ac780851771ce100 +crt/lib/x86_64/ptrustm.lib @ ebde8d522a74ce95 +crt/lib/x86_64/setargv.obj @ ecbb350f9434a079 +crt/lib/x86_64/threadlocale.obj @ 6b65ba1ec3828864 +crt/lib/x86_64/vcamp.lib @ 61f5008eaeeb3be5 +crt/lib/x86_64/vccorlib.lib @ d6166c0a28922d46 +crt/lib/x86_64/vcomp.lib @ 417c85ff1054a053 +crt/lib/x86_64/vcruntime.lib @ 63b9566df30f3867 +crt/lib/x86_64/wsetargv.obj @ 590021ce85b52c8f sdk/Include => include sdk/Lib => lib sdk/include/10.0.22000 => .