From 38977728ab22913f409bf5cc9f484b838f1b6e75 Mon Sep 17 00:00:00 2001 From: Martin Zikmund Date: Wed, 17 Jun 2026 16:15:07 +0200 Subject: [PATCH 1/4] Transition to Uno.Sdk tooling and fix Uno 6.x build warnings Bump the tooling submodule to the Uno.Sdk-based version and resolve the warnings (treated as errors) that the Uno 6.x upgrade surfaces when the Uno.Sdk gallery head compiles the components for net9.0: - CS0618: FocusManager.GetFocusedElement() is obsolete on WinUI 3/Uno; suppress the no-arg fallback used where XamlRoot is unavailable (UWP). - IL2087: trim-analysis on generic DependencyProperty.Register in the Animations base types; suppress (the type is only used as DP metadata). The Uno.Sdk head (net9.0-desktop and net9.0-browserwasm) now builds end-to-end against the toolkit components. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../src/Xaml/Abstract/Animation{TValue,TKeyFrame}.cs | 6 ++++++ .../src/Xaml/Abstract/KeyFrame{TValue,TKeyFrame}.cs | 3 +++ components/Behaviors/src/Headers/HeaderBehaviorBase.cs | 3 +++ components/DeveloperTools/src/FocusTracker/FocusTracker.cs | 3 +++ components/Segmented/src/Segmented/Segmented.cs | 3 +++ .../SettingsControls/src/SettingsCard/SettingsCard.cs | 3 +++ .../TokenizingTextBox/src/TokenizingTextBox.Selection.cs | 3 +++ components/TokenizingTextBox/src/TokenizingTextBox.cs | 3 +++ tooling | 2 +- 9 files changed, 28 insertions(+), 1 deletion(-) diff --git a/components/Animations/src/Xaml/Abstract/Animation{TValue,TKeyFrame}.cs b/components/Animations/src/Xaml/Abstract/Animation{TValue,TKeyFrame}.cs index cc98af6e0..12e845e8d 100644 --- a/components/Animations/src/Xaml/Abstract/Animation{TValue,TKeyFrame}.cs +++ b/components/Animations/src/Xaml/Abstract/Animation{TValue,TKeyFrame}.cs @@ -30,11 +30,14 @@ public TValue? To /// /// Identifies the dependency property. /// + // typeof(TValue?) is only used as dependency property metadata, not for reflective construction. +#pragma warning disable IL2087 public static readonly DependencyProperty ToProperty = DependencyProperty.Register( nameof(To), typeof(TValue?), typeof(Animation), new PropertyMetadata(null)); +#pragma warning restore IL2087 /// /// Gets or sets the optional starting value for the animation. @@ -48,11 +51,14 @@ public TValue? From /// /// Identifies the dependency property. /// + // typeof(TValue?) is only used as dependency property metadata, not for reflective construction. +#pragma warning disable IL2087 public static readonly DependencyProperty FromProperty = DependencyProperty.Register( nameof(From), typeof(TValue?), typeof(Animation), new PropertyMetadata(null)); +#pragma warning restore IL2087 /// /// Gets or sets the optional keyframe collection for the current animation. diff --git a/components/Animations/src/Xaml/Abstract/KeyFrame{TValue,TKeyFrame}.cs b/components/Animations/src/Xaml/Abstract/KeyFrame{TValue,TKeyFrame}.cs index ea5627cec..fbe2fadaa 100644 --- a/components/Animations/src/Xaml/Abstract/KeyFrame{TValue,TKeyFrame}.cs +++ b/components/Animations/src/Xaml/Abstract/KeyFrame{TValue,TKeyFrame}.cs @@ -60,11 +60,14 @@ public TValue? Value /// /// Identifies the dependency property. /// + // typeof(TValue?) is only used as dependency property metadata, not for reflective construction. +#pragma warning disable IL2087 public static readonly DependencyProperty ValueProperty = DependencyProperty.Register( nameof(Value), typeof(TValue?), typeof(KeyFrame), new PropertyMetadata(null)); +#pragma warning restore IL2087 /// /// Gets or sets the optional expression for the current keyframe. diff --git a/components/Behaviors/src/Headers/HeaderBehaviorBase.cs b/components/Behaviors/src/Headers/HeaderBehaviorBase.cs index 57b1c3756..e1eccdf06 100644 --- a/components/Behaviors/src/Headers/HeaderBehaviorBase.cs +++ b/components/Behaviors/src/Headers/HeaderBehaviorBase.cs @@ -184,7 +184,10 @@ private void ScrollViewer_GotFocus(object sender, RoutedEventArgs e) } else { + // Obsolete on WinUI 3/Uno, but required as a fallback where XamlRoot is unavailable (e.g. UWP). +#pragma warning disable CS0618 focusedElement = FocusManager.GetFocusedElement()!; +#pragma warning restore CS0618 } // To prevent Popups (Flyouts...) from triggering the autoscroll, we check if the focused element has a valid parent. diff --git a/components/DeveloperTools/src/FocusTracker/FocusTracker.cs b/components/DeveloperTools/src/FocusTracker/FocusTracker.cs index 39feacb29..c41c3496a 100644 --- a/components/DeveloperTools/src/FocusTracker/FocusTracker.cs +++ b/components/DeveloperTools/src/FocusTracker/FocusTracker.cs @@ -83,7 +83,10 @@ private void Start() } else { + // Obsolete on WinUI 3/Uno, but required as a fallback where XamlRoot is unavailable (e.g. UWP). +#pragma warning disable CS0618 if (FocusManager.GetFocusedElement() is FrameworkElement element) +#pragma warning restore CS0618 { FocusOnControl(element); } diff --git a/components/Segmented/src/Segmented/Segmented.cs b/components/Segmented/src/Segmented/Segmented.cs index 6fbc6c301..ff85cb42e 100644 --- a/components/Segmented/src/Segmented/Segmented.cs +++ b/components/Segmented/src/Segmented/Segmented.cs @@ -116,7 +116,10 @@ private bool MoveFocus(int adjustment) } else { + // Obsolete on WinUI 3/Uno, but required as a fallback where XamlRoot is unavailable (e.g. UWP). +#pragma warning disable CS0618 return FocusManager.GetFocusedElement() as SegmentedItem; +#pragma warning restore CS0618 } } diff --git a/components/SettingsControls/src/SettingsCard/SettingsCard.cs b/components/SettingsControls/src/SettingsCard/SettingsCard.cs index ef1d4a09e..02ecd2358 100644 --- a/components/SettingsControls/src/SettingsCard/SettingsCard.cs +++ b/components/SettingsControls/src/SettingsCard/SettingsCard.cs @@ -322,7 +322,10 @@ private void CheckVerticalSpacingState(VisualState s) } else { + // Obsolete on WinUI 3/Uno, but required as a fallback where XamlRoot is unavailable (e.g. UWP). +#pragma warning disable CS0618 return FocusManager.GetFocusedElement() as FrameworkElement; +#pragma warning restore CS0618 } } diff --git a/components/TokenizingTextBox/src/TokenizingTextBox.Selection.cs b/components/TokenizingTextBox/src/TokenizingTextBox.Selection.cs index 0b20a6fee..b13a21c28 100644 --- a/components/TokenizingTextBox/src/TokenizingTextBox.Selection.cs +++ b/components/TokenizingTextBox/src/TokenizingTextBox.Selection.cs @@ -141,7 +141,10 @@ private bool MoveFocusAndSelection(MoveDirection direction) } else { + // Obsolete on WinUI 3/Uno, but required as a fallback where XamlRoot is unavailable (e.g. UWP). +#pragma warning disable CS0618 return FocusManager.GetFocusedElement() as TokenizingTextBoxItem; +#pragma warning restore CS0618 } } diff --git a/components/TokenizingTextBox/src/TokenizingTextBox.cs b/components/TokenizingTextBox/src/TokenizingTextBox.cs index db1dd0122..ea48b3eb1 100644 --- a/components/TokenizingTextBox/src/TokenizingTextBox.cs +++ b/components/TokenizingTextBox/src/TokenizingTextBox.cs @@ -361,7 +361,10 @@ private object GetFocusedElement() } else { + // Obsolete on WinUI 3/Uno, but required as a fallback where XamlRoot is unavailable (e.g. UWP). +#pragma warning disable CS0618 return FocusManager.GetFocusedElement()!; +#pragma warning restore CS0618 } } diff --git a/tooling b/tooling index 394263e10..ded6698f1 160000 --- a/tooling +++ b/tooling @@ -1 +1 @@ -Subproject commit 394263e1054cac12c5feb49ae2458f5e13681a68 +Subproject commit ded6698f1c9aedc8d0228c52c3ed520b4b3b4134 From 011a01dba037ea4cda412e06a5cefe30559eb5b5 Mon Sep 17 00:00:00 2001 From: Martin Zikmund Date: Wed, 17 Jun 2026 16:28:06 +0200 Subject: [PATCH 2/4] CI: build the Uno.Sdk head for WinUI 3 wasm/desktop Mirror the tooling CI's Uno.Sdk handling: - Windows build matrix: add an `unosdk` entry (WinUI 3), exclude winui3+wasm (now covered by the Uno.Sdk head). Install workloads directly and build the Uno.Sdk head csproj with dotnet. - Replace the wasm-linux job with uno-linux: build the Uno.Sdk head for browserwasm and desktop instead of the legacy Uno.UI Wasm head. WinUI 2 (UWP) keeps the legacy Uno.UI 5.x wasm head. Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/build.yml | 67 ++++++++++++++++++++++++++----------- 1 file changed, 47 insertions(+), 20 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 32b857d4f..2f277f7e5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -67,7 +67,7 @@ jobs: fail-fast: false # prevent one matrix pipeline from being cancelled if one fails, we want them all to run to completion. matrix: winui: [2, 3] - multitarget: ['uwp', 'wasdk', 'wasm', 'wpf', 'linuxgtk', 'macos', 'ios', 'android'] + multitarget: ['uwp', 'wasdk', 'wasm', 'unosdk', 'wpf', 'linuxgtk', 'macos', 'ios', 'android'] exclude: # WinUI 2 not supported on wasdk - winui: 2 @@ -75,6 +75,12 @@ jobs: # WinUI 3 not supported on uwp - winui: 3 multitarget: uwp + # WinUI 3 wasm is covered by the Uno.Sdk head (unosdk) + - winui: 3 + multitarget: wasm + # Uno.Sdk head is WinUI 3 only + - winui: 2 + multitarget: unosdk # Steps represent a sequence of tasks that will be executed as part of the job steps: @@ -112,9 +118,9 @@ jobs: run: dotnet tool restore - name: Run Uno Check to Install Dependencies - if: ${{ matrix.multitarget != 'wasdk' && matrix.multitarget != 'linuxgtk' && matrix.multitarget != 'wpf' }} + if: ${{ matrix.multitarget != 'wasdk' && matrix.multitarget != 'linuxgtk' && matrix.multitarget != 'wpf' && matrix.multitarget != 'unosdk' }} run: > - dotnet tool run uno-check + dotnet tool run uno-check --ci --target ${{ matrix.multitarget }} --fix @@ -125,6 +131,12 @@ jobs: --skip vswin --verbose + # The Uno.Sdk head builds desktop/browserwasm/android (iOS is filtered on + # Windows). Install the matching workloads directly instead of uno-check. + - name: Install .NET workloads (Uno.Sdk head) + if: ${{ matrix.multitarget == 'unosdk' }} + run: dotnet workload install wasm-tools android ios maui + - name: Add msbuild to PATH uses: microsoft/setup-msbuild@v2 with: @@ -132,11 +144,19 @@ jobs: # Generate full solution with all projects (sample gallery heads, components, tests) - name: Generate solution with ${{ matrix.multitarget }} gallery, components and tests + if: ${{ matrix.multitarget != 'unosdk' }} working-directory: ./ run: powershell -version 5.1 -command "./tooling/GenerateAllSolution.ps1 -MultiTargets ${{ matrix.multitarget }} ${{ env.ENABLE_DIAGNOSTICS == 'true' && ' -UseDiagnostics' || '' }} -WinUIMajorVersion ${{ matrix.winui }}" -ErrorAction Stop + # The Uno.Sdk head covers wasm (browserwasm) for WinUI 3; generate with it included + - name: Generate solution with Uno.Sdk gallery, components and tests + if: ${{ matrix.multitarget == 'unosdk' }} + working-directory: ./ + run: powershell -version 5.1 -command "./tooling/GenerateAllSolution.ps1 -MultiTargets wasm -IncludeUnoSdkHead -WinUIMajorVersion 3${{ env.ENABLE_DIAGNOSTICS == 'true' && ' -UseDiagnostics' || '' }}" -ErrorAction Stop + # Build solution - name: MSBuild + if: ${{ matrix.multitarget != 'unosdk' }} run: > msbuild.exe /restore /nowarn:MSB4011 /p:Configuration=Release @@ -145,6 +165,12 @@ jobs: /v:${{ env.MSBUILD_VERBOSITY }} CommunityToolkit.AllComponents.sln + # The Uno.Sdk head is a single project covering desktop/browserwasm/android + # (iOS is filtered on Windows); build it directly with dotnet. + - name: Build Uno.Sdk head + if: ${{ matrix.multitarget == 'unosdk' }} + run: dotnet build tooling/ProjectHeads/AllComponents/Uno/CommunityToolkit.App.Uno.csproj -p:Configuration=Release ${{ env.ENABLE_DIAGNOSTICS == 'true' && '/bl' || '' }} + # Run tests - name: Setup VSTest Path uses: darenm/setup-vstest@3a16d909a1f3bbc65b52f8270d475d905e7d3e44 @@ -424,7 +450,7 @@ jobs: --api-key ${{ secrets.NUGET_PACKAGE_PUSH_TOKEN }} --skip-duplicate - wasm-linux: + uno-linux: runs-on: ubuntu-latest steps: @@ -439,6 +465,12 @@ jobs: with: global-json-file: global.json + # iOS/maccatalyst aren't installable on Linux (Uno.Sdk filters those TFMs + # there). android + wasm-tools are both required: even a single-TFM build + # restores all of the head's TargetFrameworks, validating net9.0-android. + - name: Install .NET workloads + run: dotnet workload install android wasm-tools + - name: .NET Info (if diagnostics) if: ${{ env.ENABLE_DIAGNOSTICS == 'true' }} run: dotnet --info @@ -447,31 +479,26 @@ jobs: - name: Restore dotnet tools run: dotnet tool restore - - name: Enable WASM TargetFrameworks - shell: pwsh - working-directory: ./${{ env.MULTI_TARGET_DIRECTORY }} - run: ./UseTargetFrameworks.ps1 wasm - + # Generate the full solution with the Uno.Sdk gallery head, components and tests - name: Generate solution shell: pwsh working-directory: ./ - run: ./tooling/GenerateAllSolution.ps1${{ env.ENABLE_DIAGNOSTICS == 'true' && ' -UseDiagnostics' || '' }} + run: ./tooling/GenerateAllSolution.ps1 -MultiTargets wasm -IncludeUnoSdkHead -WinUIMajorVersion 3${{ env.ENABLE_DIAGNOSTICS == 'true' && ' -UseDiagnostics' || '' }} - - name: Install ninja for WASM native dependencies - run: sudo apt-get install ninja-build + - name: Build Uno head (browserwasm) + shell: pwsh + working-directory: ./ + run: dotnet build tooling/ProjectHeads/AllComponents/Uno/CommunityToolkit.App.Uno.csproj -f net9.0-browserwasm -p:Configuration=Release - # Issue with Comment Links currently, see: https://github.com/mrlacey/CommentLinks/issues/38 - # See launch.json configuration file for analogous command we're emulating here to build LINK: ../../.vscode/launch.json:CommunityToolkit.App.Wasm.csproj - - name: dotnet build - working-directory: ./${{ env.HEADS_DIRECTORY }}/AllComponents/Wasm/ - run: dotnet build /r /bl -v:${{ env.MSBUILD_VERBOSITY }} - - # TODO: Do we want to run tests here? Can we do that on linux easily? + - name: Build Uno head (desktop) + shell: pwsh + working-directory: ./ + run: dotnet build tooling/ProjectHeads/AllComponents/Uno/CommunityToolkit.App.Uno.csproj -f net9.0-desktop -p:Configuration=Release - name: Artifact - Diagnostic Logs uses: actions/upload-artifact@v4 if: ${{ (env.ENABLE_DIAGNOSTICS == 'true' || env.COREHOST_TRACE != '') && always() }} with: - name: linux-logs + name: uno-linux-logs path: ./**/*.*log From e894064a5341305751347e3e17b89b73108d332f Mon Sep 17 00:00:00 2001 From: Martin Zikmund Date: Tue, 1 Sep 2026 16:23:59 +0200 Subject: [PATCH 3/4] Rename the linuxgtk MultiTarget to linux, add win32, drop unosdk from CI Picks up the MultiTarget split from the tooling submodule, where Arlo's review replaced the bulk 'desktop' target with the three platforms it stood for: macos, linux (renamed from linuxgtk) and a new win32. On WinUI 3 all three are served by Uno 6's single net{x}-desktop head; on WinUI 2 they keep the Uno.UI heads. Naming them after platforms rather than implementation details (GTK, WPF) keeps a component's declaration meaningful across both WinUI versions. Every component that declared linuxgtk now declares linux and win32. The CI matrix drops 'unosdk', which was never a MultiTarget - it existed only to flip -IncludeUnoSdkHead. It is now an include: flag on the existing wasm/winui3 job, so matrix.multitarget only ever holds values the MultiTarget system recognises, and the two generate steps collapse into one. Two exclusions the split implies are added: wpf is WinUI 2 only (Uno 6 dropped Uno.UI.Skia.Wpf) and win32 is WinUI 3 only - without them those jobs would generate a solution containing no components. Also fixes the uno-linux job, which generated with -MultiTargets wasm and then built -f net9.0-desktop. Since the head started honouring the requested MultiTargets it only declares that TFM when a desktop target is asked for, so the job now requests wasm,linux. Verified locally: solution generation with -MultiTargets wasm,win32 -IncludeUnoSdkHead resolves the head to net9.0-desktop;net9.0-browserwasm, and the desktop head builds Release clean (0 warnings, 0 errors) against all 19 desktop-capable components. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_0111vdg6YNSNuoVkGdHyr2eX --- .github/workflows/build.yml | 36 +++++++++---------- components/Animations/src/MultiTarget.props | 2 +- components/Behaviors/src/MultiTarget.props | 2 +- components/Collections/src/MultiTarget.props | 2 +- components/ColorPicker/src/MultiTarget.props | 2 +- components/Converters/src/MultiTarget.props | 2 +- .../DeveloperTools/src/MultiTarget.props | 2 +- components/Extensions/src/MultiTarget.props | 2 +- .../HeaderedControls/src/MultiTarget.props | 2 +- components/Helpers/src/MultiTarget.props | 2 +- .../src/MultiTarget.props | 2 +- .../MetadataControl/src/MultiTarget.props | 2 +- components/Primitives/src/MultiTarget.props | 2 +- .../RangeSelector/src/MultiTarget.props | 2 +- components/Segmented/src/MultiTarget.props | 2 +- .../SettingsControls/src/MultiTarget.props | 2 +- components/Sizers/src/MultiTarget.props | 2 +- .../TabbedCommandBar/src/MultiTarget.props | 2 +- .../TokenizingTextBox/src/MultiTarget.props | 2 +- components/Triggers/src/MultiTarget.props | 2 +- tooling | 2 +- 21 files changed, 38 insertions(+), 38 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2f277f7e5..4324f81e2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -67,7 +67,7 @@ jobs: fail-fast: false # prevent one matrix pipeline from being cancelled if one fails, we want them all to run to completion. matrix: winui: [2, 3] - multitarget: ['uwp', 'wasdk', 'wasm', 'unosdk', 'wpf', 'linuxgtk', 'macos', 'ios', 'android'] + multitarget: ['uwp', 'wasdk', 'wasm', 'wpf', 'win32', 'linux', 'macos', 'ios', 'android'] exclude: # WinUI 2 not supported on wasdk - winui: 2 @@ -75,12 +75,18 @@ jobs: # WinUI 3 not supported on uwp - winui: 3 multitarget: uwp - # WinUI 3 wasm is covered by the Uno.Sdk head (unosdk) + # wpf is the Uno 5 Skia WPF head, which Uno 6 replaced with win32 - winui: 3 - multitarget: wasm - # Uno.Sdk head is WinUI 3 only + multitarget: wpf + # win32 is the Uno 6 Skia desktop head, which has no Uno 5 equivalent - winui: 2 - multitarget: unosdk + multitarget: win32 + include: + # On WinUI 3 the Uno.Sdk head replaces the classic Wasm head, so it rides on the + # existing wasm job as a flag rather than a fake entry in the multitarget axis. + - winui: 3 + multitarget: wasm + unoSdkHead: true # Steps represent a sequence of tasks that will be executed as part of the job steps: @@ -118,7 +124,7 @@ jobs: run: dotnet tool restore - name: Run Uno Check to Install Dependencies - if: ${{ matrix.multitarget != 'wasdk' && matrix.multitarget != 'linuxgtk' && matrix.multitarget != 'wpf' && matrix.multitarget != 'unosdk' }} + if: ${{ matrix.multitarget != 'wasdk' && matrix.multitarget != 'linux' && matrix.multitarget != 'wpf' && matrix.multitarget != 'win32' && !matrix.unoSdkHead }} run: > dotnet tool run uno-check --ci @@ -134,7 +140,7 @@ jobs: # The Uno.Sdk head builds desktop/browserwasm/android (iOS is filtered on # Windows). Install the matching workloads directly instead of uno-check. - name: Install .NET workloads (Uno.Sdk head) - if: ${{ matrix.multitarget == 'unosdk' }} + if: ${{ matrix.unoSdkHead }} run: dotnet workload install wasm-tools android ios maui - name: Add msbuild to PATH @@ -143,20 +149,14 @@ jobs: vs-version: '[17.9,)' # Generate full solution with all projects (sample gallery heads, components, tests) + # The Uno.Sdk head also covers Windows desktop, so it asks for win32 alongside wasm. - name: Generate solution with ${{ matrix.multitarget }} gallery, components and tests - if: ${{ matrix.multitarget != 'unosdk' }} - working-directory: ./ - run: powershell -version 5.1 -command "./tooling/GenerateAllSolution.ps1 -MultiTargets ${{ matrix.multitarget }} ${{ env.ENABLE_DIAGNOSTICS == 'true' && ' -UseDiagnostics' || '' }} -WinUIMajorVersion ${{ matrix.winui }}" -ErrorAction Stop - - # The Uno.Sdk head covers wasm (browserwasm) for WinUI 3; generate with it included - - name: Generate solution with Uno.Sdk gallery, components and tests - if: ${{ matrix.multitarget == 'unosdk' }} working-directory: ./ - run: powershell -version 5.1 -command "./tooling/GenerateAllSolution.ps1 -MultiTargets wasm -IncludeUnoSdkHead -WinUIMajorVersion 3${{ env.ENABLE_DIAGNOSTICS == 'true' && ' -UseDiagnostics' || '' }}" -ErrorAction Stop + run: powershell -version 5.1 -command "./tooling/GenerateAllSolution.ps1 -MultiTargets ${{ matrix.multitarget }}${{ matrix.unoSdkHead && ',win32 -IncludeUnoSdkHead' || '' }} ${{ env.ENABLE_DIAGNOSTICS == 'true' && ' -UseDiagnostics' || '' }} -WinUIMajorVersion ${{ matrix.winui }}" -ErrorAction Stop # Build solution - name: MSBuild - if: ${{ matrix.multitarget != 'unosdk' }} + if: ${{ !matrix.unoSdkHead }} run: > msbuild.exe /restore /nowarn:MSB4011 /p:Configuration=Release @@ -168,7 +168,7 @@ jobs: # The Uno.Sdk head is a single project covering desktop/browserwasm/android # (iOS is filtered on Windows); build it directly with dotnet. - name: Build Uno.Sdk head - if: ${{ matrix.multitarget == 'unosdk' }} + if: ${{ matrix.unoSdkHead }} run: dotnet build tooling/ProjectHeads/AllComponents/Uno/CommunityToolkit.App.Uno.csproj -p:Configuration=Release ${{ env.ENABLE_DIAGNOSTICS == 'true' && '/bl' || '' }} # Run tests @@ -483,7 +483,7 @@ jobs: - name: Generate solution shell: pwsh working-directory: ./ - run: ./tooling/GenerateAllSolution.ps1 -MultiTargets wasm -IncludeUnoSdkHead -WinUIMajorVersion 3${{ env.ENABLE_DIAGNOSTICS == 'true' && ' -UseDiagnostics' || '' }} + run: ./tooling/GenerateAllSolution.ps1 -MultiTargets wasm,linux -IncludeUnoSdkHead -WinUIMajorVersion 3${{ env.ENABLE_DIAGNOSTICS == 'true' && ' -UseDiagnostics' || '' }} - name: Build Uno head (browserwasm) shell: pwsh diff --git a/components/Animations/src/MultiTarget.props b/components/Animations/src/MultiTarget.props index c780abffe..aa297d836 100644 --- a/components/Animations/src/MultiTarget.props +++ b/components/Animations/src/MultiTarget.props @@ -4,6 +4,6 @@ MultiTarget is a custom property that indicates which target a project is designed to be built for / run on. Used to create project references, generate solution files, enable/disable TargetFrameworks, and build nuget packages. --> - uwp;wasdk;wpf;wasm;linuxgtk;macos;ios;android; + uwp;wasdk;wpf;win32;wasm;linux;macos;ios;android; diff --git a/components/Behaviors/src/MultiTarget.props b/components/Behaviors/src/MultiTarget.props index b11c19426..7d1e11c3c 100644 --- a/components/Behaviors/src/MultiTarget.props +++ b/components/Behaviors/src/MultiTarget.props @@ -4,6 +4,6 @@ MultiTarget is a custom property that indicates which target a project is designed to be built for / run on. Used to create project references, generate solution files, enable/disable TargetFrameworks, and build nuget packages. --> - uwp;wasdk;wpf;wasm;linuxgtk;macos;ios;android; + uwp;wasdk;wpf;win32;wasm;linux;macos;ios;android; \ No newline at end of file diff --git a/components/Collections/src/MultiTarget.props b/components/Collections/src/MultiTarget.props index b11c19426..7d1e11c3c 100644 --- a/components/Collections/src/MultiTarget.props +++ b/components/Collections/src/MultiTarget.props @@ -4,6 +4,6 @@ MultiTarget is a custom property that indicates which target a project is designed to be built for / run on. Used to create project references, generate solution files, enable/disable TargetFrameworks, and build nuget packages. --> - uwp;wasdk;wpf;wasm;linuxgtk;macos;ios;android; + uwp;wasdk;wpf;win32;wasm;linux;macos;ios;android; \ No newline at end of file diff --git a/components/ColorPicker/src/MultiTarget.props b/components/ColorPicker/src/MultiTarget.props index b11c19426..7d1e11c3c 100644 --- a/components/ColorPicker/src/MultiTarget.props +++ b/components/ColorPicker/src/MultiTarget.props @@ -4,6 +4,6 @@ MultiTarget is a custom property that indicates which target a project is designed to be built for / run on. Used to create project references, generate solution files, enable/disable TargetFrameworks, and build nuget packages. --> - uwp;wasdk;wpf;wasm;linuxgtk;macos;ios;android; + uwp;wasdk;wpf;win32;wasm;linux;macos;ios;android; \ No newline at end of file diff --git a/components/Converters/src/MultiTarget.props b/components/Converters/src/MultiTarget.props index b11c19426..7d1e11c3c 100644 --- a/components/Converters/src/MultiTarget.props +++ b/components/Converters/src/MultiTarget.props @@ -4,6 +4,6 @@ MultiTarget is a custom property that indicates which target a project is designed to be built for / run on. Used to create project references, generate solution files, enable/disable TargetFrameworks, and build nuget packages. --> - uwp;wasdk;wpf;wasm;linuxgtk;macos;ios;android; + uwp;wasdk;wpf;win32;wasm;linux;macos;ios;android; \ No newline at end of file diff --git a/components/DeveloperTools/src/MultiTarget.props b/components/DeveloperTools/src/MultiTarget.props index b11c19426..7d1e11c3c 100644 --- a/components/DeveloperTools/src/MultiTarget.props +++ b/components/DeveloperTools/src/MultiTarget.props @@ -4,6 +4,6 @@ MultiTarget is a custom property that indicates which target a project is designed to be built for / run on. Used to create project references, generate solution files, enable/disable TargetFrameworks, and build nuget packages. --> - uwp;wasdk;wpf;wasm;linuxgtk;macos;ios;android; + uwp;wasdk;wpf;win32;wasm;linux;macos;ios;android; \ No newline at end of file diff --git a/components/Extensions/src/MultiTarget.props b/components/Extensions/src/MultiTarget.props index b11c19426..7d1e11c3c 100644 --- a/components/Extensions/src/MultiTarget.props +++ b/components/Extensions/src/MultiTarget.props @@ -4,6 +4,6 @@ MultiTarget is a custom property that indicates which target a project is designed to be built for / run on. Used to create project references, generate solution files, enable/disable TargetFrameworks, and build nuget packages. --> - uwp;wasdk;wpf;wasm;linuxgtk;macos;ios;android; + uwp;wasdk;wpf;win32;wasm;linux;macos;ios;android; \ No newline at end of file diff --git a/components/HeaderedControls/src/MultiTarget.props b/components/HeaderedControls/src/MultiTarget.props index b11c19426..7d1e11c3c 100644 --- a/components/HeaderedControls/src/MultiTarget.props +++ b/components/HeaderedControls/src/MultiTarget.props @@ -4,6 +4,6 @@ MultiTarget is a custom property that indicates which target a project is designed to be built for / run on. Used to create project references, generate solution files, enable/disable TargetFrameworks, and build nuget packages. --> - uwp;wasdk;wpf;wasm;linuxgtk;macos;ios;android; + uwp;wasdk;wpf;win32;wasm;linux;macos;ios;android; \ No newline at end of file diff --git a/components/Helpers/src/MultiTarget.props b/components/Helpers/src/MultiTarget.props index b11c19426..7d1e11c3c 100644 --- a/components/Helpers/src/MultiTarget.props +++ b/components/Helpers/src/MultiTarget.props @@ -4,6 +4,6 @@ MultiTarget is a custom property that indicates which target a project is designed to be built for / run on. Used to create project references, generate solution files, enable/disable TargetFrameworks, and build nuget packages. --> - uwp;wasdk;wpf;wasm;linuxgtk;macos;ios;android; + uwp;wasdk;wpf;win32;wasm;linux;macos;ios;android; \ No newline at end of file diff --git a/components/LayoutTransformControl/src/MultiTarget.props b/components/LayoutTransformControl/src/MultiTarget.props index b11c19426..7d1e11c3c 100644 --- a/components/LayoutTransformControl/src/MultiTarget.props +++ b/components/LayoutTransformControl/src/MultiTarget.props @@ -4,6 +4,6 @@ MultiTarget is a custom property that indicates which target a project is designed to be built for / run on. Used to create project references, generate solution files, enable/disable TargetFrameworks, and build nuget packages. --> - uwp;wasdk;wpf;wasm;linuxgtk;macos;ios;android; + uwp;wasdk;wpf;win32;wasm;linux;macos;ios;android; \ No newline at end of file diff --git a/components/MetadataControl/src/MultiTarget.props b/components/MetadataControl/src/MultiTarget.props index b11c19426..7d1e11c3c 100644 --- a/components/MetadataControl/src/MultiTarget.props +++ b/components/MetadataControl/src/MultiTarget.props @@ -4,6 +4,6 @@ MultiTarget is a custom property that indicates which target a project is designed to be built for / run on. Used to create project references, generate solution files, enable/disable TargetFrameworks, and build nuget packages. --> - uwp;wasdk;wpf;wasm;linuxgtk;macos;ios;android; + uwp;wasdk;wpf;win32;wasm;linux;macos;ios;android; \ No newline at end of file diff --git a/components/Primitives/src/MultiTarget.props b/components/Primitives/src/MultiTarget.props index b11c19426..7d1e11c3c 100644 --- a/components/Primitives/src/MultiTarget.props +++ b/components/Primitives/src/MultiTarget.props @@ -4,6 +4,6 @@ MultiTarget is a custom property that indicates which target a project is designed to be built for / run on. Used to create project references, generate solution files, enable/disable TargetFrameworks, and build nuget packages. --> - uwp;wasdk;wpf;wasm;linuxgtk;macos;ios;android; + uwp;wasdk;wpf;win32;wasm;linux;macos;ios;android; \ No newline at end of file diff --git a/components/RangeSelector/src/MultiTarget.props b/components/RangeSelector/src/MultiTarget.props index b11c19426..7d1e11c3c 100644 --- a/components/RangeSelector/src/MultiTarget.props +++ b/components/RangeSelector/src/MultiTarget.props @@ -4,6 +4,6 @@ MultiTarget is a custom property that indicates which target a project is designed to be built for / run on. Used to create project references, generate solution files, enable/disable TargetFrameworks, and build nuget packages. --> - uwp;wasdk;wpf;wasm;linuxgtk;macos;ios;android; + uwp;wasdk;wpf;win32;wasm;linux;macos;ios;android; \ No newline at end of file diff --git a/components/Segmented/src/MultiTarget.props b/components/Segmented/src/MultiTarget.props index b11c19426..7d1e11c3c 100644 --- a/components/Segmented/src/MultiTarget.props +++ b/components/Segmented/src/MultiTarget.props @@ -4,6 +4,6 @@ MultiTarget is a custom property that indicates which target a project is designed to be built for / run on. Used to create project references, generate solution files, enable/disable TargetFrameworks, and build nuget packages. --> - uwp;wasdk;wpf;wasm;linuxgtk;macos;ios;android; + uwp;wasdk;wpf;win32;wasm;linux;macos;ios;android; \ No newline at end of file diff --git a/components/SettingsControls/src/MultiTarget.props b/components/SettingsControls/src/MultiTarget.props index b11c19426..7d1e11c3c 100644 --- a/components/SettingsControls/src/MultiTarget.props +++ b/components/SettingsControls/src/MultiTarget.props @@ -4,6 +4,6 @@ MultiTarget is a custom property that indicates which target a project is designed to be built for / run on. Used to create project references, generate solution files, enable/disable TargetFrameworks, and build nuget packages. --> - uwp;wasdk;wpf;wasm;linuxgtk;macos;ios;android; + uwp;wasdk;wpf;win32;wasm;linux;macos;ios;android; \ No newline at end of file diff --git a/components/Sizers/src/MultiTarget.props b/components/Sizers/src/MultiTarget.props index b11c19426..7d1e11c3c 100644 --- a/components/Sizers/src/MultiTarget.props +++ b/components/Sizers/src/MultiTarget.props @@ -4,6 +4,6 @@ MultiTarget is a custom property that indicates which target a project is designed to be built for / run on. Used to create project references, generate solution files, enable/disable TargetFrameworks, and build nuget packages. --> - uwp;wasdk;wpf;wasm;linuxgtk;macos;ios;android; + uwp;wasdk;wpf;win32;wasm;linux;macos;ios;android; \ No newline at end of file diff --git a/components/TabbedCommandBar/src/MultiTarget.props b/components/TabbedCommandBar/src/MultiTarget.props index b11c19426..7d1e11c3c 100644 --- a/components/TabbedCommandBar/src/MultiTarget.props +++ b/components/TabbedCommandBar/src/MultiTarget.props @@ -4,6 +4,6 @@ MultiTarget is a custom property that indicates which target a project is designed to be built for / run on. Used to create project references, generate solution files, enable/disable TargetFrameworks, and build nuget packages. --> - uwp;wasdk;wpf;wasm;linuxgtk;macos;ios;android; + uwp;wasdk;wpf;win32;wasm;linux;macos;ios;android; \ No newline at end of file diff --git a/components/TokenizingTextBox/src/MultiTarget.props b/components/TokenizingTextBox/src/MultiTarget.props index b11c19426..7d1e11c3c 100644 --- a/components/TokenizingTextBox/src/MultiTarget.props +++ b/components/TokenizingTextBox/src/MultiTarget.props @@ -4,6 +4,6 @@ MultiTarget is a custom property that indicates which target a project is designed to be built for / run on. Used to create project references, generate solution files, enable/disable TargetFrameworks, and build nuget packages. --> - uwp;wasdk;wpf;wasm;linuxgtk;macos;ios;android; + uwp;wasdk;wpf;win32;wasm;linux;macos;ios;android; \ No newline at end of file diff --git a/components/Triggers/src/MultiTarget.props b/components/Triggers/src/MultiTarget.props index b11c19426..7d1e11c3c 100644 --- a/components/Triggers/src/MultiTarget.props +++ b/components/Triggers/src/MultiTarget.props @@ -4,6 +4,6 @@ MultiTarget is a custom property that indicates which target a project is designed to be built for / run on. Used to create project references, generate solution files, enable/disable TargetFrameworks, and build nuget packages. --> - uwp;wasdk;wpf;wasm;linuxgtk;macos;ios;android; + uwp;wasdk;wpf;win32;wasm;linux;macos;ios;android; \ No newline at end of file diff --git a/tooling b/tooling index ded6698f1..2a3150587 160000 --- a/tooling +++ b/tooling @@ -1 +1 @@ -Subproject commit ded6698f1c9aedc8d0228c52c3ed520b4b3b4134 +Subproject commit 2a3150587e419f508033fc0846d5bc91722a0b5f From 3bef2367c0dbc4a4ff11af04b9ad06265cea645f Mon Sep 17 00:00:00 2001 From: Martin Zikmund Date: Tue, 1 Sep 2026 16:47:28 +0200 Subject: [PATCH 4/4] Bump tooling: keep Mac Catalyst out of the WinUI 3 package surface Uno 7.0 drops Mac Catalyst, so the macos MultiTarget now maps to the Skia desktop head on WinUI 3 and to Catalyst only on WinUI 2. Effect on this repo's packages: the .WinUI variants lose net9.0-maccatalyst and keep everything else. Consumers building Mac Catalyst apps resolve the net9.0 asset instead, which is behaviourally identical - no component here references __MACOS__ or MACCATALYST. Verified: CommunityToolkit.WinUI.Controls.Segmented with -MultiTargets all resolves to net9.0-windows10.0.19041, net8.0-windows10.0.19041, net9.0, net9.0-ios and net9.0-android on WinUI 3 (the published set minus maccatalyst) and keeps net9.0-maccatalyst on WinUI 2. The Uno.Sdk desktop head still builds Release clean. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_0111vdg6YNSNuoVkGdHyr2eX --- tooling | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tooling b/tooling index 2a3150587..3433dc511 160000 --- a/tooling +++ b/tooling @@ -1 +1 @@ -Subproject commit 2a3150587e419f508033fc0846d5bc91722a0b5f +Subproject commit 3433dc511a74e20f0ae27cd744bfa8a8dc96636a