From c6ffdedb81a5aef884843054d0c5bba7030b2dd4 Mon Sep 17 00:00:00 2001 From: Jan Date: Sun, 8 Sep 2024 16:15:45 +0200 Subject: [PATCH] feat: load raw game folder relative to binary to be able to always locate it, even when in a different working directory --- src/Linker/LinkerArgs.cpp | 27 +++++++++--- src/Linker/LinkerArgs.h | 92 ++++++++++++++++++++------------------- 2 files changed, 68 insertions(+), 51 deletions(-) diff --git a/src/Linker/LinkerArgs.cpp b/src/Linker/LinkerArgs.cpp index 1e6c927c..1513b99b 100644 --- a/src/Linker/LinkerArgs.cpp +++ b/src/Linker/LinkerArgs.cpp @@ -109,13 +109,14 @@ const CommandLineOption* const COMMAND_LINE_OPTIONS[]{ }; LinkerArgs::LinkerArgs() - : m_argument_parser(COMMAND_LINE_OPTIONS, std::extent_v), - m_base_pattern(R"(\?base\?)"), - m_game_pattern(R"(\?game\?)"), - m_project_pattern(R"(\?project\?)"), + : m_verbose(false), m_base_folder_depends_on_project(false), m_out_folder_depends_on_project(false), - m_verbose(false) + m_argument_parser(COMMAND_LINE_OPTIONS, std::extent_v), + m_bin_pattern(R"(\?bin\?)"), + m_base_pattern(R"(\?base\?)"), + m_game_pattern(R"(\?game\?)"), + m_project_pattern(R"(\?project\?)") { } @@ -139,6 +140,12 @@ void LinkerArgs::PrintVersion() std::cout << "OpenAssetTools Linker " << std::string(GIT_VERSION) << "\n"; } +void LinkerArgs::SetBinFolder(const char* argv0) +{ + const fs::path path(argv0); + m_bin_folder = path.parent_path().string(); +} + void LinkerArgs::SetVerbose(const bool isVerbose) { m_verbose = isVerbose; @@ -205,8 +212,12 @@ std::set LinkerArgs::GetSearchPathsForProject(const std::set GetProjectIndependentSearchPaths(const std::set& set) const; - _NODISCARD std::set - GetSearchPathsForProject(const std::set& set, const std::string& gameName, const std::string& projectName) const; - -public: - std::vector m_zones_to_load; - std::vector m_project_specifiers_to_build; - - std::string m_base_folder; - std::string m_out_folder; - bool m_base_folder_depends_on_project; - bool m_out_folder_depends_on_project; - - std::set m_asset_search_paths; - std::set m_gdt_search_paths; - std::set m_source_search_paths; - - bool m_verbose; + static constexpr auto DEFAULT_BASE_FOLDER = "."; + static constexpr auto DEFAULT_BASE_FOLDER_MOD_TOOLS = ".."; + static constexpr auto DEFAULT_OUTPUT_FOLDER = "?base?/zone_out/?project?"; + static constexpr auto DEFAULT_ASSET_SEARCH_PATH = "?bin?/raw/?game?;?base?/raw;?base?/raw/?game?;?base?/zone_raw/?project?"; + static constexpr auto DEFAULT_GDT_SEARCH_PATH = "?base?/source_data;?base?/zone_raw/?project?/source_data"; + static constexpr auto DEFAULT_SOURCE_SEARCH_PATH = "?base?/zone_source;?base?/zone_raw/?project?/zone_source"; LinkerArgs(); bool ParseArgs(int argc, const char** argv, bool& shouldContinue); @@ -73,4 +39,42 @@ public: _NODISCARD std::set GetAssetSearchPathsForProject(const std::string& gameName, const std::string& projectName) const; _NODISCARD std::set GetGdtSearchPathsForProject(const std::string& gameName, const std::string& projectName) const; _NODISCARD std::set GetSourceSearchPathsForProject(const std::string& projectName) const; + + bool m_verbose; + + std::vector m_zones_to_load; + std::vector m_project_specifiers_to_build; + + std::string m_bin_folder; + std::string m_base_folder; + std::string m_out_folder; + bool m_base_folder_depends_on_project; + bool m_out_folder_depends_on_project; + + std::set m_asset_search_paths; + std::set m_gdt_search_paths; + std::set m_source_search_paths; + +private: + /** + * \brief Prints a command line usage help text for the Linker tool to stdout. + */ + static void PrintUsage(); + static void PrintVersion(); + + void SetBinFolder(const char* argv0); + + void SetVerbose(bool isVerbose); + + _NODISCARD std::string GetBasePathForProject(const std::string& projectName) const; + void SetDefaultBasePath(); + _NODISCARD std::set GetProjectIndependentSearchPaths(const std::set& set) const; + _NODISCARD std::set + GetSearchPathsForProject(const std::set& set, const std::string& gameName, const std::string& projectName) const; + + ArgumentParser m_argument_parser; + std::regex m_bin_pattern; + std::regex m_base_pattern; + std::regex m_game_pattern; + std::regex m_project_pattern; };