-#if defined(_MSC_VER)
-#define _SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING
-#endif
-
#include "ggml-rpc.h"
#ifdef _WIN32
# define NOMINMAX
# define DIRECTORY_SEPARATOR '\\'
-# include <locale>
# include <windows.h>
# include <fcntl.h>
# include <io.h>
# include <unistd.h>
# include <sys/stat.h>
#endif
-#include <codecvt>
#include <string>
#include <stdio.h>
#include <vector>
-#include <filesystem>
#include <algorithm>
#include <thread>
#include <regex>
-namespace fs = std::filesystem;
+#if defined(__linux__)
+#include <sys/types.h>
+#include <pwd.h>
+#endif
+
+// NOTE: this is copied from common.cpp to avoid linking with libcommon
+#ifdef _WIN32
+static std::wstring utf8_to_wstring(const std::string & str) {
+ if (str.empty()) {
+ return std::wstring();
+ }
+
+ int size = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), (int)str.size(), NULL, 0);
+
+ if (size <= 0) {
+ return std::wstring();
+ }
+
+ std::wstring wstr(size, 0);
+ MultiByteToWideChar(CP_UTF8, 0, str.c_str(), (int)str.size(), &wstr[0], size);
+
+ return wstr;
+}
+#endif
// NOTE: this is copied from common.cpp to avoid linking with libcommon
// returns true if successful, false otherwise
static bool fs_create_directory_with_parents(const std::string & path) {
#ifdef _WIN32
- std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
- std::wstring wpath = converter.from_bytes(path);
+ std::wstring wpath = utf8_to_wstring(path);
// if the path already exists, check whether it's a directory
const DWORD attributes = GetFileAttributesW(wpath.c_str());
// process path from front to back, procedurally creating directories
while ((pos_slash = path.find('\\', pos_slash)) != std::string::npos) {
const std::wstring subpath = wpath.substr(0, pos_slash);
- const wchar_t * test = subpath.c_str();
- const bool success = CreateDirectoryW(test, NULL);
+ pos_slash += 1;
+
+ // skip the drive letter, in some systems it can return an access denied error
+ if (subpath.length() == 2 && subpath[1] == ':') {
+ continue;
+ }
+
+ const bool success = CreateDirectoryW(subpath.c_str(), NULL);
+
if (!success) {
const DWORD error = GetLastError();
return false;
}
}
-
- pos_slash += 1;
}
return true;
#if defined(__linux__) || defined(__FreeBSD__) || defined(_AIX) || defined(__OpenBSD__)
if (std::getenv("XDG_CACHE_HOME")) {
cache_directory = std::getenv("XDG_CACHE_HOME");
- } else {
+ } else if (std::getenv("HOME")) {
cache_directory = std::getenv("HOME") + std::string("/.cache/");
+ } else {
+#if defined(__linux__)
+ /* no $HOME is defined, fallback to getpwuid */
+ struct passwd *pw = getpwuid(getuid());
+ if ((!pw) || (!pw->pw_dir)) {
+ throw std::runtime_error("Failed to find $HOME directory");
+ }
+
+ cache_directory = std::string(pw->pw_dir) + std::string("/.cache/");
+#else /* defined(__linux__) */
+ throw std::runtime_error("Failed to find $HOME directory");
+#endif /* defined(__linux__) */
}
#elif defined(__APPLE__)
cache_directory = std::getenv("HOME") + std::string("/Library/Caches/");
#elif defined(_WIN32)
cache_directory = std::getenv("LOCALAPPDATA");
+#elif defined(__EMSCRIPTEN__)
+ GGML_ABORT("not implemented on this platform");
#else
# error Unknown architecture
#endif