diff options
6 files changed, 83 insertions, 36 deletions
diff --git a/main/external/debugger-libs b/main/external/debugger-libs -Subproject 5be3f8a20c067427dfbad4ff196f40a64189191 +Subproject fc339ef4b095026ae8d05f8ac32bf2fc385dccd diff --git a/main/src/addins/MonoDevelop.Debugger.Soft/MonoDevelop.Debugger.Soft/SoftDebuggerEngine.cs b/main/src/addins/MonoDevelop.Debugger.Soft/MonoDevelop.Debugger.Soft/SoftDebuggerEngine.cs index 98d5f6edab..aa0993debf 100644 --- a/main/src/addins/MonoDevelop.Debugger.Soft/MonoDevelop.Debugger.Soft/SoftDebuggerEngine.cs +++ b/main/src/addins/MonoDevelop.Debugger.Soft/MonoDevelop.Debugger.Soft/SoftDebuggerEngine.cs @@ -92,7 +92,7 @@ namespace MonoDevelop.Debugger.Soft ExternalConsoleFactory.Instance.CreateConsole (dsi.CloseExternalConsoleOnExit), varsCopy); return new ProcessAdapter (oper, Path.GetFileName (info.FileName)); }; - + startArgs.MonoExecutableFileName = runtime.MonoRuntimeInfo.Force64or32bit.HasValue ? runtime.MonoRuntimeInfo.Force64or32bit.Value ? "mono64" : "mono32" : "mono"; return dsi; } diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/MonoRuntimeInfo.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/MonoRuntimeInfo.cs index 164ed5c2e3..afb2374bed 100644 --- a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/MonoRuntimeInfo.cs +++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/MonoRuntimeInfo.cs @@ -39,6 +39,9 @@ namespace MonoDevelop.Core.Assemblies { [ItemProperty] string prefix; + + [ItemProperty] + bool? force64or32bit; string monoVersion = "Unknown"; Dictionary<string,string> envVars = new Dictionary<string, string> (); @@ -48,16 +51,21 @@ namespace MonoDevelop.Core.Assemblies internal MonoRuntimeInfo () { } - - public MonoRuntimeInfo (string prefix) + + public MonoRuntimeInfo (string prefix, bool? force64or32bit = null) { + this.force64or32bit = force64or32bit; this.prefix = prefix; Initialize (); } - + public string Prefix { get { return prefix; } } + + public bool? Force64or32bit { + get { return force64or32bit; } + } /// <summary> /// This string is strictly for displaying to the user or logging. It should never be used for version checks. @@ -70,7 +78,10 @@ namespace MonoDevelop.Core.Assemblies } public string DisplayName { - get { return "Mono " + MonoVersion + " (" + prefix + ")"; } + get { + return "Mono " + MonoVersion + " (" + prefix + ")" + + (force64or32bit.HasValue ? (force64or32bit.Value ? " (64 bit)" : " (32 bit)") : ""); + } } public bool IsValidRuntime { @@ -103,7 +114,7 @@ namespace MonoDevelop.Core.Assemblies StringWriter output = new StringWriter (); try { string monoPath = Path.Combine (prefix, "bin"); - monoPath = Path.Combine (monoPath, "mono"); + monoPath = Path.Combine (monoPath, force64or32bit.HasValue ? (force64or32bit.Value ? "mono64" : "mono32") : "mono"); ProcessStartInfo pi = new ProcessStartInfo (monoPath, "--version"); pi.UseShellExecute = false; pi.RedirectStandardOutput = true; diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/MonoTargetRuntime.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/MonoTargetRuntime.cs index 84fc117ddc..a939c98153 100644 --- a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/MonoTargetRuntime.cs +++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/MonoTargetRuntime.cs @@ -99,7 +99,7 @@ namespace MonoDevelop.Core.Assemblies public override string DisplayName { get { if (!IsRunning) - return base.DisplayName + " (" + Prefix + ")"; + return base.DisplayName + " (" + Prefix + ")" + (monoRuntimeInfo.Force64or32bit.HasValue ? monoRuntimeInfo.Force64or32bit.Value ? " (64bit)" : " (32bit)" : ""); else return base.DisplayName; } diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/MonoTargetRuntimeFactory.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/MonoTargetRuntimeFactory.cs index 777f3e5399..3a8cd189d9 100644 --- a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/MonoTargetRuntimeFactory.cs +++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/MonoTargetRuntimeFactory.cs @@ -32,19 +32,38 @@ using MonoDevelop.Core.Serialization; namespace MonoDevelop.Core.Assemblies { - class MonoTargetRuntimeFactory: ITargetRuntimeFactory + class MonoTargetRuntimeFactory : ITargetRuntimeFactory { static RuntimeCollection customRuntimes = new RuntimeCollection (); static string configFile = UserProfile.Current.ConfigDir.Combine ("mono-runtimes.xml"); - static string[] commonLinuxPrefixes = new string[] { "/usr", "/usr/local" }; - + static string [] commonLinuxPrefixes = new string [] { "/usr", "/usr/local" }; + static MonoTargetRuntimeFactory () { LoadRuntimes (); } - + const string MAC_FRAMEWORK_DIR = "/Library/Frameworks/Mono.framework/Versions"; + static IEnumerable<MonoRuntimeInfo> GetAllArchitecturesOfRuntimes (string dir) + { + var rinfo64 = new MonoRuntimeInfo (dir, true); + var rinfo32 = new MonoRuntimeInfo (dir, false); + if (rinfo64.IsValidRuntime && rinfo32.IsValidRuntime) { + yield return rinfo64; + yield return rinfo32; + } else if (rinfo64.IsValidRuntime) { + yield return rinfo64; + } else if (rinfo32.IsValidRuntime) { + yield return rinfo32; + } else { + var rinfo = new MonoRuntimeInfo (dir, null); + if (rinfo.IsValidRuntime) { + yield return rinfo; + } + } + } + public IEnumerable<TargetRuntime> CreateRuntimes () { MonoRuntimeInfo currentRuntime = MonoRuntimeInfo.FromCurrentRuntime (); @@ -54,34 +73,36 @@ namespace MonoDevelop.Core.Assemblies if (Platform.IsWindows) { string progs = Environment.GetFolderPath (Environment.SpecialFolder.ProgramFiles); foreach (string dir in Directory.GetDirectories (progs, "Mono*")) { - MonoRuntimeInfo info = new MonoRuntimeInfo (dir); - if (info.IsValidRuntime) + foreach(var info in GetAllArchitecturesOfRuntimes(dir)) yield return new MonoTargetRuntime (info); } } else if (Platform.IsMac) { if (!Directory.Exists (MAC_FRAMEWORK_DIR)) yield break; foreach (string dir in Directory.GetDirectories (MAC_FRAMEWORK_DIR)) { - if (dir.EndsWith ("/Current", StringComparison.Ordinal) || currentRuntime.Prefix == dir) + if (dir.EndsWith ("/Current", StringComparison.Ordinal)) continue; - MonoRuntimeInfo info = new MonoRuntimeInfo (dir); - if (info.IsValidRuntime) + foreach (var info in GetAllArchitecturesOfRuntimes (dir)) { + if (info.Prefix == currentRuntime.Prefix && info.Force64or32bit == currentRuntime.Force64or32bit) + continue; yield return new MonoTargetRuntime (info); + } } } else { foreach (string pref in commonLinuxPrefixes) { - if (currentRuntime != null && currentRuntime.Prefix == pref) - continue; - MonoRuntimeInfo info = new MonoRuntimeInfo (pref); - if (info.IsValidRuntime) { - // Clean up old registered runtimes - foreach (MonoRuntimeInfo ei in customRuntimes) { - if (ei.Prefix == info.Prefix) { - customRuntimes.Remove (ei); - break; + foreach (var info in GetAllArchitecturesOfRuntimes (pref)) { + if (info.IsValidRuntime) { + if (currentRuntime != null && currentRuntime.Prefix == pref && currentRuntime.Force64or32bit == info.Force64or32bit) + continue; + // Clean up old registered runtimes + foreach (MonoRuntimeInfo ei in customRuntimes) { + if (ei.Prefix == info.Prefix) { + customRuntimes.Remove (ei); + break; + } } + yield return new MonoTargetRuntime (info); } - yield return new MonoTargetRuntime (info); } } } diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.OptionPanels/MonoRuntimePanel.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.OptionPanels/MonoRuntimePanel.cs index fd70f5f9b0..511320179f 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.OptionPanels/MonoRuntimePanel.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.OptionPanels/MonoRuntimePanel.cs @@ -122,13 +122,13 @@ namespace MonoDevelop.Ide.Gui.OptionPanels return Environment.GetFolderPath (IntPtr.Size == 8? Environment.SpecialFolder.ProgramFilesX86 : Environment.SpecialFolder.ProgramFiles); } - + protected virtual void OnButtonAddClicked (object sender, System.EventArgs e) { var dlg = new SelectFolderDialog (GettextCatalog.GetString ("Select the mono installation prefix")) { TransientFor = this.Toplevel as Gtk.Window, }; - + //set a platform-dependent default folder for the dialog if possible if (Platform.IsWindows) { // ProgramFilesX86 is broken on 32-bit WinXP @@ -139,17 +139,32 @@ namespace MonoDevelop.Ide.Gui.OptionPanels if (System.IO.Directory.Exists ("/usr")) dlg.CurrentFolder = "/usr"; } - + if (!dlg.Run ()) return; - - var rinfo = new MonoRuntimeInfo (dlg.SelectedFile); - if (!rinfo.IsValidRuntime) { - MessageService.ShowError (GettextCatalog.GetString ("Mono runtime not found"), GettextCatalog.GetString ("Please provide a valid directory prefix where mono is installed (for example, /usr)")); - return; + + var rinfo64 = new MonoRuntimeInfo (dlg.SelectedFile, true); + var rinfo32 = new MonoRuntimeInfo (dlg.SelectedFile, false); + if (rinfo64.IsValidRuntime && rinfo32.IsValidRuntime) { + newInfos.Add (rinfo64); + store.AppendValues (rinfo64.DisplayName, rinfo64); + newInfos.Add (rinfo32); + store.AppendValues (rinfo32.DisplayName, rinfo32); + } else if (rinfo64.IsValidRuntime) { + newInfos.Add (rinfo64); + store.AppendValues (rinfo64.DisplayName, rinfo64); + } else if (rinfo32.IsValidRuntime) { + newInfos.Add (rinfo32); + store.AppendValues (rinfo32.DisplayName, rinfo32); + } else { + var rinfo = new MonoRuntimeInfo (dlg.SelectedFile, null); + if (rinfo.IsValidRuntime) { + newInfos.Add (rinfo); + store.AppendValues (rinfo.DisplayName, rinfo); + } else { + MessageService.ShowError (GettextCatalog.GetString ("Mono runtime not found"), GettextCatalog.GetString ("Please provide a valid directory prefix where mono is installed (for example, /usr)")); + } } - newInfos.Add (rinfo); - store.AppendValues (rinfo.DisplayName, rinfo); } protected virtual void OnButtonRemoveClicked (object sender, System.EventArgs e) |