Browse Source

Add some mono root hint dirs for OSX

Fixes #13355
Ignacio Etcheverry 7 years ago
parent
commit
61426464ea
2 changed files with 37 additions and 8 deletions
  1. 13 8
      modules/mono/editor/godotsharp_builds.cpp
  2. 24 0
      modules/mono/mono_gd/gd_mono.cpp

+ 13 - 8
modules/mono/editor/godotsharp_builds.cpp

@@ -30,6 +30,7 @@
 
 
 #include "godotsharp_builds.h"
 #include "godotsharp_builds.h"
 
 
+#include "core/vector.h"
 #include "main/main.h"
 #include "main/main.h"
 
 
 #include "../godotsharp_dirs.h"
 #include "../godotsharp_dirs.h"
@@ -50,6 +51,16 @@ void godot_icall_BuildInstance_ExitCallback(MonoString *p_solution, MonoString *
 	GodotSharpBuilds::get_singleton()->build_exit_callback(MonoBuildInfo(solution, config), p_exit_code);
 	GodotSharpBuilds::get_singleton()->build_exit_callback(MonoBuildInfo(solution, config), p_exit_code);
 }
 }
 
 
+static Vector<const char *> _get_msbuild_hint_dirs() {
+	Vector<const char *> ret;
+#ifdef OSX_ENABLED
+	ret.push_back("/Library/Frameworks/Mono.framework/Versions/Current/bin/");
+	ret.push_back("/usr/local/var/homebrew/linked/mono/bin/");
+#endif
+	ret.push_back("/opt/novell/mono/bin/");
+	return ret;
+}
+
 #ifdef UNIX_ENABLED
 #ifdef UNIX_ENABLED
 String _find_build_engine_on_unix(const String &p_name) {
 String _find_build_engine_on_unix(const String &p_name) {
 	String ret = path_which(p_name);
 	String ret = path_which(p_name);
@@ -61,15 +72,9 @@ String _find_build_engine_on_unix(const String &p_name) {
 	if (ret_fallback.length())
 	if (ret_fallback.length())
 		return ret_fallback;
 		return ret_fallback;
 
 
-	const char *locations[] = {
-#ifdef OSX_ENABLED
-		"/Library/Frameworks/Mono.framework/Versions/Current/bin/",
-		"/usr/local/var/homebrew/linked/mono/bin/",
-#endif
-		"/opt/novell/mono/bin/"
-	};
+	static Vector<const char *> locations = _get_msbuild_hint_dirs();
 
 
-	for (int i = 0; i < sizeof(locations) / sizeof(const char *); i++) {
+	for (int i = 0; i < locations.size(); i++) {
 		String hint_path = locations[i] + p_name;
 		String hint_path = locations[i] + p_name;
 
 
 		if (FileAccess::exists(hint_path)) {
 		if (FileAccess::exists(hint_path)) {

+ 24 - 0
modules/mono/mono_gd/gd_mono.cpp

@@ -177,6 +177,30 @@ void GDMono::initialize() {
 
 
 	mono_set_dirs(assembly_dir.length() ? assembly_dir.get_data() : NULL,
 	mono_set_dirs(assembly_dir.length() ? assembly_dir.get_data() : NULL,
 			config_dir.length() ? config_dir.get_data() : NULL);
 			config_dir.length() ? config_dir.get_data() : NULL);
+#elif OSX_ENABLED
+	mono_set_dirs(NULL, NULL);
+
+	{
+		const char *assembly_rootdir = mono_assembly_getrootdir();
+		const char *config_dir = mono_get_config_dir();
+
+		if (!assembly_rootdir || !config_dir || !DirAccess::exists(assembly_rootdir) || !DirAccess::exists(config_dir)) {
+			Vector<const char *> locations;
+			locations.push_back("/Library/Frameworks/Mono.framework/Versions/Current/");
+			locations.push_back("/usr/local/var/homebrew/linked/mono/");
+
+			for (int i = 0; i < locations.size(); i++) {
+				String hint_assembly_rootdir = path_join(locations[i], "lib");
+				String hint_mscorlib_path = path_join(hint_assembly_rootdir, "mono", "4.5", "mscorlib.dll");
+				String hint_config_dir = path_join(locations[i], "etc");
+
+				if (FileAccess::exists(hint_mscorlib_path) && DirAccess::exists(hint_config_dir)) {
+					mono_set_dirs(hint_assembly_rootdir.utf8().get_data(), hint_config_dir.utf8().get_data());
+					break;
+				}
+			}
+		}
+	}
 #else
 #else
 	mono_set_dirs(NULL, NULL);
 	mono_set_dirs(NULL, NULL);
 #endif
 #endif