Skip to content

Commit

Permalink
Merge pull request #942 from CommunityToolkit/dev/windows-sdk-validation
Browse files Browse the repository at this point in the history
Add .targets to validate the Windows SDK version
  • Loading branch information
Sergio0694 committed Sep 12, 2024
1 parent a51c5ca commit 3c7ef2f
Show file tree
Hide file tree
Showing 3 changed files with 81 additions and 0 deletions.
77 changes: 77 additions & 0 deletions src/CommunityToolkit.Mvvm/CommunityToolkit.Mvvm.WindowsSdk.targets
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
<Project>

<PropertyGroup>

<!-- Verification of the Windows SDK package version is enabled by default-->
<MvvmToolkitEnableWindowsSdkPackageVersionValidation Condition="'$(MvvmToolkitEnableWindowsSdkPackageVersionValidation)' == ''">true</MvvmToolkitEnableWindowsSdkPackageVersionValidation>

<!--
Wired up the Windows SDK package version verification target, if enabled.
This only applies to TFMs targeting Windows 10 or later.
-->
<ResolveReferencesDependsOn Condition="'$(MSBuildProjectExtension)' == '.csproj' AND
'$(MvvmToolkitVerifyWindowsSdkPackageVersion)' != 'false' AND
'$(MvvmToolkitEnableWindowsSdkPackageVersionValidation)' != 'false' AND
$([MSBuild]::IsTargetFrameworkCompatible('$(TargetFramework)', 'net8.0-windows10.0.17763.0'))">
$(ResolveReferencesDependsOn);MvvmToolkitVerifyWindowsSdkPackageVersion
</ResolveReferencesDependsOn>
</PropertyGroup>

<!-- Custom target to verify the Windows SDK package version -->
<Target Name="MvvmToolkitVerifyWindowsSdkPackageVersion" DependsOnTargets="ResolveAssemblyReferences">
<PropertyGroup>

<!--
The minimum build versions for the Windows SDK package. We keep track of up to 3 different versions:
- The minimum Windows SDK package for which we don't want to emit a build error.
- The recommended Windows SDK package for UWP projects using the .NET 9 SDK (with UWP XAML projections).
- The recommended Windows SDK package for WindowsAppSDK projects (ie. without UWP XAML projections).
-->
<_MvvmToolkitWindowsSdkPackageMinBuild>38</_MvvmToolkitWindowsSdkPackageMinBuild>
<_MvvmToolkitWindowsSdkPackageRecommendedUwpBuild>39</_MvvmToolkitWindowsSdkPackageRecommendedUwpBuild>
<_MvvmToolkitWindowsSdkPackageRecommendedWindowsAppSDKBuild>41</_MvvmToolkitWindowsSdkPackageRecommendedWindowsAppSDKBuild>

<!-- Switch on the recommended one based on configuration -->
<_MvvmToolkitWindowsSdkPackageRecommendedBuild>$(_MvvmToolkitWindowsSdkPackageMinBuild)</_MvvmToolkitWindowsSdkPackageRecommendedBuild>
<_MvvmToolkitWindowsSdkPackageRecommendedBuild Condition="'$(UseUwp)' == 'true'">$(_MvvmToolkitWindowsSdkPackageRecommendedUwpBuild)</_MvvmToolkitWindowsSdkPackageRecommendedBuild>
<_MvvmToolkitWindowsSdkPackageRecommendedBuild Condition="'$(UseUwp)' != 'true'">$(_MvvmToolkitWindowsSdkPackageRecommendedWindowsAppSDKBuild)</_MvvmToolkitWindowsSdkPackageRecommendedBuild>
</PropertyGroup>
<ItemGroup>

<!-- If 'WindowsSdkPackageVersion' is explicitly set, validate against that -->
<_MvvmToolkitWindowsSdkPackage Include="$(WindowsSdkPackageVersion)" Condition="'$(WindowsSdkPackageVersion)' != ''">
<Referenced>$(WindowsSdkPackageVersion)</Referenced>
<Required>10.0.$([System.Version]::Parse("$(WindowsSdkPackageVersion.Split('-')[0])").Build).$(_MvvmToolkitWindowsSdkPackageMinBuild)</Required>
<Recommended>10.0.$([System.Version]::Parse("$(WindowsSdkPackageVersion.Split('-')[0])").Build).$(_MvvmToolkitWindowsSdkPackageRecommendedBuild)</Recommended>
</_MvvmToolkitWindowsSdkPackage>

<!-- Otherwise, validate against the framework reference package -->
<_MvvmToolkitWindowsSdkPackage
Include="@(ResolvedFrameworkReference)"
Condition="'$(WindowsSdkPackageVersion)' == '' AND '@(ResolvedFrameworkReference)' != '' AND '%(Identity)' == 'Microsoft.Windows.SDK.NET.Ref'">
<Referenced>%(ResolvedFrameworkReference.TargetingPackVersion)</Referenced>
<Required>10.0.$([System.Version]::Parse("%(ResolvedFrameworkReference.TargetingPackVersion)").Build).$(_MvvmToolkitWindowsSdkPackageMinBuild)</Required>
<Recommended>10.0.$([System.Version]::Parse("%(ResolvedFrameworkReference.TargetingPackVersion)").Build).$(_MvvmToolkitWindowsSdkPackageRecommendedBuild)</Recommended>
</_MvvmToolkitWindowsSdkPackage>

<!-- Check whether the referenced Windows SDK package is compatible -->
<_MvvmToolkitCompatibleWindowsSdkPackages
Include="@(_MvvmToolkitWindowsSdkPackage)"
Condition="'@(_MvvmToolkitWindowsSdkPackage)' != '' AND $([MSBuild]::VersionGreaterThanOrEquals(%(Referenced), %(Required)))" />
</ItemGroup>
<PropertyGroup>

<!-- Extract the required and recommended Windows SDK package version (to show if the one in use is not compatible) -->
<_MvvmToolkitWindowsSdkPackageRequired>@(_MvvmToolkitWindowsSdkPackage->'%(Required)')</_MvvmToolkitWindowsSdkPackageRequired>
<_MvvmToolkitWindowsSdkPackageRecommended>@(_MvvmToolkitWindowsSdkPackage->'%(Recommended)')</_MvvmToolkitWindowsSdkPackageRecommended>
</PropertyGroup>

<!-- Emit an error if the Windows SDK package version isn't valid -->
<Error
Condition="'@(_MvvmToolkitCompatibleWindowsSdkPackages)' == ''"
Code="MVVMTKCFG0003"
HelpLink="https://aka.ms/mvvmtoolkit/errors/mvvmtkcfg0003"
Text="This version of the MVVM Toolkit requires 'Microsoft.Windows.SDK.NET.Ref' version '$(_MvvmToolkitWindowsSdkPackageRequired)' or later. Please update to .NET SDK 8.0.109, 8.0.305 or 8.0.402 (or later). Alternatively, use a temporary 'Microsoft.Windows.SDK.NET.Ref' reference, which can be done by setting the 'WindowsSdkPackageVersion' property in your .csproj file. For your project configuration, it is recommended to set the package version to '$(_MvvmToolkitWindowsSdkPackageRecommended)'." />
</Target>

</Project>
2 changes: 2 additions & 0 deletions src/CommunityToolkit.Mvvm/CommunityToolkit.Mvvm.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -99,9 +99,11 @@
<!-- Include the custom .targets files (shared across TFMs) -->
<None Include="CommunityToolkit.Mvvm.FeatureSwitches.targets" PackagePath="build" Pack="true" />
<None Include="CommunityToolkit.Mvvm.SourceGenerators.targets" PackagePath="build" Pack="true" />
<None Include="CommunityToolkit.Mvvm.WindowsSdk.targets" PackagePath="build" Pack="true" />
<None Include="CommunityToolkit.Mvvm.targets" PackagePath="build" Pack="true" />
<None Include="CommunityToolkit.Mvvm.FeatureSwitches.targets" PackagePath="buildTransitive" Pack="true" />
<None Include="CommunityToolkit.Mvvm.SourceGenerators.targets" PackagePath="buildTransitive" Pack="true" />
<None Include="CommunityToolkit.Mvvm.WindowsSdk.targets" PackagePath="buildTransitive" Pack="true" />
<None Include="CommunityToolkit.Mvvm.targets" PackagePath="buildTransitive" Pack="true" />

<!--
Expand Down
2 changes: 2 additions & 0 deletions src/CommunityToolkit.Mvvm/CommunityToolkit.Mvvm.targets
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,12 @@
<PropertyGroup>
<_CommunityToolkitMvvmFeatureSwitchesTargets>$(MSBuildThisFileDirectory)CommunityToolkit.Mvvm.FeatureSwitches.targets</_CommunityToolkitMvvmFeatureSwitchesTargets>
<_CommunityToolkitMvvmSourceGeneratorsTargets>$(MSBuildThisFileDirectory)CommunityToolkit.Mvvm.SourceGenerators.targets</_CommunityToolkitMvvmSourceGeneratorsTargets>
<_CommunityToolkitMvvmWindowsSdkTargets>$(MSBuildThisFileDirectory)CommunityToolkit.Mvvm.WindowsSdk.targets</_CommunityToolkitMvvmWindowsSdkTargets>
</PropertyGroup>

<!-- Import all available .targets -->
<Import Project="$(_CommunityToolkitMvvmFeatureSwitchesTargets)" />
<Import Project="$(_CommunityToolkitMvvmSourceGeneratorsTargets)" />
<Import Project="$(_CommunityToolkitMvvmWindowsSdkTargets)" />

</Project>

0 comments on commit 3c7ef2f

Please sign in to comment.