diff --git a/Source/Editor/Cooker/GameCooker.cpp b/Source/Editor/Cooker/GameCooker.cpp index 52550128e..894f4ed2d 100644 --- a/Source/Editor/Cooker/GameCooker.cpp +++ b/Source/Editor/Cooker/GameCooker.cpp @@ -456,18 +456,18 @@ PlatformTools* GameCooker::GetTools(BuildPlatform platform) return result; } -void GameCooker::Build(BuildPlatform platform, BuildConfiguration configuration, const StringView& outputPath, BuildOptions options, const Array& customDefines, const StringView& preset, const StringView& presetTarget) +bool GameCooker::Build(BuildPlatform platform, BuildConfiguration configuration, const StringView& outputPath, BuildOptions options, const Array& customDefines, const StringView& preset, const StringView& presetTarget) { if (IsRunning()) { LOG(Warning, "Cannot start a build. Already running."); - return; + return true; } PlatformTools* tools = GetTools(platform); if (tools == nullptr) { LOG(Error, "Build platform {0} is not supported.", ::ToString(platform)); - return; + return true; } // Setup @@ -493,7 +493,7 @@ void GameCooker::Build(BuildPlatform platform, BuildConfiguration configuration, if (FileSystem::CreateDirectory(data.CacheDirectory)) { LOG(Error, "Cannot setup game building cache directory."); - return; + return true; } } @@ -510,13 +510,15 @@ void GameCooker::Build(BuildPlatform platform, BuildConfiguration configuration, { GameCookerImpl::IsRunning = false; LOG(Error, "Failed to start a build thread."); - return; + return true; } } else { ThreadCond.NotifyOne(); } + + return false; } void GameCooker::Cancel(bool waitForEnd) diff --git a/Source/Editor/Cooker/GameCooker.h b/Source/Editor/Cooker/GameCooker.h index 5c2b89787..f328c8719 100644 --- a/Source/Editor/Cooker/GameCooker.h +++ b/Source/Editor/Cooker/GameCooker.h @@ -82,7 +82,8 @@ public: /// The list of custom defines passed to the build tool when compiling project scripts. Can be used in build scripts for configuration (Configuration.CustomDefines). /// The name of build preset used for cooking (can be used by editor and game plugins). /// The name of build preset target used for cooking (can be used by editor and game plugins). - API_FUNCTION() static void Build(BuildPlatform platform, BuildConfiguration configuration, const StringView& outputPath, BuildOptions options, const Array& customDefines, const StringView& preset = StringView::Empty, const StringView& presetTarget = StringView::Empty); + /// True if failed to start the build, otherwise false. + API_FUNCTION() static bool Build(BuildPlatform platform, BuildConfiguration configuration, const StringView& outputPath, BuildOptions options, const Array& customDefines, const StringView& preset = StringView::Empty, const StringView& presetTarget = StringView::Empty); /// /// Sends a cancel event to the game building service. diff --git a/Source/Editor/Editor.cs b/Source/Editor/Editor.cs index 266d8235f..2f332e1d7 100644 --- a/Source/Editor/Editor.cs +++ b/Source/Editor/Editor.cs @@ -1395,7 +1395,7 @@ namespace FlaxEditor internal void BuildCommand(string arg) { if (TryBuildCommand(arg)) - Engine.RequestExit(); + Engine.RequestExit(1); } private bool TryBuildCommand(string arg) diff --git a/Source/Editor/Windows/GameCookerWindow.cs b/Source/Editor/Windows/GameCookerWindow.cs index 2ef9c05cf..2c2fafbdf 100644 --- a/Source/Editor/Windows/GameCookerWindow.cs +++ b/Source/Editor/Windows/GameCookerWindow.cs @@ -1006,7 +1006,12 @@ namespace FlaxEditor.Windows _preBuildAction = target.PreBuildAction; _postBuildAction = target.PostBuildAction; - GameCooker.Build(target.Platform, target.Mode, target.Output, item.Options, target.CustomDefines, item.PresetName, target.Name); + bool failed = GameCooker.Build(target.Platform, target.Mode, target.Output, item.Options, target.CustomDefines, item.PresetName, target.Name); + if (failed && _exitOnBuildEnd) + { + _exitOnBuildEnd = false; + Engine.RequestExit(1); + } } else if (_exitOnBuildEnd) { diff --git a/Source/Engine/Engine/Engine.cpp b/Source/Engine/Engine/Engine.cpp index fe7541adb..0754c8456 100644 --- a/Source/Engine/Engine/Engine.cpp +++ b/Source/Engine/Engine/Engine.cpp @@ -241,6 +241,8 @@ void Engine::Exit(int32 exitCode) void Engine::RequestExit(int32 exitCode) { + if (Globals::IsRequestingExit) + return; #if USE_EDITOR // Send to editor (will leave play mode if need to) if (Editor::Managed->OnAppExit())