Bug: Incremental build with C++/WinRT 3.0 modules loses CppWinRTPlatformWinMDReferences, causing Windows.Foundation.Point could not be found
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 48/100
- Tipo di issue
- Bug
- Chiarezza
- Abbastanza chiara
- Stato di attività
- Tranquilla
- Stack tecnologico
- cpp
- Ambito
- build-system, devtools
Direzione di ricerca
Ispeziona Microsoft.Windows.CppWinRT.targets intorno a CppWinRTMakeReferenceProjection e agli input CppWinRTPlatformWinMDReferences. Riproduci sia build pulite sia incrementali per un provider di moduli che usa CppWinRTConsumeModule, quindi confronta il contenuto generato di cppwinrt_ref.rsp. Il lavoro è completato quando le build incrementali includono i riferimenti WinMD del contratto di Windows SDK e non falliscono più nella risoluzione di Windows.Foundation.Point.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Version
3.0.260520.1
Summary
I am migrating a WinAppSDK C++/WinRT project to the new C++/WinRT 3.0 module build.
The solution uses a dedicated module provider project:
<ProjectReference Include="..\..\CppWinRTModules\CppWinRTModules.vcxproj">
<Project>{...}</Project>
<CppWinRTConsumeModule>true</CppWinRTConsumeModule>
</ProjectReference>
A clean/rebuild works, but an incremental build fails during the C++/WinRT reference projection step.
The failure occurs when cppwinrt processes Microsoft.Graphics.winmd from the WinAppSDK experimental packages:
cppwinrt : error Type 'Windows.Foundation.Point' could not be found
method: RedPrimary
type: Microsoft.Graphics.Display.IDisplayAdvancedColorInfo
database: ...\packages\Microsoft.WindowsAppSDK.InteractiveExperiences.2.0.14-experimental\metadata\10.0.18362.0\Microsoft.Graphics.winmd
The project does not use RedPrimary directly. This appears to happen while processing the metadata database.
Environment
Visual Studio: 18 Professional
MSVC: 14.51.36231
C++/WinRT NuGet: Microsoft.Windows.CppWinRT 3.0.260520.1
Windows SDK: 10.0.26100.0
Configuration: x64 Release / x64 Debug
WindowsAppSDK packages include:
Microsoft.WindowsAppSDK.2.1.4-experimental8
Microsoft.WindowsAppSDK.Foundation.2.0.22-experimental
Microsoft.WindowsAppSDK.WinUI.2.1.1-experimental
Microsoft.WindowsAppSDK.InteractiveExperiences.2.0.14-experimental
Microsoft.WindowsAppSDK.AI.2.1.13-experimental
Microsoft.WindowsAppSDK.Search.2.1.13-experimental
Microsoft.WindowsAppSDK.Widgets.2.0.6-experimental
Reproducible example
Expected behavior
During the failing incremental build, the C++/WinRT diagnostic output shows that the direct WinMD references are present, but the platform WinMD references are empty:
CppWinRTPlatformWinMDReferences:
CppWinRTDirectWinMDReferences:
...\Microsoft.Graphics.winmd
...\Microsoft.UI.winmd
...\Microsoft.UI.Xaml.winmd
...
Then the generated command runs:
cppwinrt @"x64\Release\CppWinRTModules.vcxproj.cppwinrt_ref.rsp"
The tool output shows many in: entries for WinAppSDK package WinMDs, but no corresponding Windows SDK ref: entries. Therefore Microsoft.Graphics.winmd cannot resolve Windows.Foundation.Point.
After adding a workaround target, the same build succeeds. The log then shows CppWinRTPlatformWinMDReferences and CppWinRTPlatformWinMDInputs populated with the Windows SDK contract WinMDs such as Windows.Foundation.FoundationContract.winmd, Windows.Foundation.UniversalApiContract.winmd, Windows.Networking.Connectivity.WwanContract.winmd, etc.
Actual behavior
Clean/rebuild succeeds.
Incremental build fails because CppWinRTPlatformWinMDReferences is empty when CppWinRTMakeReferenceProjection runs, causing cppwinrt_ref.rsp to omit Windows SDK references.
Additional comments
Workaround
Adding this target to the project repairs the incremental build:
<Target Name="ForceCppWinRTPlatformWinMDReferences"
BeforeTargets="CppWinRTMakeReferenceProjection">
<ItemGroup Condition="'@(CppWinRTPlatformWinMDReferences)' == ''">
<CppWinRTPlatformWinMDReferences Include="$(WindowsSDK_MetadataPathVersioned)\**\*.winmd" />
</ItemGroup>
<Message Text="Forced CppWinRTPlatformWinMDReferences from $(WindowsSDK_MetadataPathVersioned)"
Importance="High"
Condition="'@(CppWinRTPlatformWinMDReferences)' != ''" />
</Target>
After this, the build succeeds because the Windows SDK WinMDs are passed into the C++/WinRT projection step.
Notes
I also tried:
<CppWinRTEnableReferenceProjection>false</CppWinRTEnableReferenceProjection>
but that is not viable because the module provider then no longer generates required modules such as:
import winrt.Microsoft.UI;
import winrt.Microsoft.UI.Dispatching;
import winrt.Microsoft.UI.Xaml;
import winrt.Microsoft.UI.Xaml.Controls;
import winrt.Microsoft.UI.Xaml.Media;
I also tried excluding Microsoft.Graphics.Display, but that caused the module provider to generate almost no WinRT namespace modules, so that is not a usable workaround either.
The issue seems to be specifically that the incremental CppWinRTMakeReferenceProjection path does not populate CppWinRTPlatformWinMDReferences, while clean/rebuild does.
Minimal question
Is this expected behavior for C++/WinRT 3.0 module provider projects using true?
If not, should Microsoft.Windows.CppWinRT.targets ensure that CppWinRTPlatformWinMDReferences is populated before CppWinRTMakeReferenceProjection during incremental builds?
- Lingua principale
- C++
- Stelle
- 1.9k
- Fork
- 281
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di microsoft/cppwinrt
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
-
base_macros.h disables warnings without push/pop, leaking them into consumer translation units Aperta
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 20/100
-
Difficoltà 5/5 Più di una settimana Idoneità per principianti 25/100
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 48/100
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 30/100
Tutte le issue di microsoft/cppwinrt
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
google/libultrahdr#485 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
godotengine/godot#123776 ·
-
bug
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 60/100
-
good first issue
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 90/100
-
good first issue
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
ros2/common_interfaces#344 ·