Merge pull request #1404 from woodsb02/mono-route
[mono.git] / mcs / class / Microsoft.Build / Microsoft.Build.Internal / BuildEngine4.cs
index 1f501683ce278997eb2970500eeaa2440c7a56ac..93244292518240bf21ad073e30bca39812003d0f 100644 (file)
@@ -42,11 +42,7 @@ using System.Xml;
 namespace Microsoft.Build.Internal
 {
        class BuildEngine4
-#if NET_4_5
                : IBuildEngine4
-#else
-               : IBuildEngine3
-#endif
        {
                public BuildEngine4 (BuildSubmission submission)
                {
@@ -135,8 +131,10 @@ namespace Microsoft.Build.Internal
                                if (request.TargetNames == null)
                                        args.Result.OverallResult = args.CheckCancel () ? BuildResultCode.Failure : args.Result.ResultsByTarget.Any (p => p.Value.ResultCode == TargetResultCode.Failure) ? BuildResultCode.Failure : BuildResultCode.Success;
                                else {
-                                       foreach (var targetName in (args.TargetNames ?? request.TargetNames).Where (t => t != null))
-                                               BuildTargetByName (targetName, args);
+                                       foreach (var targetName in (args.TargetNames ?? request.TargetNames).Where (t => t != null)) {
+                                               if (!BuildTargetByName (targetName, args))
+                                                       break;
+                                       }
                        
                                        // FIXME: check .NET behavior, whether cancellation always results in failure.
                                        args.Result.OverallResult = args.CheckCancel () ? BuildResultCode.Failure : args.Result.ResultsByTarget.Any (p => p.Value.ResultCode == TargetResultCode.Failure) ? BuildResultCode.Failure : BuildResultCode.Success;
@@ -316,10 +314,8 @@ namespace Microsoft.Build.Internal
                        
                        // Create Task instance.
                        var factoryIdentityParameters = new Dictionary<string,string> ();
-                       #if NET_4_5
                        factoryIdentityParameters ["MSBuildRuntime"] = taskInstance.MSBuildRuntime;
                        factoryIdentityParameters ["MSBuildArchitecture"] = taskInstance.MSBuildArchitecture;
-                       #endif
                        var task = args.BuildTaskFactory.CreateTask (taskInstance.Name, factoryIdentityParameters, this);
                        if (task == null)
                                throw new InvalidOperationException (string.Format ("TaskFactory {0} returned null Task", args.BuildTaskFactory));
@@ -466,7 +462,7 @@ namespace Microsoft.Build.Internal
                        }
                        public void SetMetadataValueLiteral (string metadataName, string metadataValue)
                        {
-                               metadata [metadataName] = ProjectCollection.Unescape (metadataValue);
+                               metadata [metadataName] = WindowsCompatibilityExtensions.NormalizeFilePath (ProjectCollection.Unescape (metadataValue));
                        }
                        public IDictionary CloneCustomMetadataEscaped ()
                        {
@@ -504,7 +500,7 @@ namespace Microsoft.Build.Internal
                        }
                        public void SetMetadata (string metadataName, string metadataValue)
                        {
-                               metadata [metadataName] = metadataValue;
+                               metadata [metadataName] = WindowsCompatibilityExtensions.NormalizeFilePath (metadataValue);
                        }
                        public string ItemSpec { get; set; }
                        public int MetadataCount {
@@ -521,7 +517,6 @@ namespace Microsoft.Build.Internal
                        }
                }
                
-#if NET_4_5
                #region IBuildEngine4 implementation
                
                // task objects are not in use anyways though...
@@ -562,7 +557,6 @@ namespace Microsoft.Build.Internal
                        return reg.Object;
                }
                #endregion
-#endif
 
                #region IBuildEngine3 implementation
 
@@ -593,6 +587,10 @@ namespace Microsoft.Build.Internal
                        foreach (DictionaryEntry p in globalProperties)
                                globalPropertiesThatMakeSense [(string) p.Key] = (string) p.Value;
                        var projectToBuild = new ProjectInstance (ProjectRootElement.Create (XmlReader.Create (projectFileName)), globalPropertiesThatMakeSense, toolsVersion, Projects);
+                       // Not very sure if ALL of these properties should be added, but some are certainly needed. 
+                       foreach (var p in this.project.Properties.Where (p => !globalProperties.Contains (p.Name)))
+                               projectToBuild.SetProperty (p.Name, p.EvaluatedValue);
+                       
                        IDictionary<string,TargetResult> outs;
                        var ret = projectToBuild.Build (targetNames ?? new string [] {"Build"}, Projects.Loggers, out outs);
                        foreach (var p in outs)