[One .NET] fix for incremental CoreCompile #5661
Merged
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.
Context: https://github.com/xamarin/Xamarin.Forms/tree/main-handler
I noticed that when building Maui,
CoreCompileseems to be runningon every build no matter what:
I could reproduce this in a test:
AppA&LibraryBAppA&LibraryBagain,LibraryBwill runCoreCompileevery time.
There is a
_GenerateCompileDependencyCachetarget that basically does:https://github.com/dotnet/msbuild/blob/83cd7d4e36b71d5b2cefd02cb9a5a58d27dd6a75/src/Tasks/Microsoft.Common.CurrentVersion.targets#L3529
This
*.CoreCompileInputs.cachefile triggersCoreCompileto runagain when it needs to.
However, this file is actually updating on every build, because:
@(CoreCompileCache)like__MOBILE__,__ANDROID__, etc.$(RuntimeIdentifier)does not havethese symbols!
And so we get into a situation where
CoreCompilewill always run.The inner & outer builds write different values in this file.
To solve this problem, I added our
_AddAndroidDefinesto run beforeCoreCompilein inner builds.I also needed some changes to our MSBuild test framework:
IsTargetSkipped()andAssertTargetIsSkipped()supported fornew project types.
IsTargetSkipped()returnfalseif aBuilding target "{target}" completely.message is found.