From 876f21268535289eec549344a17121334b2f9b61 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Sun, 28 Jul 2024 19:00:07 +1000 Subject: [PATCH] DynamicLibrary: Add patch to versioned filename --- src/common/dynamic_library.cpp | 14 ++++++++++---- src/common/dynamic_library.h | 8 ++++---- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/common/dynamic_library.cpp b/src/common/dynamic_library.cpp index 36a07b650..bc27b64f7 100644 --- a/src/common/dynamic_library.cpp +++ b/src/common/dynamic_library.cpp @@ -54,10 +54,12 @@ std::string DynamicLibrary::GetUnprefixedFilename(const char* filename) #endif } -std::string DynamicLibrary::GetVersionedFilename(const char* libname, int major, int minor) +std::string DynamicLibrary::GetVersionedFilename(const char* libname, int major, int minor, int patch) { #if defined(_WIN32) - if (major >= 0 && minor >= 0) + if (major >= 0 && minor >= 0 && patch >= 0) + return fmt::format("{}-{}-{}-{}.dll", libname, major, minor, patch); + else if (major >= 0 && minor >= 0) return fmt::format("{}-{}-{}.dll", libname, major, minor); else if (major >= 0) return fmt::format("{}-{}.dll", libname, major); @@ -65,7 +67,9 @@ std::string DynamicLibrary::GetVersionedFilename(const char* libname, int major, return fmt::format("{}.dll", libname); #elif defined(__APPLE__) const char* prefix = std::strncmp(libname, "lib", 3) ? "lib" : ""; - if (major >= 0 && minor >= 0) + if (major >= 0 && minor >= 0 && patch >= 0) + return fmt::format("{}{}.{}.{}.{}.dylib", prefix, libname, major, minor, patch); + else if (major >= 0 && minor >= 0) return fmt::format("{}{}.{}.{}.dylib", prefix, libname, major, minor); else if (major >= 0) return fmt::format("{}{}.{}.dylib", prefix, libname, major); @@ -73,7 +77,9 @@ std::string DynamicLibrary::GetVersionedFilename(const char* libname, int major, return fmt::format("{}{}.dylib", prefix, libname); #else const char* prefix = std::strncmp(libname, "lib", 3) ? "lib" : ""; - if (major >= 0 && minor >= 0) + if (major >= 0 && minor >= 0 && patch >= 0) + return fmt::format("{}{}.so.{}.{}.{}", prefix, libname, major, minor, patch); + else if (major >= 0 && minor >= 0) return fmt::format("{}{}.so.{}.{}", prefix, libname, major, minor); else if (major >= 0) return fmt::format("{}{}.so.{}", prefix, libname, major); diff --git a/src/common/dynamic_library.h b/src/common/dynamic_library.h index d34942c67..fbe434be5 100644 --- a/src/common/dynamic_library.h +++ b/src/common/dynamic_library.h @@ -33,10 +33,10 @@ public: /// Returns the specified library name in platform-specific format. /// Major/minor versions will not be included if set to -1. /// If libname already contains the "lib" prefix, it will not be added again. - /// Windows: LIBNAME-MAJOR-MINOR.dll - /// Linux: libLIBNAME.so.MAJOR.MINOR - /// Mac: libLIBNAME.MAJOR.MINOR.dylib - static std::string GetVersionedFilename(const char* libname, int major = -1, int minor = -1); + /// Windows: LIBNAME-MAJOR-MINOR-PATCH.dll + /// Linux: libLIBNAME.so.MAJOR.MINOR.PATCH + /// Mac: libLIBNAME.MAJOR.MINOR.PATCH.dylib + static std::string GetVersionedFilename(const char* libname, int major = -1, int minor = -1, int patch = -1); /// Returns true if a module is loaded, otherwise false. bool IsOpen() const { return m_handle != nullptr; }