From a72ac91ebc514b0a7d7210a757034653a039e5b5 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Tue, 5 Oct 2021 15:54:55 +0200 Subject: [PATCH] Fix support for codeless game projects --- .../Cooker/Steps/CompileScriptsStep.cpp | 21 ++++++++++++------- Source/Editor/Scripting/ScriptsBuilder.cpp | 10 ++++----- Source/Editor/Scripting/ScriptsBuilder.h | 3 ++- Source/Engine/Scripting/Scripting.cpp | 3 ++- 4 files changed, 22 insertions(+), 15 deletions(-) diff --git a/Source/Editor/Cooker/Steps/CompileScriptsStep.cpp b/Source/Editor/Cooker/Steps/CompileScriptsStep.cpp index 5969dd32b..23f7f545e 100644 --- a/Source/Editor/Cooker/Steps/CompileScriptsStep.cpp +++ b/Source/Editor/Cooker/Steps/CompileScriptsStep.cpp @@ -12,6 +12,7 @@ #include "Editor/Cooker/PlatformTools.h" #include "Editor/Editor.h" #include "Editor/ProjectInfo.h" +#include "Engine/Engine/Globals.h" bool CompileScriptsStep::DeployBinaries(CookingData& data, const String& path, const String& projectFolderPath) { @@ -136,12 +137,8 @@ bool CompileScriptsStep::Perform(CookingData& data) data.StepProgress(TEXT("Compiling game scripts"), 0); const ProjectInfo* project = Editor::Project; - const String& target = project->GameTarget; - if (target.IsEmpty()) - { - LOG(Error, "Empty GameTarget in project."); - return true; - } + String target = project->GameTarget; + StringView workingDir; const Char *platform, *architecture, *configuration = ::ToString(data.Configuration); switch (data.Platform) { @@ -189,6 +186,15 @@ bool CompileScriptsStep::Perform(CookingData& data) LOG(Error, "Unknown or unsupported build platform."); return true; } + String targetBuildInfo = project->ProjectFolderPath / TEXT("Binaries") / target / platform / architecture / configuration / target + TEXT(".Build.json"); + if (target.IsEmpty()) + { + // Fallback to engine-only if game has no code + LOG(Warning, "Empty GameTarget in project."); + target = TEXT("FlaxGame"); + workingDir = Globals::StartupFolder; + targetBuildInfo = Globals::StartupFolder / TEXT("Source/Platforms") / platform / TEXT("Binaries") / TEXT("Game") / architecture / configuration / target + TEXT(".Build.json"); + } _extensionsToSkip.Clear(); _extensionsToSkip.Add(TEXT(".exp")); _extensionsToSkip.Add(TEXT(".ilk")); @@ -229,7 +235,7 @@ bool CompileScriptsStep::Perform(CookingData& data) args += TEXT(" -D"); args += define; } - if (ScriptsBuilder::RunBuildTool(args)) + if (ScriptsBuilder::RunBuildTool(args, workingDir)) { data.Error(TEXT("Failed to compile game scripts.")); return true; @@ -243,7 +249,6 @@ bool CompileScriptsStep::Perform(CookingData& data) data.StepProgress(TEXT("Exporting binaries"), 0.8f); // Deploy binary modules - const String targetBuildInfo = project->ProjectFolderPath / TEXT("Binaries") / project->GameTarget / platform / architecture / configuration / target + TEXT(".Build.json"); if (DeployBinaries(data, targetBuildInfo, project->ProjectFolderPath)) return true; diff --git a/Source/Editor/Scripting/ScriptsBuilder.cpp b/Source/Editor/Scripting/ScriptsBuilder.cpp index af12d8708..3c9ee4315 100644 --- a/Source/Editor/Scripting/ScriptsBuilder.cpp +++ b/Source/Editor/Scripting/ScriptsBuilder.cpp @@ -211,7 +211,7 @@ void ScriptsBuilder::Compile() _isCompileRequested = true; } -bool ScriptsBuilder::RunBuildTool(const StringView& args) +bool ScriptsBuilder::RunBuildTool(const StringView& args, const StringView& workingDir) { PROFILE_CPU(); const String buildToolPath = Globals::StartupFolder / TEXT("Binaries/Tools/Flax.Build.exe"); @@ -242,7 +242,7 @@ bool ScriptsBuilder::RunBuildTool(const StringView& args) // TODO: Set env var for the mono MONO_GC_PARAMS=nursery-size64m to boost build performance -> profile it // Call build tool - const int32 result = Platform::RunProcess(StringView(*cmdLine, cmdLine.Length()), StringView::Empty); + const int32 result = Platform::RunProcess(StringView(*cmdLine, cmdLine.Length()), workingDir); return result != 0; } @@ -357,7 +357,7 @@ void ScriptsBuilder::GetBinariesConfiguration(const Char*& target, const Char*& else { target = TEXT(""); - LOG(Error, "Missing editor/game targets in project. Please specify EditorTarget and GameTarget properties in .flaxproj file."); + LOG(Warning, "Missing editor/game targets in project. Please specify EditorTarget and GameTarget properties in .flaxproj file."); } #if PLATFORM_WINDOWS @@ -395,7 +395,7 @@ bool ScriptsBuilderImpl::compileGameScriptsAsyncInner() // Call compilation const Char *target, *platform, *architecture, *configuration; ScriptsBuilder::GetBinariesConfiguration(target, platform, architecture, configuration); - if (!target) + if (StringUtils::Length(target) == 0) { LOG(Info, "Missing EditorTarget in project. Skipping compilation."); CallEvent(EventType::ReloadCalled); @@ -580,7 +580,7 @@ bool ScriptsBuilderService::Init() // Remove any remaining files from previous Editor run hot-reloads const Char *target, *platform, *architecture, *configuration; ScriptsBuilder::GetBinariesConfiguration(target, platform, architecture, configuration); - if (target) + if (StringUtils::Length(target) != 0) { const String targetOutput = Globals::ProjectFolder / TEXT("Binaries") / target / platform / architecture / configuration; Array files; diff --git a/Source/Editor/Scripting/ScriptsBuilder.h b/Source/Editor/Scripting/ScriptsBuilder.h index 79a3706a2..d72f4bcb3 100644 --- a/Source/Editor/Scripting/ScriptsBuilder.h +++ b/Source/Editor/Scripting/ScriptsBuilder.h @@ -97,8 +97,9 @@ public: /// Invokes the Flax.Build tool in the current project workspace and waits for the process end (blocking). Prints the build tool output to the log. Can be invoked from any thread. /// /// The Flax.Build tool invocation arguments. + /// The custom working directory. Use empty or null to execute build tool in the project folder. /// True if failed, otherwise false. - API_FUNCTION() static bool RunBuildTool(const StringView& args); + API_FUNCTION() static bool RunBuildTool(const StringView& args, const StringView& workingDir = StringView::Empty); /// /// Generates the project files. diff --git a/Source/Engine/Scripting/Scripting.cpp b/Source/Engine/Scripting/Scripting.cpp index 601ec34d4..d97718432 100644 --- a/Source/Engine/Scripting/Scripting.cpp +++ b/Source/Engine/Scripting/Scripting.cpp @@ -446,9 +446,10 @@ bool Scripting::Load() // Flax.Build outputs the .Build.json with binary modules to use for game scripting const Char *target, *platform, *architecture, *configuration; ScriptsBuilder::GetBinariesConfiguration(target, platform, architecture, configuration); - if (target == nullptr) + if (StringUtils::Length(target) == 0) { LOG(Info, "Missing EditorTarget in project. Not using game script modules."); + _hasGameModulesLoaded = true; return false; } const String targetBuildInfo = Globals::ProjectFolder / TEXT("Binaries") / target / platform / architecture / configuration / target + TEXT(".Build.json");