diff --git a/src/Linker/LinkerArgs.cpp b/src/Linker/LinkerArgs.cpp index a0d0f7fe..30f3ff14 100644 --- a/src/Linker/LinkerArgs.cpp +++ b/src/Linker/LinkerArgs.cpp @@ -5,6 +5,7 @@ #include "ObjWriting.h" #include "Utils/Arguments/UsageInformation.h" #include "Utils/FileUtils.h" +#include "Utils/PathUtils.h" #include #include @@ -152,9 +153,9 @@ void LinkerArgs::PrintVersion() std::cout << std::format("OpenAssetTools Linker {}\n", GIT_VERSION); } -void LinkerArgs::SetBinFolder(const char* argv0) +void LinkerArgs::SetBinFolder() { - const fs::path path(argv0); + const fs::path path(utils::GetExecutablePath()); m_bin_folder = path.parent_path().string(); } @@ -190,7 +191,7 @@ bool LinkerArgs::ParseArgs(const int argc, const char** argv, bool& shouldContin return true; } - SetBinFolder(argv[0]); + SetBinFolder(); m_project_specifiers_to_build = m_argument_parser.GetArguments(); if (m_project_specifiers_to_build.empty()) diff --git a/src/Linker/LinkerArgs.h b/src/Linker/LinkerArgs.h index fe2b8f4b..4f779117 100644 --- a/src/Linker/LinkerArgs.h +++ b/src/Linker/LinkerArgs.h @@ -37,7 +37,7 @@ private: void PrintUsage() const; static void PrintVersion(); - void SetBinFolder(const char* argv0); + void SetBinFolder(); void SetVerbose(bool isVerbose); ArgumentParser m_argument_parser; diff --git a/src/Utils/Utils/FileUtils.h b/src/Utils/Utils/FileUtils.h index 18a1525c..6a053fff 100644 --- a/src/Utils/Utils/FileUtils.h +++ b/src/Utils/Utils/FileUtils.h @@ -1,4 +1,5 @@ #pragma once + #include #include #include diff --git a/src/Utils/Utils/PathUtils.cpp b/src/Utils/Utils/PathUtils.cpp new file mode 100644 index 00000000..fa6080c2 --- /dev/null +++ b/src/Utils/Utils/PathUtils.cpp @@ -0,0 +1,27 @@ +#include "PathUtils.h" + +#include + +#ifdef _WIN32 +#include +#elif defined(__linux__) +#include +#include +#endif + +namespace utils +{ + std::string GetExecutablePath() + { +#ifdef _WIN32 + char result[MAX_PATH]; + return std::string(result, GetModuleFileNameA(NULL, result, MAX_PATH)); +#elif defined(__linux__) + char result[PATH_MAX]; + const auto count = readlink("/proc/self/exe", result, PATH_MAX); + return std::string(result, (count > 0) ? count : 0); +#else + throw std::runtime_error("Unknown platform for executable path"); +#endif + } +} // namespace utils diff --git a/src/Utils/Utils/PathUtils.h b/src/Utils/Utils/PathUtils.h new file mode 100644 index 00000000..e98e5245 --- /dev/null +++ b/src/Utils/Utils/PathUtils.h @@ -0,0 +1,8 @@ +#pragma once + +#include + +namespace utils +{ + std::string GetExecutablePath(); +}