diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/SetMSBuildExtensionsPath.cs b/src/Xamarin.Android.Build.Tasks/Tasks/SetMSBuildExtensionsPath.cs new file mode 100644 index 00000000000..1ceaceb5b17 --- /dev/null +++ b/src/Xamarin.Android.Build.Tasks/Tasks/SetMSBuildExtensionsPath.cs @@ -0,0 +1,49 @@ +using System; +using System.IO; +using System.Linq; + +using Microsoft.Build.Utilities; +using Microsoft.Build.Framework; + +namespace Xamarin.Android.Tasks +{ + public sealed class SetMSBuildExtensionsPath : Task + { + const string MSBuildExtensionsPath = "MSBuildExtensionsPath"; + const string XBUILD_FRAMEWORK_FOLDERS_PATH = "XBUILD_FRAMEWORK_FOLDERS_PATH"; + public override bool Execute () + { + var frameworksPath = Path.GetDirectoryName (typeof (SetMSBuildExtensionsPath).Assembly.Location); + if (Path.DirectorySeparatorChar == '\\') { + // TODO: Default Windows search location + } else { + // e == $prefix/lib/xbuild/Xamarin/Android + // Want: $prefix/lib/xbuild-frameworks + if (!frameworksPath.EndsWith ("xbuild/Xamarin/Android", StringComparison.OrdinalIgnoreCase)) { + throw new NotSupportedException ("Cannot determine path to xbuild-frameworks!"); + } + frameworksPath = Path.GetDirectoryName (Path.GetDirectoryName (Path.GetDirectoryName (frameworksPath))); + frameworksPath = Path.Combine (frameworksPath, "xbuild-frameworks"); + } + + UpdateEnvironmentVariable (MSBuildExtensionsPath, frameworksPath); + UpdateEnvironmentVariable (XBUILD_FRAMEWORK_FOLDERS_PATH, frameworksPath); + + return !Log.HasLoggedErrors; + } + + void UpdateEnvironmentVariable (string environmentVariable, string newPath) + { + var p = (Environment.GetEnvironmentVariable (environmentVariable) ?? "") + .Split (new [] { Path.PathSeparator }, StringSplitOptions.RemoveEmptyEntries); + if (p.Any (x => string.Equals (x, newPath, StringComparison.OrdinalIgnoreCase))) { + return; + } + + var newValue = string.Join (Path.PathSeparator.ToString (), new [] { newPath }.Concat (p)); + Log.LogMessage (MessageImportance.Low, $" Setting environment variable `{environmentVariable}`='{newValue}'."); + Environment.SetEnvironmentVariable (environmentVariable, newValue); + } + } +} + diff --git a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Bindings.targets b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Bindings.targets index 5ca744343e7..88ee69b1611 100644 --- a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Bindings.targets +++ b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Bindings.targets @@ -35,6 +35,7 @@ Copyright (C) 2012 Xamarin Inc. All rights reserved. +