Vulkan: Simplify loader using DynamicLibrary
This commit is contained in:
@@ -31,6 +31,9 @@ void RemoveThemeChangeHandler(void* ctx);
|
||||
/// Moves a file from one location to another, using NSFileManager.
|
||||
bool MoveFile(const char* source, const char* destination, Error* error);
|
||||
|
||||
/// Returns the bundle path.
|
||||
std::optional<std::string> GetBundlePath();
|
||||
|
||||
/// Get the bundle path to the actual application without any translocation fun
|
||||
std::optional<std::string> GetNonTranslocatedBundlePath();
|
||||
|
||||
|
||||
@@ -107,6 +107,17 @@ void CocoaTools::RemoveThemeChangeHandler(void* ctx)
|
||||
[s_themeChangeHandler removeCallback:ctx];
|
||||
}
|
||||
|
||||
std::optional<std::string> CocoaTools::GetBundlePath()
|
||||
{
|
||||
std::optional<std::string> ret;
|
||||
@autoreleasepool {
|
||||
NSURL* url = [NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]];
|
||||
if (url)
|
||||
ret = std::string([url fileSystemRepresentation]);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
std::optional<std::string> CocoaTools::GetNonTranslocatedBundlePath()
|
||||
{
|
||||
// See https://objective-see.com/blog/blog_0x15.html
|
||||
|
||||
@@ -4,7 +4,9 @@
|
||||
#include "common/dynamic_library.h"
|
||||
#include "common/assert.h"
|
||||
#include "common/error.h"
|
||||
#include "common/file_system.h"
|
||||
#include "common/log.h"
|
||||
#include "common/path.h"
|
||||
#include "common/small_string.h"
|
||||
#include "common/string_util.h"
|
||||
|
||||
@@ -15,6 +17,9 @@
|
||||
#include "common/windows_headers.h"
|
||||
#else
|
||||
#include <dlfcn.h>
|
||||
#ifdef __APPLE__
|
||||
#include "common/cocoa_tools.h"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
Log_SetChannel(DynamicLibrary);
|
||||
@@ -92,6 +97,27 @@ bool DynamicLibrary::Open(const char* filename, Error* error)
|
||||
m_handle = dlopen(filename, RTLD_NOW);
|
||||
if (!m_handle)
|
||||
{
|
||||
#ifdef __APPLE__
|
||||
// On MacOS, try searching in Frameworks.
|
||||
if (!Path::IsAbsolute(filename))
|
||||
{
|
||||
std::optional<std::string> bundle_path = CocoaTools::GetBundlePath();
|
||||
if (bundle_path.has_value())
|
||||
{
|
||||
std::string frameworks_path = fmt::format("{}/Contents/Frameworks/{}", bundle_path.value(), filename);
|
||||
if (FileSystem::FileExists(frameworks_path.c_str()))
|
||||
{
|
||||
m_handle = dlopen(frameworks_path.c_str(), RTLD_NOW);
|
||||
if (m_handle)
|
||||
{
|
||||
Error::Clear(error);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
const char* err = dlerror();
|
||||
Error::SetStringFmt(error, "Loading {} failed: {}", filename, err ? err : "<UNKNOWN>");
|
||||
return false;
|
||||
|
||||
@@ -28,6 +28,12 @@ void Error::Clear()
|
||||
m_description = {};
|
||||
}
|
||||
|
||||
void Error::Clear(Error* errptr)
|
||||
{
|
||||
if (errptr)
|
||||
errptr->Clear();
|
||||
}
|
||||
|
||||
void Error::SetErrno(int err)
|
||||
{
|
||||
SetErrno(std::string_view(), err);
|
||||
|
||||
@@ -68,6 +68,7 @@ public:
|
||||
#endif
|
||||
|
||||
// helpers for setting
|
||||
static void Clear(Error* errptr);
|
||||
static void SetErrno(Error* errptr, int err);
|
||||
static void SetErrno(Error* errptr, std::string_view prefix, int err);
|
||||
static void SetSocket(Error* errptr, int err);
|
||||
|
||||
Reference in New Issue
Block a user