public void _ExportBeginImpl(string[] features, bool isDebug, string path, int flags) { // TODO Right now there is no way to stop the export process with an error if (File.Exists(GodotSharpDirs.ProjectSlnPath)) { string buildConfig = isDebug ? "Debug" : "Release"; string scriptsMetadataPath = Path.Combine(GodotSharpDirs.ResMetadataDir, $"scripts_metadata.{(isDebug ? "debug" : "release")}"); CSharpProject.GenerateScriptsMetadata(GodotSharpDirs.ProjectCsProjPath, scriptsMetadataPath); AddFile(scriptsMetadataPath, scriptsMetadataPath); // Turn export features into defines var godotDefines = features; if (!GodotSharpBuilds.BuildProjectBlocking(buildConfig, godotDefines)) { GD.PushError("Failed to build project"); return; } // Add dependency assemblies var dependencies = new Godot.Collections.Dictionary <string, string>(); var projectDllName = (string)ProjectSettings.GetSetting("application/config/name"); if (projectDllName.Empty()) { projectDllName = "UnnamedProject"; } string projectDllSrcDir = Path.Combine(GodotSharpDirs.ResTempAssembliesBaseDir, buildConfig); string projectDllSrcPath = Path.Combine(projectDllSrcDir, $"{projectDllName}.dll"); dependencies[projectDllName] = projectDllSrcPath; { string templatesDir = Internal.FullTemplatesDir; string androidBclDir = Path.Combine(templatesDir, "android-bcl"); string customLibDir = features.Contains("Android") && Directory.Exists(androidBclDir) ? androidBclDir : string.Empty; GetExportedAssemblyDependencies(projectDllName, projectDllSrcPath, buildConfig, customLibDir, dependencies); } string apiConfig = isDebug ? "Debug" : "Release"; string resAssembliesDir = Path.Combine(GodotSharpDirs.ResAssembliesBaseDir, apiConfig); foreach (var dependency in dependencies) { string dependSrcPath = dependency.Value; string dependDstPath = Path.Combine(resAssembliesDir, dependSrcPath.GetFile()); AddFile(dependSrcPath, dependDstPath); } } // Mono specific export template extras (data dir) ExportDataDirectory(features, isDebug, path); }
private void _MakeApiSolutionsIfNeededImpl() { // If the project has a solution and C# project make sure the API assemblies are present and up to date string api_config = "Debug"; string resAssembliesDir = Path.Combine(GodotSharpDirs.ResAssembliesBaseDir, api_config); if (!File.Exists(Path.Combine(resAssembliesDir, $"{ApiAssemblyNames.Core}.dll")) || Internal.MetadataIsApiAssemblyInvalidated(ApiAssemblyType.Core)) { if (!GodotSharpBuilds.MakeApiAssembly(ApiAssemblyType.Core, api_config)) { return; } } if (!File.Exists(Path.Combine(resAssembliesDir, $"{ApiAssemblyNames.Editor}.dll")) || Internal.MetadataIsApiAssemblyInvalidated(ApiAssemblyType.Editor)) { if (!GodotSharpBuilds.MakeApiAssembly(ApiAssemblyType.Editor, api_config)) { return; // Redundant? I don't think so! } } }
public void StopBuild() { if (!BuildExited) { throw new InvalidOperationException("Build is not in progress"); } GodotSharpBuilds.StopBuild(this); }
public void RestartBuild() { if (!BuildExited) { throw new InvalidOperationException("Build already started"); } GodotSharpBuilds.RestartBuild(this); }
public void BuildProjectPressed() { if (!File.Exists(GodotSharpDirs.ProjectSlnPath)) { return; // No solution to build } string editorScriptsMetadataPath = Path.Combine(GodotSharpDirs.ResMetadataDir, "scripts_metadata.editor"); string playerScriptsMetadataPath = Path.Combine(GodotSharpDirs.ResMetadataDir, "scripts_metadata.editor_player"); CSharpProject.GenerateScriptsMetadata(GodotSharpDirs.ProjectCsProjPath, editorScriptsMetadataPath); if (File.Exists(editorScriptsMetadataPath)) { try { File.Copy(editorScriptsMetadataPath, playerScriptsMetadataPath); } catch (IOException e) { GD.PushError($"Failed to copy scripts metadata file. Exception message: {e.Message}"); return; } } var godotDefines = new[] { OS.GetName(), Internal.GodotIs32Bits() ? "32" : "64" }; bool buildSuccess = GodotSharpBuilds.BuildProjectBlocking("Tools", godotDefines); if (!buildSuccess) { return; } // Notify running game for hot-reload Internal.ScriptEditorDebuggerReloadScripts(); // Hot-reload in the editor GodotSharpEditor.Instance.GetNode <HotReloadAssemblyWatcher>("HotReloadAssemblyWatcher").RestartTimer(); if (Internal.IsAssembliesReloadingNeeded()) { Internal.ReloadAssemblies(softReload: false); } }
public override void EnablePlugin() { base.EnablePlugin(); if (Instance != null) { throw new InvalidOperationException(); } Instance = this; var editorInterface = GetEditorInterface(); var editorBaseControl = editorInterface.GetBaseControl(); editorSettings = editorInterface.GetEditorSettings(); errorDialog = new AcceptDialog(); editorBaseControl.AddChild(errorDialog); MonoBottomPanel = new MonoBottomPanel(); bottomPanelBtn = AddControlToBottomPanel(MonoBottomPanel, "Mono".TTR()); AddChild(new HotReloadAssemblyWatcher { Name = "HotReloadAssemblyWatcher" }); menuPopup = new PopupMenu(); menuPopup.Hide(); menuPopup.SetAsToplevel(true); AddToolSubmenuItem("Mono", menuPopup); // TODO: Remove or edit this info dialog once Mono support is no longer in alpha { menuPopup.AddItem("About C# support".TTR(), (int)MenuOptions.AboutCSharp); aboutDialog = new AcceptDialog(); editorBaseControl.AddChild(aboutDialog); aboutDialog.WindowTitle = "Important: C# support is not feature-complete"; // We don't use DialogText as the default AcceptDialog Label doesn't play well with the TextureRect and CheckBox // we'll add. Instead we add containers and a new autowrapped Label inside. // Main VBoxContainer (icon + label on top, checkbox at bottom) var aboutVBox = new VBoxContainer(); aboutDialog.AddChild(aboutVBox); // HBoxContainer for icon + label var aboutHBox = new HBoxContainer(); aboutVBox.AddChild(aboutHBox); var aboutIcon = new TextureRect(); aboutIcon.Texture = aboutIcon.GetIcon("NodeWarning", "EditorIcons"); aboutHBox.AddChild(aboutIcon); var aboutLabel = new Label(); aboutHBox.AddChild(aboutLabel); aboutLabel.RectMinSize = new Vector2(600, 150) * EditorScale; aboutLabel.SizeFlagsVertical = (int)Control.SizeFlags.ExpandFill; aboutLabel.Autowrap = true; aboutLabel.Text = "C# support in Godot Engine is in late alpha stage and, while already usable, " + "it is not meant for use in production.\n\n" + "Projects can be exported to Linux, macOS and Windows, but not yet to mobile or web platforms. " + "Bugs and usability issues will be addressed gradually over future releases, " + "potentially including compatibility breaking changes as new features are implemented for a better overall C# experience.\n\n" + "If you experience issues with this Mono build, please report them on Godot's issue tracker with details about your system, MSBuild version, IDE, etc.:\n\n" + " https://github.com/godotengine/godot/issues\n\n" + "Your critical feedback at this stage will play a great role in shaping the C# support in future releases, so thank you!"; EditorDef("mono/editor/show_info_on_start", true); // CheckBox in main container aboutDialogCheckBox = new CheckBox { Text = "Show this warning when starting the editor" }; aboutDialogCheckBox.Connect("toggled", this, nameof(_ToggleAboutDialogOnStart)); aboutVBox.AddChild(aboutDialogCheckBox); } if (File.Exists(GodotSharpDirs.ProjectSlnPath) && File.Exists(GodotSharpDirs.ProjectCsProjPath)) { // Make sure the existing project has Api assembly references configured correctly CSharpProject.FixApiHintPath(GodotSharpDirs.ProjectCsProjPath); } else { bottomPanelBtn.Hide(); menuPopup.AddItem("Create C# solution".TTR(), (int)MenuOptions.CreateSln); } menuPopup.Connect("id_pressed", this, nameof(_MenuOptionPressed)); var buildButton = new ToolButton { Text = "Build", HintTooltip = "Build solution", FocusMode = Control.FocusModeEnum.None }; buildButton.Connect("pressed", this, nameof(_BuildSolutionPressed)); AddControlToContainer(CustomControlContainer.Toolbar, buildButton); // External editor settings EditorDef("mono/editor/external_editor", ExternalEditor.None); string settingsHintStr = "Disabled"; if (OS.IsWindows()) { settingsHintStr += $",MonoDevelop:{(int) ExternalEditor.MonoDevelop}" + $",Visual Studio Code:{(int) ExternalEditor.VsCode}"; } else if (OS.IsOSX()) { settingsHintStr += $",Visual Studio:{(int) ExternalEditor.VisualStudioForMac}" + $",MonoDevelop:{(int) ExternalEditor.MonoDevelop}" + $",Visual Studio Code:{(int) ExternalEditor.VsCode}"; } else if (OS.IsUnix()) { settingsHintStr += $",MonoDevelop:{(int) ExternalEditor.MonoDevelop}" + $",Visual Studio Code:{(int) ExternalEditor.VsCode}"; } editorSettings.AddPropertyInfo(new Godot.Collections.Dictionary { ["type"] = Variant.Type.Int, ["name"] = "mono/editor/external_editor", ["hint"] = PropertyHint.Enum, ["hint_string"] = settingsHintStr }); // Export plugin var exportPlugin = new GodotSharpExport(); AddExportPlugin(exportPlugin); exportPluginWeak = WeakRef(exportPlugin); GodotSharpBuilds.Initialize(); }
public override bool Build() { return(GodotSharpBuilds.EditorBuildCallback()); }
private bool CreateProjectSolution() { using (var pr = new EditorProgress("create_csharp_solution", "Generating solution...", 2)) // TTR("Generating solution...") { pr.Step("Generating C# project..."); // TTR("Generating C# project...") string resourceDir = ProjectSettings.GlobalizePath("res://"); string path = resourceDir; string name = (string)ProjectSettings.GetSetting("application/config/name"); if (name.Empty()) { name = "UnnamedProject"; } string guid = CSharpProject.GenerateGameProject(path, name); if (guid.Length > 0) { var solution = new DotNetSolution(name) { DirectoryPath = path }; var projectInfo = new DotNetSolution.ProjectInfo { Guid = guid, PathRelativeToSolution = name + ".csproj", Configs = new List <string> { "Debug", "Release", "Tools" } }; solution.AddNewProject(name, projectInfo); try { solution.Save(); } catch (IOException e) { ShowErrorDialog($"Failed to save solution. Exception message: {e.Message}"); // TTR return(false); } string apiConfig = "Debug"; if (!GodotSharpBuilds.MakeApiAssembly(ApiAssemblyType.Core, apiConfig)) { return(false); } if (!GodotSharpBuilds.MakeApiAssembly(ApiAssemblyType.Editor, apiConfig)) { return(false); } pr.Step("Done"); // TTR("Done") // Here, after all calls to progress_task_step CallDeferred(nameof(_RemoveCreateSlnMenuOption)); } else { ShowErrorDialog("Failed to create C# project."); // TTR } return(true); } }