diff --git a/msbuild/Xamarin.MacDev.Tasks.Core/Tasks/PrepareNativeReferencesTaskBase.cs b/msbuild/Xamarin.MacDev.Tasks.Core/Tasks/PrepareNativeReferencesTaskBase.cs index 54ab89ad4822..00b0a24ea245 100644 --- a/msbuild/Xamarin.MacDev.Tasks.Core/Tasks/PrepareNativeReferencesTaskBase.cs +++ b/msbuild/Xamarin.MacDev.Tasks.Core/Tasks/PrepareNativeReferencesTaskBase.cs @@ -137,9 +137,16 @@ public override bool Execute () text.AppendLine (); } + bool skipLinkWithGeneration = false; var linkWith = Path.Combine (IntermediateOutputPath, "LinkWithAttributes.cs"); - Directory.CreateDirectory (Path.GetDirectoryName (linkWith)); - File.WriteAllText (linkWith, text.ToString ()); + if (File.Exists (linkWith)) { + string existingLinkWithText = File.ReadAllText (linkWith); + skipLinkWithGeneration = String.Equals (existingLinkWithText, text.ToString (), StringComparison.Ordinal); + } + if (!skipLinkWithGeneration) { + Directory.CreateDirectory (Path.GetDirectoryName (linkWith)); + File.WriteAllText (linkWith, text.ToString ()); + } EmbeddedResources = embeddedResources.ToArray (); NativeFrameworks = nativeFrameworks.ToArray (); diff --git a/tests/msbuild-mac/src/MSBuild-Smoke.cs b/tests/msbuild-mac/src/MSBuild-Smoke.cs index ca3d38686a48..6f23fff94da9 100644 --- a/tests/msbuild-mac/src/MSBuild-Smoke.cs +++ b/tests/msbuild-mac/src/MSBuild-Smoke.cs @@ -151,5 +151,25 @@ public void Build_BindingLibrary_SmokeTest () } }); } + + [Test] + public void BuildingSameBindingProject_TwoTimes_ShallNotInvokeMMPTwoTimes () + { + const string nativeRefItemGroup = "DynamicFalse"; + + RunMSBuildTest (tmpDir => + { + foreach (string project in new[] { "XM45Binding.csproj", "MobileBinding.csproj", "BindingProjectWithNoTag.csproj" }) + { + var config = new TI.UnifiedTestConfig (tmpDir) { ProjectName = project, ItemGroup = nativeRefItemGroup }; + string projectPath = TI.GenerateBindingLibraryProject (config); + string buildOutput = TI.BuildProject (projectPath, isUnified: true, diagnosticMSBuild: true); + Assert.IsTrue (buildOutput.Contains ("Target CoreCompile needs to be built")); + + string secondBuildOutput = TI.BuildProject (projectPath, isUnified: true, diagnosticMSBuild: true); + Assert.IsFalse (secondBuildOutput.Contains ("Target CoreCompile needs to be built")); + } + }); + } } }