List<ITaskItem> tempResolvedFiles;
List<PrimaryReference> primaryReferences;
Dictionary<string, string> alreadyScannedAssemblyNames;
+ Dictionary<string, string> conflictWarningsCache;
//FIXME: construct and use a graph of the dependencies, useful across projects
// nothing to resolve
return true;
+ LogTaskParameters ();
+
assembly_resolver.Log = Log;
tempResolvedFiles = new List<ITaskItem> ();
tempCopyLocalFiles = new Dictionary<string, ITaskItem> ();
primaryReferences = new List<PrimaryReference> ();
assemblyNameToResolvedRef = new Dictionary<string, ResolvedReference> ();
+ conflictWarningsCache = new Dictionary<string, string> ();
ResolveAssemblies ();
ResolveAssemblyFiles ();
alreadyScannedAssemblyNames.Clear ();
primaryReferences.Clear ();
assemblyNameToResolvedRef.Clear ();
+ conflictWarningsCache.Clear ();
dependency_search_paths = null;
return true;
continue;
}
- Log.LogMessage (MessageImportance.Low, "Primary Reference {0}", item.ItemSpec);
+ LogWithPrecedingNewLine (MessageImportance.Low, "Primary Reference {0}", item.ItemSpec);
ResolvedReference resolved_ref = ResolveReference (item, searchPaths, true);
if (resolved_ref == null) {
Log.LogWarning ("Reference '{0}' not resolved", item.ItemSpec);
- assembly_resolver.LogSearchLoggerMessages ();
+ assembly_resolver.LogSearchLoggerMessages (MessageImportance.Normal);
} else {
+ if (Environment.GetEnvironmentVariable ("XBUILD_LOG_REFERENCE_RESOLVER") != null)
+ assembly_resolver.LogSearchLoggerMessages (MessageImportance.Low);
+
Log.LogMessage (MessageImportance.Low,
"\tReference {0} resolved to {1}. CopyLocal = {2}",
item.ItemSpec, resolved_ref.TaskItem,
resolved = assembly_resolver.ResolveGacReference (item, specific_version);
} else if (String.Compare (spath, "{RawFileName}") == 0) {
//FIXME: identify assembly names, as extract the name, and try with that?
- AssemblyName aname = assembly_resolver.GetAssemblyNameFromFile (item.ItemSpec);
- if (aname != null)
+ AssemblyName aname;
+ if (assembly_resolver.TryGetAssemblyNameFromFile (item.ItemSpec, out aname))
resolved = assembly_resolver.GetResolvedReference (item, item.ItemSpec, aname, true,
SearchPath.RawFileName);
} else if (String.Compare (spath, "{CandidateAssemblyFiles}") == 0) {
} else {
resolved = assembly_resolver.FindInDirectory (
item, spath,
- allowedAssemblyExtensions ?? default_assembly_extensions);
+ allowedAssemblyExtensions ?? default_assembly_extensions,
+ specific_version);
}
if (resolved != null)
specific_version = true;
string value = item.GetMetadata ("SpecificVersion");
if (String.IsNullOrEmpty (value)) {
- AssemblyName name = new AssemblyName (item.ItemSpec);
+ //AssemblyName name = new AssemblyName (item.ItemSpec);
// If SpecificVersion is not specified, then
// it is true if the Include is a strong name else false
- specific_version = assembly_resolver.IsStrongNamed (name);
+ //specific_version = assembly_resolver.IsStrongNamed (name);
+
+ // msbuild seems to just look for a ',' in the name :/
+ specific_version = item.ItemSpec.IndexOf (',') >= 0;
return true;
}
assembly_resolver.ResetSearchLogger ();
if (!File.Exists (item.ItemSpec)) {
- Log.LogMessage (MessageImportance.Low,
+ LogWithPrecedingNewLine (MessageImportance.Low,
"Primary Reference from AssemblyFiles {0}, file not found. Ignoring",
item.ItemSpec);
continue;
}
- Log.LogMessage (MessageImportance.Low, "Primary Reference from AssemblyFiles {0}", item.ItemSpec);
+ LogWithPrecedingNewLine (MessageImportance.Low, "Primary Reference from AssemblyFiles {0}", item.ItemSpec);
string copy_local;
- AssemblyName aname = assembly_resolver.GetAssemblyNameFromFile (item.ItemSpec);
- if (aname == null) {
+ AssemblyName aname;
+ if (!assembly_resolver.TryGetAssemblyNameFromFile (item.ItemSpec, out aname)) {
Log.LogWarning ("Reference '{0}' not resolved", item.ItemSpec);
- assembly_resolver.LogSearchLoggerMessages ();
+ assembly_resolver.LogSearchLoggerMessages (MessageImportance.Normal);
continue;
}
+ if (Environment.GetEnvironmentVariable ("XBUILD_LOG_REFERENCE_RESOLVER") != null)
+ assembly_resolver.LogSearchLoggerMessages (MessageImportance.Low);
+
ResolvedReference rr = assembly_resolver.GetResolvedReference (item, item.ItemSpec, aname, true,
SearchPath.RawFileName);
copy_local = rr.CopyLocal.ToString ();
if (TryGetResolvedReferenceByAssemblyName (aname, false, out resolved_ref))
return resolved_ref;
- Log.LogMessage (MessageImportance.Low, "Dependency {0}", aname);
+ LogWithPrecedingNewLine (MessageImportance.Low, "Dependency {0}", aname);
Log.LogMessage (MessageImportance.Low, "\tRequired by {0}", parent_asm_name);
ITaskItem item = new TaskItem (aname.FullName);
resolved_ref = ResolveReference (item, dependency_search_paths, false);
if (resolved_ref != null) {
+ if (Environment.GetEnvironmentVariable ("XBUILD_LOG_REFERENCE_RESOLVER") != null)
+ assembly_resolver.LogSearchLoggerMessages (MessageImportance.Low);
+
Log.LogMessage (MessageImportance.Low, "\tReference {0} resolved to {1}.",
aname, resolved_ref.TaskItem.ItemSpec);
}
} else {
Log.LogWarning ("Reference '{0}' not resolved", aname);
- assembly_resolver.LogSearchLoggerMessages ();
+ assembly_resolver.LogSearchLoggerMessages (MessageImportance.Normal);
}
return resolved_ref;
return false;
// match for full name
- if (AssemblyResolver.AssemblyNamesCompatible (key_aname, found_ref.AssemblyName, true))
+ if (AssemblyResolver.AssemblyNamesCompatible (key_aname, found_ref.AssemblyName, true, false))
// exact match, so its already there, dont add anything
return true;
assembly_resolver.LogSearchMessage ("Choosing '{0}' as it is a primary reference.",
found_ref.AssemblyName.FullName);
- Log.LogWarning ("Found a conflict between : '{0}' and '{1}'. Using '{0}' reference.",
- found_ref.AssemblyName.FullName,
- key_aname.FullName);
+ LogConflictWarning (found_ref.AssemblyName.FullName, key_aname.FullName);
return true;
}
- bool IsCopyLocal (ITaskItem item)
+ void LogWithPrecedingNewLine (MessageImportance importance, string format, params object [] args)
{
- return Boolean.Parse (item.GetMetadata ("CopyLocal"));
+ Log.LogMessage (importance, String.Empty);
+ Log.LogMessage (importance, format, args);
}
- bool IsFromTargetFramework (string filename)
+ // conflict b/w @main and @conflicting, picking @main
+ void LogConflictWarning (string main, string conflicting)
{
- foreach (string fpath in targetFrameworkDirectories)
- if (filename.StartsWith (fpath))
- return true;
-
- return false;
+ string key = main + ":" + conflicting;
+ if (!conflictWarningsCache.ContainsKey (key)) {
+ Log.LogWarning ("Found a conflict between : '{0}' and '{1}'. Using '{0}' reference.",
+ main, conflicting);
+ conflictWarningsCache [key] = key;
+ }
}
bool IsFromGacOrTargetFramework (ResolvedReference rr)
rr.FoundInSearchPath == SearchPath.TargetFrameworkDirectory;
}
+ void LogTaskParameters ()
+ {
+ Log.LogMessage (MessageImportance.Low, "TargetFrameworkDirectories:");
+ if (TargetFrameworkDirectories != null)
+ foreach (string dir in TargetFrameworkDirectories)
+ Log.LogMessage (MessageImportance.Low, "\t{0}", dir);
+
+ Log.LogMessage (MessageImportance.Low, "SearchPaths:");
+ if (SearchPaths != null)
+ foreach (string path in SearchPaths)
+ Log.LogMessage (MessageImportance.Low, "\t{0}", path);
+ }
+
public bool AutoUnify {
get { return autoUnify; }
set { autoUnify = value; }
public ITaskItem[] SuggestedRedirects {
get { return suggestedRedirects; }
}
-
+
+#if NET_4_0
+ public string TargetFrameworkMoniker { get; set; }
+
+ public string TargetFrameworkMonikerDisplayName { get; set; }
+#endif
+
+ public string TargetFrameworkVersion { get; set; }
+
public string[] TargetFrameworkDirectories {
get { return targetFrameworkDirectories; }
set { targetFrameworkDirectories = value; }
set { targetProcessorArchitecture = value; }
}
+
static Dictionary<string, string> cultureNamesTable;
static Dictionary<string, string> CultureNamesTable {
get {