Browse Source

Merge pull request #25803 from neikeq/yy

Windows: Default to system MSBuild and add VSCode hint path
Ignacio Etcheverry 6 years ago
parent
commit
9115c6ab15

+ 0 - 17
modules/mono/editor/GodotSharpTools/Build/BuildSystem.cs

@@ -18,8 +18,6 @@ namespace GodotSharpTools.Build
         [MethodImpl(MethodImplOptions.InternalCall)]
         [MethodImpl(MethodImplOptions.InternalCall)]
         private extern static string godot_icall_BuildInstance_get_MSBuildPath();
         private extern static string godot_icall_BuildInstance_get_MSBuildPath();
         [MethodImpl(MethodImplOptions.InternalCall)]
         [MethodImpl(MethodImplOptions.InternalCall)]
-        private extern static string godot_icall_BuildInstance_get_FrameworkPath();
-        [MethodImpl(MethodImplOptions.InternalCall)]
         private extern static string godot_icall_BuildInstance_get_MonoWindowsBinDir();
         private extern static string godot_icall_BuildInstance_get_MonoWindowsBinDir();
         [MethodImpl(MethodImplOptions.InternalCall)]
         [MethodImpl(MethodImplOptions.InternalCall)]
         private extern static bool godot_icall_BuildInstance_get_UsingMonoMSBuildOnWindows();
         private extern static bool godot_icall_BuildInstance_get_UsingMonoMSBuildOnWindows();
@@ -34,11 +32,6 @@ namespace GodotSharpTools.Build
             return msbuildPath;
             return msbuildPath;
         }
         }
 
 
-        private static string GetFrameworkPath()
-        {
-            return godot_icall_BuildInstance_get_FrameworkPath();
-        }
-
         private static string MonoWindowsBinDir
         private static string MonoWindowsBinDir
         {
         {
             get
             get
@@ -85,11 +78,6 @@ namespace GodotSharpTools.Build
             if (customProperties != null)
             if (customProperties != null)
                 customPropertiesList.AddRange(customProperties);
                 customPropertiesList.AddRange(customProperties);
 
 
-            string frameworkPath = GetFrameworkPath();
-
-            if (!string.IsNullOrEmpty(frameworkPath))
-                customPropertiesList.Add("FrameworkPathOverride=" + frameworkPath);
-
             string compilerArgs = BuildArguments(loggerAssemblyPath, loggerOutputDir, customPropertiesList);
             string compilerArgs = BuildArguments(loggerAssemblyPath, loggerOutputDir, customPropertiesList);
 
 
             ProcessStartInfo startInfo = new ProcessStartInfo(GetMSBuildPath(), compilerArgs);
             ProcessStartInfo startInfo = new ProcessStartInfo(GetMSBuildPath(), compilerArgs);
@@ -145,11 +133,6 @@ namespace GodotSharpTools.Build
             if (customProperties != null)
             if (customProperties != null)
                 customPropertiesList.AddRange(customProperties);
                 customPropertiesList.AddRange(customProperties);
 
 
-            string frameworkPath = GetFrameworkPath();
-
-            if (!string.IsNullOrEmpty(frameworkPath))
-                customPropertiesList.Add("FrameworkPathOverride=" + frameworkPath);
-
             string compilerArgs = BuildArguments(loggerAssemblyPath, loggerOutputDir, customPropertiesList);
             string compilerArgs = BuildArguments(loggerAssemblyPath, loggerOutputDir, customPropertiesList);
 
 
             ProcessStartInfo startInfo = new ProcessStartInfo(GetMSBuildPath(), compilerArgs);
             ProcessStartInfo startInfo = new ProcessStartInfo(GetMSBuildPath(), compilerArgs);

+ 19 - 29
modules/mono/editor/godotsharp_builds.cpp

@@ -100,22 +100,24 @@ MonoString *godot_icall_BuildInstance_get_MSBuildPath() {
 			if (msbuild_tools_path.empty() || !FileAccess::exists(msbuild_tools_path)) {
 			if (msbuild_tools_path.empty() || !FileAccess::exists(msbuild_tools_path)) {
 				// Try to search it again if it wasn't found last time or if it was removed from its location
 				// Try to search it again if it wasn't found last time or if it was removed from its location
 				msbuild_tools_path = MonoRegUtils::find_msbuild_tools_path();
 				msbuild_tools_path = MonoRegUtils::find_msbuild_tools_path();
-			}
-
-			if (msbuild_tools_path.length()) {
-				if (!msbuild_tools_path.ends_with("\\"))
-					msbuild_tools_path += "\\";
 
 
-				return GDMonoMarshal::mono_string_from_godot(msbuild_tools_path + "MSBuild.exe");
+				if (msbuild_tools_path.empty()) {
+					ERR_PRINTS("Cannot find executable for '" PROP_NAME_MSBUILD_VS "'. Tried with path: " + msbuild_tools_path);
+					return NULL;
+				}
 			}
 			}
 
 
-			print_verbose("Cannot find executable for '" PROP_NAME_MSBUILD_VS "'. Trying with '" PROP_NAME_MSBUILD_MONO "'...");
-		} // FALL THROUGH
+			if (!msbuild_tools_path.ends_with("\\"))
+				msbuild_tools_path += "\\";
+
+			return GDMonoMarshal::mono_string_from_godot(msbuild_tools_path + "MSBuild.exe");
+		} break;
 		case GodotSharpBuilds::MSBUILD_MONO: {
 		case GodotSharpBuilds::MSBUILD_MONO: {
 			String msbuild_path = GDMono::get_singleton()->get_mono_reg_info().bin_dir.plus_file("msbuild.bat");
 			String msbuild_path = GDMono::get_singleton()->get_mono_reg_info().bin_dir.plus_file("msbuild.bat");
 
 
 			if (!FileAccess::exists(msbuild_path)) {
 			if (!FileAccess::exists(msbuild_path)) {
-				WARN_PRINTS("Cannot find executable for '" PROP_NAME_MSBUILD_MONO "'. Tried with path: " + msbuild_path);
+				ERR_PRINTS("Cannot find executable for '" PROP_NAME_MSBUILD_MONO "'. Tried with path: " + msbuild_path);
+				return NULL;
 			}
 			}
 
 
 			return GDMonoMarshal::mono_string_from_godot(msbuild_path);
 			return GDMonoMarshal::mono_string_from_godot(msbuild_path);
@@ -124,7 +126,8 @@ MonoString *godot_icall_BuildInstance_get_MSBuildPath() {
 			String xbuild_path = GDMono::get_singleton()->get_mono_reg_info().bin_dir.plus_file("xbuild.bat");
 			String xbuild_path = GDMono::get_singleton()->get_mono_reg_info().bin_dir.plus_file("xbuild.bat");
 
 
 			if (!FileAccess::exists(xbuild_path)) {
 			if (!FileAccess::exists(xbuild_path)) {
-				WARN_PRINTS("Cannot find executable for '" PROP_NAME_XBUILD "'. Tried with path: " + xbuild_path);
+				ERR_PRINTS("Cannot find executable for '" PROP_NAME_XBUILD "'. Tried with path: " + xbuild_path);
+				return NULL;
 			}
 			}
 
 
 			return GDMonoMarshal::mono_string_from_godot(xbuild_path);
 			return GDMonoMarshal::mono_string_from_godot(xbuild_path);
@@ -144,7 +147,7 @@ MonoString *godot_icall_BuildInstance_get_MSBuildPath() {
 		}
 		}
 
 
 		if (xbuild_path.empty()) {
 		if (xbuild_path.empty()) {
-			WARN_PRINT("Cannot find binary for '" PROP_NAME_XBUILD "'");
+			ERR_PRINT("Cannot find binary for '" PROP_NAME_XBUILD "'");
 			return NULL;
 			return NULL;
 		}
 		}
 	} else {
 	} else {
@@ -154,7 +157,7 @@ MonoString *godot_icall_BuildInstance_get_MSBuildPath() {
 		}
 		}
 
 
 		if (msbuild_path.empty()) {
 		if (msbuild_path.empty()) {
-			WARN_PRINT("Cannot find binary for '" PROP_NAME_MSBUILD_MONO "'");
+			ERR_PRINT("Cannot find binary for '" PROP_NAME_MSBUILD_MONO "'");
 			return NULL;
 			return NULL;
 		}
 		}
 	}
 	}
@@ -168,22 +171,6 @@ MonoString *godot_icall_BuildInstance_get_MSBuildPath() {
 #endif
 #endif
 }
 }
 
 
-MonoString *godot_icall_BuildInstance_get_FrameworkPath() {
-
-#if defined(WINDOWS_ENABLED)
-	const MonoRegInfo &mono_reg_info = GDMono::get_singleton()->get_mono_reg_info();
-	if (mono_reg_info.assembly_dir.length()) {
-		String framework_path = path_join(mono_reg_info.assembly_dir, "mono", "4.5");
-		return GDMonoMarshal::mono_string_from_godot(framework_path);
-	}
-
-	ERR_EXPLAIN("Cannot find Mono's assemblies directory in the registry");
-	ERR_FAIL_V(NULL);
-#else
-	return NULL;
-#endif
-}
-
 MonoString *godot_icall_BuildInstance_get_MonoWindowsBinDir() {
 MonoString *godot_icall_BuildInstance_get_MonoWindowsBinDir() {
 
 
 #if defined(WINDOWS_ENABLED)
 #if defined(WINDOWS_ENABLED)
@@ -216,7 +203,6 @@ void GodotSharpBuilds::register_internal_calls() {
 
 
 	mono_add_internal_call("GodotSharpTools.Build.BuildSystem::godot_icall_BuildInstance_ExitCallback", (void *)godot_icall_BuildInstance_ExitCallback);
 	mono_add_internal_call("GodotSharpTools.Build.BuildSystem::godot_icall_BuildInstance_ExitCallback", (void *)godot_icall_BuildInstance_ExitCallback);
 	mono_add_internal_call("GodotSharpTools.Build.BuildInstance::godot_icall_BuildInstance_get_MSBuildPath", (void *)godot_icall_BuildInstance_get_MSBuildPath);
 	mono_add_internal_call("GodotSharpTools.Build.BuildInstance::godot_icall_BuildInstance_get_MSBuildPath", (void *)godot_icall_BuildInstance_get_MSBuildPath);
-	mono_add_internal_call("GodotSharpTools.Build.BuildInstance::godot_icall_BuildInstance_get_FrameworkPath", (void *)godot_icall_BuildInstance_get_FrameworkPath);
 	mono_add_internal_call("GodotSharpTools.Build.BuildInstance::godot_icall_BuildInstance_get_MonoWindowsBinDir", (void *)godot_icall_BuildInstance_get_MonoWindowsBinDir);
 	mono_add_internal_call("GodotSharpTools.Build.BuildInstance::godot_icall_BuildInstance_get_MonoWindowsBinDir", (void *)godot_icall_BuildInstance_get_MonoWindowsBinDir);
 	mono_add_internal_call("GodotSharpTools.Build.BuildInstance::godot_icall_BuildInstance_get_UsingMonoMSBuildOnWindows", (void *)godot_icall_BuildInstance_get_UsingMonoMSBuildOnWindows);
 	mono_add_internal_call("GodotSharpTools.Build.BuildInstance::godot_icall_BuildInstance_get_UsingMonoMSBuildOnWindows", (void *)godot_icall_BuildInstance_get_UsingMonoMSBuildOnWindows);
 }
 }
@@ -459,7 +445,11 @@ GodotSharpBuilds::GodotSharpBuilds() {
 	// Build tool settings
 	// Build tool settings
 	EditorSettings *ed_settings = EditorSettings::get_singleton();
 	EditorSettings *ed_settings = EditorSettings::get_singleton();
 
 
+#ifdef WINDOWS_ENABLED
+	EDITOR_DEF("mono/builds/build_tool", MSBUILD_VS);
+#else
 	EDITOR_DEF("mono/builds/build_tool", MSBUILD_MONO);
 	EDITOR_DEF("mono/builds/build_tool", MSBUILD_MONO);
+#endif
 
 
 	ed_settings->add_property_hint(PropertyInfo(Variant::INT, "mono/builds/build_tool", PROPERTY_HINT_ENUM,
 	ed_settings->add_property_hint(PropertyInfo(Variant::INT, "mono/builds/build_tool", PROPERTY_HINT_ENUM,
 			PROP_NAME_MSBUILD_MONO
 			PROP_NAME_MSBUILD_MONO

+ 41 - 10
modules/mono/editor/godotsharp_editor.cpp

@@ -272,19 +272,50 @@ Error GodotSharpEditor::open_in_external_editor(const Ref<Script> &p_script, int
 			static String vscode_path;
 			static String vscode_path;
 
 
 			if (vscode_path.empty() || !FileAccess::exists(vscode_path)) {
 			if (vscode_path.empty() || !FileAccess::exists(vscode_path)) {
-				static List<String> vscode_name;
-				vscode_name.push_back("code");
-				vscode_name.push_back("code-oss");
-				vscode_name.push_back("vscode");
-				vscode_name.push_back("vscode-oss");
-				vscode_name.push_back("visual-studio-code");
-				vscode_name.push_back("visual-studio-code-oss");
 				// Try to search it again if it wasn't found last time or if it was removed from its location
 				// Try to search it again if it wasn't found last time or if it was removed from its location
-				for (int i = 0; i < vscode_name.size(); i++) {
-					vscode_path = path_which(vscode_name[i]);
-					if (!vscode_path.empty() || FileAccess::exists(vscode_path))
+				bool found = false;
+
+				// TODO: Use initializer lists once C++11 is allowed
+
+				// Try with hint paths
+				static Vector<String> hint_paths;
+#ifdef WINDOWS_ENABLED
+				if (hint_paths.empty()) {
+					hint_paths.push_back(OS::get_singleton()->get_environment("ProgramFiles") + "\\Microsoft VS Code\\Code.exe");
+					if (sizeof(size_t) == 8) {
+						hint_paths.push_back(OS::get_singleton()->get_environment("ProgramFiles(x86)") + "\\Microsoft VS Code\\Code.exe");
+					}
+				}
+#endif
+				for (int i = 0; i < hint_paths.size(); i++) {
+					vscode_path = hint_paths[i];
+					if (FileAccess::exists(vscode_path)) {
+						found = true;
 						break;
 						break;
+					}
+				}
+
+				if (!found) {
+					static Vector<String> vscode_names;
+					if (vscode_names.empty()) {
+						vscode_names.push_back("code");
+						vscode_names.push_back("code-oss");
+						vscode_names.push_back("vscode");
+						vscode_names.push_back("vscode-oss");
+						vscode_names.push_back("visual-studio-code");
+						vscode_names.push_back("visual-studio-code-oss");
+					}
+					for (int i = 0; i < vscode_names.size(); i++) {
+						vscode_path = path_which(vscode_names[i]);
+						if (!vscode_path.empty()) {
+							found = true;
+							break;
+						}
+					}
 				}
 				}
+
+				if (!found)
+					vscode_path.clear(); // Not found, clear so next time the empty() check is enough
 			}
 			}
 
 
 			List<String> args;
 			List<String> args;