[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,
CoreCompile
seems to be runningon every build no matter what:
I could reproduce this in a test:
AppA
&LibraryB
AppA
&LibraryB
again,LibraryB
will runCoreCompile
every time.
There is a
_GenerateCompileDependencyCache
target that basically does:https://github.com/dotnet/msbuild/blob/83cd7d4e36b71d5b2cefd02cb9a5a58d27dd6a75/src/Tasks/Microsoft.Common.CurrentVersion.targets#L3529
This
*.CoreCompileInputs.cache
file triggersCoreCompile
to 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
CoreCompile
will always run.The inner & outer builds write different values in this file.
To solve this problem, I added our
_AddAndroidDefines
to run beforeCoreCompile
in inner builds.I also needed some changes to our MSBuild test framework:
IsTargetSkipped()
andAssertTargetIsSkipped()
supported fornew project types.
IsTargetSkipped()
returnfalse
if aBuilding target "{target}" completely.
message is found.