[xbuild] Add support for multi-targeting arbitrary frameworks.
authorAnkit Jain <radical@corewars.org>
Sun, 27 Feb 2011 21:27:17 +0000 (02:57 +0530)
committerAnkit Jain <radical@corewars.org>
Sun, 27 Feb 2011 21:40:15 +0000 (03:10 +0530)
ToolsVersion 4.0 supports targeting arbitrary frameworks defined
by FrameworkList.xml files and referenced by $(TargetFrameworkMoniker),
which is of the format:
 Identifier,Version=<version>[,Profile=<profile>]

built as:
 $(TargetFrameworkIdentifier),Version=$(TargetFrameworkVersion)[,Profile=$(TargetFrameworkProfile)]

eg. '.NETFramework,Version=v4.0' .

Frameworks are searched for in (order):

  1. Paths specified in the environment variable $XBUILD_FRAMEWORK_FOLDERS_PATH
  2. /Library/Frameworks/Mono.framework/External/xbuild-frameworks on Mac OSX.
  3. MSBuild property $(TargetFrameworkRoot)
  4. $prefix/lib/mono/xbuild-frameworks (default location)

.NET frameworks 2.0/3.0/3.5/4.0 have corresponding FrameworkList.xml
files now, which allows projects to target them. Custom frameworks like
MonoDroid can install suitable FrameworkList.xml files, and projects
can target them using the correct $(TargetFrameworkIdentifier) and
$(TargetFrameworkVersion).

Update man page.

12 files changed:
man/xbuild.1
mcs/class/Microsoft.Build.Tasks/Microsoft.Build.Tasks.dll.sources
mcs/class/Microsoft.Build.Tasks/Microsoft.Build.Tasks/GetReferenceAssemblyPaths.cs [new file with mode: 0644]
mcs/tools/xbuild/Makefile
mcs/tools/xbuild/xbuild/2.0/FrameworkList.xml [new file with mode: 0644]
mcs/tools/xbuild/xbuild/2.0/Microsoft.Common.targets
mcs/tools/xbuild/xbuild/3.5/FrameworkList.xml [new file with mode: 0644]
mcs/tools/xbuild/xbuild/3.5/Microsoft.Common.targets
mcs/tools/xbuild/xbuild/4.0/FrameworkList.xml [new file with mode: 0644]
mcs/tools/xbuild/xbuild/4.0/Microsoft.Common.targets
mcs/tools/xbuild/xbuild/4.0/Microsoft.Common.tasks
mcs/tools/xbuild/xbuild/FrameworkList-3.0.xml [new file with mode: 0644]

index 2320a37fa72ccb9def530b5a5fd1341a2f180e91..7e69a2d0484423ab0fc1950b9d23474dea5690b9 100644 (file)
@@ -83,6 +83,34 @@ location. This is a xbuild-only feature.
 This is also applicable for the properties $(MSBuildExtensionsPath32) and $(MSBuildExtensionsPath64),
 and the environment variables have the corresponding names - MSBuildExtensionsPath32/64 .
 .TP
+.I "XBUILD_FRAMEWORK_FOLDERS_PATH"
+With ToolsVersion 4.0, projects can target arbitrary frameworks referenced by TargetFrameworkMoniker,
+which is of the format:
+
+  Identifier,Version=<version>[,Profile=<profile>]
+
+Eg. ".NETFramework,Version=v4.0"
+
+The 3 parts of the moniker are given by the msbuild properties:
+
+  $(TargetFrameworkIdentifier), $(TargetFrameworkVersion) and $(TargetFrameworkProfile)
+
+This moniker maps to a framework description file on disk:
+
+  <framework_root>/Identifier/Version/[Profile]/RedistList/FrameworkList.xml
+
+Framework root here is configurable and is resolved in the following order:
+
+.nf
+  1. Paths specified in the environment variable $XBUILD_FRAMEWORK_FOLDERS_PATH
+  2. /Library/Frameworks/Mono.framework/External/xbuild-frameworks on Mac OSX.
+  3. MSBuild property $(TargetFrameworkRoot)
+  4. $prefix/lib/mono/xbuild-frameworks (default location)
+.fi
+
+XBuild tries the paths given above, in order, till it finds a FrameworkList.xml for the moniker.
+Running with /v:detailed or higher verbosity will show the various paths that it tries.
+.TP
 .I "XBUILD_COLORS"
 If this variable is set, it contains a string of the form
 "type=foreground,type=.." that specifies which color to use to display
index 0430fcfe77568ee00938455220ef32f2eda0ece8..fb30b46bc2a0166be16fc780c7c45a557fb45b0b 100644 (file)
@@ -79,6 +79,7 @@ Microsoft.Build.Tasks/GenerateTrustInfo.cs
 Microsoft.Build.Tasks/GetAssemblyIdentity.cs
 Microsoft.Build.Tasks/GetFrameworkPath.cs
 Microsoft.Build.Tasks/GetFrameworkSdkPath.cs
+Microsoft.Build.Tasks/GetReferenceAssemblyPaths.cs
 Microsoft.Build.Tasks.Hosting/ICscHostObject.cs
 Microsoft.Build.Tasks.Hosting/IVbcHostObject.cs
 Microsoft.Build.Tasks/LC.cs
diff --git a/mcs/class/Microsoft.Build.Tasks/Microsoft.Build.Tasks/GetReferenceAssemblyPaths.cs b/mcs/class/Microsoft.Build.Tasks/Microsoft.Build.Tasks/GetReferenceAssemblyPaths.cs
new file mode 100644 (file)
index 0000000..b0f9af8
--- /dev/null
@@ -0,0 +1,246 @@
+using System;
+using Microsoft.Build.Framework;
+using System.IO;
+using System.Reflection;
+using System.Xml;
+using System.Collections.Generic;
+
+using Mono.XBuild.Utilities;
+
+#if NET_4_0
+
+namespace Microsoft.Build.Tasks
+{
+       public class GetReferenceAssemblyPaths : TaskExtension
+       {
+               static string framework_base_path;
+               static string PathSeparatorAsString = Path.PathSeparator.ToString ();
+               const string MacOSXExternalXBuildDir = "/Library/Frameworks/Mono.framework/External/xbuild-frameworks";
+
+               public GetReferenceAssemblyPaths ()
+               {
+               }
+
+               public override bool Execute ()
+               {
+                       FrameworkMoniker moniker = null;
+                       if (!TryParseTargetFrameworkMoniker (TargetFrameworkMoniker, out moniker))
+                               return false;
+
+                       var framework = GetFrameworkDirectoriesForMoniker (moniker);
+                       if (framework == null) {
+                               Log.LogWarning ("Unable to find framework corresponding to the target framework moniker '{0}'. " +
+                                               "Framework assembly references will be resolved from the GAC, which might not be " +
+                                               "the intended behavior.", TargetFrameworkMoniker);
+                               return true;
+                       }
+
+                       ReferenceAssemblyPaths = FullFrameworkReferenceAssemblyPaths = framework.Directories;
+                       TargetFrameworkMonikerDisplayName = framework.DisplayName;
+
+                       return true;
+               }
+
+               Framework GetFrameworkDirectoriesForMoniker (FrameworkMoniker moniker)
+               {
+                       string dirs = String.Join (PathSeparatorAsString, new string [] {
+                                                       Environment.GetEnvironmentVariable ("XBUILD_FRAMEWORK_FOLDERS_PATH") ?? String.Empty,
+                                                       MSBuildUtils.RunningOnMac ? MacOSXExternalXBuildDir : String.Empty,
+                                                       RootPath,
+                                                       DefaultFrameworksBasePath });
+
+                       string [] paths = dirs.Split (new char [] {Path.PathSeparator}, StringSplitOptions.RemoveEmptyEntries);
+                       foreach (string path in paths) {
+                               var framework = GetFrameworkDirectoriesForMoniker (moniker, path);
+                               if (framework != null)
+                                       return framework;
+                       }
+
+                       return null;
+               }
+
+               //@base_path must be absolute
+               Framework GetFrameworkDirectoriesForMoniker (FrameworkMoniker moniker, string base_path)
+               {
+                       if (String.IsNullOrEmpty (base_path)) {
+                               Log.LogMessage (MessageImportance.Low, "Invalid *empty* base path, ignoring. " + Environment.StackTrace);
+                               return null;
+                       }
+
+                       Log.LogMessage (MessageImportance.Low, "Looking for framework '{0}' in root path '{1}'",
+                                       moniker, base_path);
+                       string framework_path = Path.Combine (base_path, Path.Combine (moniker.Identifier, moniker.Version));
+                       if (!String.IsNullOrEmpty (moniker.Profile))
+                               framework_path = Path.Combine (framework_path, moniker.Profile);
+
+                       string redistlist_dir = Path.Combine (framework_path, "RedistList");
+                       string framework_list = Path.Combine (redistlist_dir, "FrameworkList.xml");
+                       if (!File.Exists (framework_list)) {
+                               Log.LogMessage (MessageImportance.Low,
+                                                       "Unable to find framework definition file '{0}' for Target Framework Moniker '{1}'",
+                                                       framework_list, moniker);
+                               return null;
+                       }
+
+                       Log.LogMessage (MessageImportance.Low, "Found framework definition list '{0}' for framework '{1}'",
+                                       framework_list, moniker);
+                       XmlReader xr = XmlReader.Create (framework_list);
+                       try {
+                               xr.MoveToContent ();
+                               if (xr.LocalName != "FileList") {
+                                       Log.LogMessage (MessageImportance.Low, "Invalid frameworklist '{0}', expected a 'FileList' root element.",
+                                                       framework_list);
+                                       return null;
+                               }
+
+                               var framework = new Framework ();
+                               framework.DisplayName = xr.GetAttribute ("Name");
+                               string framework_dir = xr.GetAttribute ("TargetFrameworkDirectory");
+                               if (String.IsNullOrEmpty (framework_dir))
+                                       framework_dir = Path.Combine (redistlist_dir, "..");
+                               else
+                                       framework_dir = Path.Combine (redistlist_dir, framework_dir);
+
+                               var directories = new List<string> ();
+                               directories.Add (MSBuildUtils.FromMSBuildPath (framework_dir));
+
+                               string include = xr.GetAttribute ("IncludeFramework");
+                               if (!String.IsNullOrEmpty (include)) {
+                                       var included_framework = GetFrameworkDirectoriesForMoniker (new FrameworkMoniker (moniker.Identifier, include, null));
+
+                                       if (included_framework != null && included_framework.Directories != null)
+                                               directories.AddRange (included_framework.Directories);
+                               }
+
+                               framework.Directories = directories.ToArray ();
+
+                               return framework;
+                       } catch (XmlException xe) {
+                               Log.LogWarning ("Error reading framework definition file '{0}': {1}", framework_list, xe.Message);
+                               Log.LogMessage (MessageImportance.Low, "Error reading framework definition file '{0}': {1}", framework_list,
+                                               xe.ToString ());
+                               return null;
+                       } finally {
+                               if (xr != null)
+                                       ((IDisposable)xr).Dispose ();
+                       }
+               }
+
+               bool TryParseTargetFrameworkMoniker (string moniker_literal, out FrameworkMoniker moniker)
+               {
+                       moniker = null;
+                       if (String.IsNullOrEmpty (moniker_literal))
+                               throw new ArgumentException ("Empty moniker string");
+
+                       string [] parts = moniker_literal.Split (new char [] {','}, StringSplitOptions.RemoveEmptyEntries);
+
+                       if (parts.Length < 2 || parts.Length > 3) {
+                               LogInvalidMonikerError (null, moniker_literal);
+                               return false;
+                       }
+
+                       string identifier = parts [0];
+                       string version = null;
+                       string profile = null;
+
+                       if (!parts [1].StartsWith ("Version=")) {
+                               LogInvalidMonikerError ("Invalid framework name", moniker_literal);
+                               return false;
+                       }
+
+                       version = parts [1].Substring (8);
+                       if (String.IsNullOrEmpty (version)) {
+                               LogInvalidMonikerError ("Invalid framework version", moniker_literal);
+                               return false;
+                       }
+
+                       if (parts.Length > 2) {
+                               if (!parts [2].StartsWith ("Profile=")) {
+                                       LogInvalidMonikerError ("Invalid framework version", moniker_literal);
+                                       return false;
+                               }
+
+                               profile = parts [2].Substring (8);
+                               if (String.IsNullOrEmpty (profile)) {
+                                       LogInvalidMonikerError ("Invalid framework profile", moniker_literal);
+                                       return false;
+                               }
+                       }
+
+                       moniker = new FrameworkMoniker (identifier, version, profile);
+                       return true;
+               }
+
+               void LogInvalidMonikerError (string msg, string moniker_literal)
+               {
+                       if (msg != null)
+                               Log.LogError ("{0} in the Target Framework Moniker '{1}'. Expected format: 'Identifier,Version=<version>[,Profile=<profile>]'. " +
+                                                       "It should have either 2 or 3 comma separated components.", msg, moniker_literal);
+                       else
+                               Log.LogError ("Invalid Target Framework Moniker '{0}'. Expected format: 'Identifier,Version=<version>[,Profile=<profile>]'. " +
+                                                       "It should have either 2 or 3 comma separated components.", moniker_literal);
+               }
+
+               [Required]
+               public string TargetFrameworkMoniker { get; set; }
+
+               public string RootPath { get; set; }
+
+               public bool BypassFrameworkInstallChecks { get; set; }
+
+               [Output]
+               public string TargetFrameworkMonikerDisplayName { get; set; }
+
+               [Output]
+               public string[] ReferenceAssemblyPaths { get; set; }
+
+               [Output]
+               public string[] FullFrameworkReferenceAssemblyPaths { get; set; }
+
+               static string DefaultFrameworksBasePath {
+                       get {
+                               if (framework_base_path == null) {
+                                       // NOTE: code from mcs/tools/gacutil/driver.cs
+                                       PropertyInfo gac = typeof (System.Environment).GetProperty (
+                                                       "GacPath", BindingFlags.Static | BindingFlags.NonPublic);
+
+                                       if (gac != null) {
+                                               MethodInfo get_gac = gac.GetGetMethod (true);
+                                               string gac_path = (string) get_gac.Invoke (null, null);
+                                               framework_base_path = Path.GetFullPath (Path.Combine (
+                                                                       gac_path, Path.Combine ("..", "xbuild-frameworks")));
+                                       }
+                               }
+                               return framework_base_path;
+                       }
+               }
+       }
+
+       class FrameworkMoniker {
+               public readonly string Identifier;
+               public readonly string Version;
+               public readonly string Profile;
+
+               public FrameworkMoniker (string identifier, string version, string profile)
+               {
+                       this.Identifier = identifier;
+                       this.Version = version;
+                       this.Profile = profile;
+               }
+
+               public override string ToString ()
+               {
+                       if (String.IsNullOrEmpty (Profile))
+                               return String.Format ("{0},Version={1}", Identifier, Version);
+                       return  String.Format ("{0},Version={1},Profile={2}", Identifier, Version, Profile);
+               }
+       }
+
+       class Framework {
+               public string Moniker;
+               public string[] Directories;
+               public string DisplayName;
+       }
+}
+
+#endif
index 70b382730867628cfcc5b981b943ff4d3659590c..e6b0496aeef033666912e59de3db440f9b70d59c 100644 (file)
@@ -26,6 +26,8 @@ include ../../build/executable.make
 CLEAN_FILES= xbuild.exe xbuild.exe.mdb
 
 XBUILD_DIR=.
+XBUILD_FRAMEWORKS_DIR=$(mono_libdir)/mono/xbuild-frameworks/.NETFramework/
+REDISTLIST_DIR=$(XBUILD_FRAMEWORKS_DIR)/v$(FRAMEWORK_VERSION)/RedistList
 include $(XBUILD_DIR)/xbuild_targets.make
 
 install-local: install-extras
@@ -34,13 +36,15 @@ WEBAPP_DIR = Microsoft/VisualStudio/v9.0/WebApplications
 SILVERLIGHT_DIR = $(mono_libdir)/mono/xbuild/Microsoft/Silverlight
 EXTRAS_DIR = $(mono_libdir)/mono/$(FRAMEWORK_VERSION)
 install-extras: 
-       $(MKINSTALLDIRS) $(DESTDIR)$(EXTRAS_DIR)
+       $(MKINSTALLDIRS) $(DESTDIR)$(EXTRAS_DIR) $(REDISTLIST_DIR) $(DESTDIR)$(XBUILD_FRAMEWORKS_DIR)/v3.0/RedistList
        $(INSTALL_DATA) xbuild/xbuild.rsp $(DESTDIR)$(EXTRAS_DIR)
        $(INSTALL_DATA) xbuild/$(FRAMEWORK_VERSION)/Microsoft.Common.tasks $(DESTDIR)$(EXTRAS_DIR)
        $(INSTALL_DATA) xbuild/Microsoft.Build.xsd $(DESTDIR)$(EXTRAS_DIR)
        $(INSTALL_DATA) xbuild/$(FRAMEWORK_VERSION)/Microsoft.Common.targets $(DESTDIR)$(EXTRAS_DIR)
        $(INSTALL_DATA) xbuild/Microsoft.CSharp.targets $(DESTDIR)$(EXTRAS_DIR)
        $(INSTALL_DATA) xbuild/Microsoft.VisualBasic.targets $(DESTDIR)$(EXTRAS_DIR)
+       $(INSTALL_DATA) xbuild/$(FRAMEWORK_VERSION)/FrameworkList.xml $(DESTDIR)$(REDISTLIST_DIR)
+       $(INSTALL_DATA) xbuild/FrameworkList-3.0.xml $(DESTDIR)$(XBUILD_FRAMEWORKS_DIR)/v3.0/RedistList/FrameworkList.xml
        $(MKINSTALLDIRS) $(DESTDIR)$(EXTRAS_DIR)/MSBuild
        $(INSTALL_DATA) xbuild/MSBuild/Microsoft.Build.CommonTypes.xsd $(DESTDIR)$(EXTRAS_DIR)/MSBuild
        $(INSTALL_DATA) xbuild/MSBuild/Microsoft.Build.Core.xsd $(DESTDIR)$(EXTRAS_DIR)/MSBuild
@@ -64,6 +68,10 @@ EXTRA_DISTFILES = \
        xbuild/2.0/Microsoft.Common.targets \
        xbuild/3.5/Microsoft.Common.targets \
        xbuild/4.0/Microsoft.Common.targets \
+       xbuild/2.0/FrameworkList.xml \
+       xbuild/3.5/FrameworkList.xml \
+       xbuild/4.0/FrameworkList.xml \
+       xbuild/FrameworkList-3.0.xml \
        xbuild/Microsoft.Build.xsd \
        xbuild/Microsoft.CSharp.targets \
        xbuild/MSBuild/Microsoft.Build.CommonTypes.xsd \
diff --git a/mcs/tools/xbuild/xbuild/2.0/FrameworkList.xml b/mcs/tools/xbuild/xbuild/2.0/FrameworkList.xml
new file mode 100644 (file)
index 0000000..2b8bd9b
--- /dev/null
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FileList Name=".NET Framework 2.0" TargetFrameworkDirectory="..\..\..\..\2.0">
+</FileList>
index 133f45d0dcea5e178625b53a137e080865a84d06..af108a0c4c8d87fb428cf7c86782f5096a5148f1 100644 (file)
                />
        </Target>
 
-       <Target Name="GetFrameworkPaths">
+       <PropertyGroup>
+               <GetFrameworkPathsDependsOn />
+       </PropertyGroup>
+       <Target Name="GetFrameworkPaths" DependsOnTargets="$(GetFrameworkPathsDependsOn)">
                <GetFrameworkPath>
                        <Output Condition="'$(TargetFrameworkVersion)' == 'v3.5'"
                                TaskParameter="FrameworkVersion35Path"
-                               ItemName="_TargetFrameworkDirectories"/>
+                               ItemName="_CombinedTargetFrameworkDirectoriesItem"/>
                        <Output Condition="'$(TargetFrameworkVersion)' == 'v3.0' or '$(TargetFrameworkVersion)' == 'v3.5'" 
                                TaskParameter="FrameworkVersion30Path"
-                               ItemName="_TargetFrameworkDirectories"/>
+                               ItemName="_CombinedTargetFrameworkDirectoriesItem"/>
                        <Output Condition="'$(TargetFrameworkVersion)' == 'v2.0' or '$(TargetFrameworkVersion)' == 'v3.0' or '$(TargetFrameworkVersion)' == 'v3.5'" 
                                TaskParameter="FrameworkVersion20Path"
-                               ItemName="_TargetFrameworkDirectories"/>
+                               ItemName="_CombinedTargetFrameworkDirectoriesItem"/>
                </GetFrameworkPath>
-               <CreateProperty Value="@(_TargetFrameworkDirectories)">
+               <CreateProperty Value="@(_CombinedTargetFrameworkDirectoriesItem)">
                        <Output TaskParameter="Value" PropertyName="TargetFrameworkDirectory"/>
                </CreateProperty>
 
diff --git a/mcs/tools/xbuild/xbuild/3.5/FrameworkList.xml b/mcs/tools/xbuild/xbuild/3.5/FrameworkList.xml
new file mode 100644 (file)
index 0000000..1225842
--- /dev/null
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FileList  Name=".NET Framework 3.5" TargetFrameworkDirectory="..\..\..\..\3.5" IncludeFramework="v3.0">
+</FileList>
index 133f45d0dcea5e178625b53a137e080865a84d06..f671d817605a04b754667e5ef468e59e1272e0c3 100644 (file)
                />
        </Target>
 
-       <Target Name="GetFrameworkPaths">
+       <PropertyGroup>
+               <GetFrameworkPathsDependsOn />
+       </PropertyGroup>
+       <Target Name="GetFrameworkPaths" DependsOnTargets="$(GetFrameworkPathsDependsOn)">
                <GetFrameworkPath>
                        <Output Condition="'$(TargetFrameworkVersion)' == 'v3.5'"
                                TaskParameter="FrameworkVersion35Path"
-                               ItemName="_TargetFrameworkDirectories"/>
+                               ItemName="_CombinedTargetFrameworkDirectoriesItem"/>
                        <Output Condition="'$(TargetFrameworkVersion)' == 'v3.0' or '$(TargetFrameworkVersion)' == 'v3.5'" 
                                TaskParameter="FrameworkVersion30Path"
-                               ItemName="_TargetFrameworkDirectories"/>
+                               ItemName="_CombinedTargetFrameworkDirectoriesItem"/>
                        <Output Condition="'$(TargetFrameworkVersion)' == 'v2.0' or '$(TargetFrameworkVersion)' == 'v3.0' or '$(TargetFrameworkVersion)' == 'v3.5'" 
                                TaskParameter="FrameworkVersion20Path"
-                               ItemName="_TargetFrameworkDirectories"/>
+                               ItemName="_CombinedTargetFrameworkDirectoriesItem"/>
                </GetFrameworkPath>
-               <CreateProperty Value="@(_TargetFrameworkDirectories)">
+               <CreateProperty Value="@(_CombinedTargetFrameworkDirectoriesItem)">
                        <Output TaskParameter="Value" PropertyName="TargetFrameworkDirectory"/>
                </CreateProperty>
 
                        Condition="'$(TargetFrameworkVersion)' != 'v3.5' and '$(TargetFrameworkVersion)' != 'v3.0' and '$(TargetFrameworkVersion)' != 'v2.0'"/>
        </Target>
 
+       <PropertyGroup>
+               <GetReferenceAssemblyPathsDependsOn />
+       </PropertyGroup>
+       <!-- Multi-targeting against "framework packs" is not supported with ToolsVersion < 4.0,
+            this target is just a place holder, can be overridden -->
+       <Target Name="GetReferenceAssemblyPaths" DependsOnTargets="$(GetReferenceAssemblyPathsDependsOn)" />
+
        <PropertyGroup>
                <AllowedReferenceAssemblyFileExtensions Condition=" '$(AllowedReferenceAssemblyFileExtensions)' == '' ">
                        .exe;
 
                <ResolveAssemblyReferencesDependsOn>
                        GetFrameworkPaths;
+                       GetReferenceAssemblyPaths;
                        PrepareForBuild
                </ResolveAssemblyReferencesDependsOn>
        </PropertyGroup>
                <CoreBuildDependsOn>
                        PrepareForBuild;
                        GetFrameworkPaths;
+                       GetReferenceAssemblyPaths;
                        PreBuildEvent;
                        ResolveReferences;
                        CopyFilesMarkedCopyLocal;
diff --git a/mcs/tools/xbuild/xbuild/4.0/FrameworkList.xml b/mcs/tools/xbuild/xbuild/4.0/FrameworkList.xml
new file mode 100644 (file)
index 0000000..7012794
--- /dev/null
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FileList  Name=".NET Framework 4" TargetFrameworkDirectory="..\..\..\..\4.0">
+</FileList>
index 63396db408ab888e0f611156f1b1b1ee13f05c94..5ecd77a13820e5112ce7beaf9176dcc26dbde7ee 100644 (file)
                <OutputPath Condition="'$(OutputPath)' != '' and !HasTrailingSlash('$(OutputPath)')">$(OutputPath)\</OutputPath> 
                <OutputPath Condition=" '$(Platform)'=='' and '$(Configuration)'=='' and '$(OutputPath)'=='' ">bin\Debug\</OutputPath>
                <WarningLevel Condition="'$(WarningLevel)' == ''" >2</WarningLevel>
+
+               <TargetFrameworkIdentifier Condition="'$(TargetFrameworkIdentifier)' == ''">.NETFramework</TargetFrameworkIdentifier>
                <TargetFrameworkVersion Condition="'$(TargetFrameworkVersion)' == ''">v4.0</TargetFrameworkVersion>
+
+               <TargetFrameworkMoniker Condition="'$(TargetFrameworkMoniker)' == '' and '$(TargetFrameworkProfile)' != ''">$(TargetFrameworkIdentifier),Version=$(TargetFrameworkVersion),Profile=$(TargetFrameworkProfile)</TargetFrameworkMoniker>
+               <TargetFrameworkMoniker Condition="'$(TargetFrameworkMoniker)' == ''">$(TargetFrameworkIdentifier),Version=$(TargetFrameworkVersion)</TargetFrameworkMoniker>
        </PropertyGroup>
 
        <PropertyGroup>
                />
        </Target>
 
-       <Target Name="GetFrameworkPaths">
+       <PropertyGroup>
+               <GetFrameworkPathsDependsOn />
+       </PropertyGroup>
+       <Target Name="GetFrameworkPaths"
+               Condition="'$(TargetFrameworkIdentifier)' == '' or '$(TargetFrameworkIdentifier)' == '.NETFramework'"
+               DependsOnTargets="$(GetFrameworkPathsDependsOn)">
                <GetFrameworkPath>
                        <Output Condition="'$(TargetFrameworkVersion)' == 'v4.0'"
                                TaskParameter="FrameworkVersion40Path"
-                               ItemName="_TargetFrameworkDirectories"/>
+                               ItemName="_CombinedTargetFrameworkDirectoriesItem"/>
                        <Output Condition="'$(TargetFrameworkVersion)' == 'v3.5'"
                                TaskParameter="FrameworkVersion35Path"
-                               ItemName="_TargetFrameworkDirectories"/>
+                               ItemName="_CombinedTargetFrameworkDirectoriesItem"/>
                        <Output Condition="'$(TargetFrameworkVersion)' == 'v3.0' or '$(TargetFrameworkVersion)' == 'v3.5'" 
                                TaskParameter="FrameworkVersion30Path"
-                               ItemName="_TargetFrameworkDirectories"/>
+                               ItemName="_CombinedTargetFrameworkDirectoriesItem"/>
                        <Output Condition="'$(TargetFrameworkVersion)' == 'v2.0' or '$(TargetFrameworkVersion)' == 'v3.0' or '$(TargetFrameworkVersion)' == 'v3.5'" 
                                TaskParameter="FrameworkVersion20Path"
-                               ItemName="_TargetFrameworkDirectories"/>
+                               ItemName="_CombinedTargetFrameworkDirectoriesItem"/>
                </GetFrameworkPath>
-               <CreateProperty Value="@(_TargetFrameworkDirectories)">
+               <CreateProperty Value="@(_CombinedTargetFrameworkDirectoriesItem)">
                        <Output TaskParameter="Value" PropertyName="TargetFrameworkDirectory"/>
                </CreateProperty>
 
                        Condition="'$(TargetFrameworkVersion)' != 'v4.0' and '$(TargetFrameworkVersion)' != 'v3.5' and '$(TargetFrameworkVersion)' != 'v3.0' and '$(TargetFrameworkVersion)' != 'v2.0'"/>
        </Target>
 
+       <PropertyGroup>
+               <GetReferenceAssemblyPathsDependsOn />
+       </PropertyGroup>
+       <Target Name="GetReferenceAssemblyPaths" DependsOnTargets="$(GetReferenceAssemblyPathsDependsOn)">
+               <!-- in case of .NETFramework, $(TargetFrameworkDirectory) would have been set by
+               GetFrameworkPaths, if it hasn't been changed, then clear it, to avoid duplicates -->
+               <CreateProperty Value="" Condition="'@(_CombinedTargetFrameworkDirectoriesItem)' == '$(TargetFrameworkDirectory)'">
+                       <Output TaskParameter="Value" PropertyName="TargetFrameworkDirectory"/>
+               </CreateProperty>
+
+               <GetReferenceAssemblyPaths
+                       Condition="'$(TargetFrameworkMoniker)' != ''"
+                       TargetFrameworkMoniker="$(TargetFrameworkMoniker)"
+                       RootPath="$(TargetFrameworkRootPath)">
+
+                       <Output TaskParameter="ReferenceAssemblyPaths" PropertyName="_TargetFrameworkDirectories"/>
+                       <Output TaskParameter="FullFrameworkReferenceAssemblyPaths" PropertyName="_FullFrameworkReferenceAssemblyPaths"/>
+                       <Output TaskParameter="TargetFrameworkMonikerDisplayName" PropertyName="TargetFrameworkMonikerDisplayName"/>
+               </GetReferenceAssemblyPaths>
+
+               <CreateProperty Value="$(_TargetFrameworkDirectories);$(TargetFrameworkDirectory)">
+                       <Output TaskParameter="Value" PropertyName="TargetFrameworkDirectory"/>
+               </CreateProperty>
+       </Target>
+
        <PropertyGroup>
                <AllowedReferenceAssemblyFileExtensions Condition=" '$(AllowedReferenceAssemblyFileExtensions)' == '' ">
                        .exe;
 
                <ResolveAssemblyReferencesDependsOn>
                        GetFrameworkPaths;
+                       GetReferenceAssemblyPaths;
                        PrepareForBuild
                </ResolveAssemblyReferencesDependsOn>
        </PropertyGroup>
                <CoreBuildDependsOn>
                        PrepareForBuild;
                        GetFrameworkPaths;
+                       GetReferenceAssemblyPaths;
                        PreBuildEvent;
                        ResolveReferences;
                        CopyFilesMarkedCopyLocal;
index 4ace4fedff6fc48a18a11cf1c344d9036e0239a3..c8b74228328c46500d34940f7d2927bd866bd821 100644 (file)
@@ -17,6 +17,7 @@
        <UsingTask TaskName="Microsoft.Build.Tasks.GenerateResource"    AssemblyName="Microsoft.Build.Tasks.v4.0, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
        <UsingTask TaskName="Microsoft.Build.Tasks.GetFrameworkPath"    AssemblyName="Microsoft.Build.Tasks.v4.0, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
        <UsingTask TaskName="Microsoft.Build.Tasks.GetFrameworkSdkPath" AssemblyName="Microsoft.Build.Tasks.v4.0, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+       <UsingTask TaskName="Microsoft.Build.Tasks.GetReferenceAssemblyPaths"   AssemblyName="Microsoft.Build.Tasks.v4.0, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
        <UsingTask TaskName="Microsoft.Build.Tasks.LC"                  AssemblyName="Microsoft.Build.Tasks.v4.0, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
        <UsingTask TaskName="Microsoft.Build.Tasks.MakeDir"             AssemblyName="Microsoft.Build.Tasks.v4.0, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
        <UsingTask TaskName="Microsoft.Build.Tasks.Message"             AssemblyName="Microsoft.Build.Tasks.v4.0, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
diff --git a/mcs/tools/xbuild/xbuild/FrameworkList-3.0.xml b/mcs/tools/xbuild/xbuild/FrameworkList-3.0.xml
new file mode 100644 (file)
index 0000000..ae06c88
--- /dev/null
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FileList Name=".NET Framework 3.0" TargetFrameworkDirectory="..\..\..\..\2.0">
+</FileList>