Merge pull request #25803 from neikeq/yy

Windows: Default to system MSBuild and add VSCode hint path
This commit is contained in:
Ignacio Etcheverry 2019-02-11 22:25:11 +01:00 committed by GitHub
commit 9115c6ab15
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 61 additions and 57 deletions

View File

@ -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);

View File

@ -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.empty()) {
ERR_PRINTS("Cannot find executable for '" PROP_NAME_MSBUILD_VS "'. Tried with path: " + msbuild_tools_path);
return NULL;
}
} }
if (msbuild_tools_path.length()) {
if (!msbuild_tools_path.ends_with("\\")) if (!msbuild_tools_path.ends_with("\\"))
msbuild_tools_path += "\\"; msbuild_tools_path += "\\";
return GDMonoMarshal::mono_string_from_godot(msbuild_tools_path + "MSBuild.exe"); return GDMonoMarshal::mono_string_from_godot(msbuild_tools_path + "MSBuild.exe");
} } break;
print_verbose("Cannot find executable for '" PROP_NAME_MSBUILD_VS "'. Trying with '" PROP_NAME_MSBUILD_MONO "'...");
} // FALL THROUGH
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

View File

@ -272,21 +272,52 @@ 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++) { bool found = false;
vscode_path = path_which(vscode_name[i]);
if (!vscode_path.empty() || FileAccess::exists(vscode_path)) // 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;
#ifdef OSX_ENABLED #ifdef OSX_ENABLED