@@ -2632,6 +2632,14 @@ (define-public retroarch-minimal
(variable "LIBRETRO_AUTOCONFIG_DIRECTORY")
(separator #f) ;single entry
(files '("share/libretro/autoconfig")))
+ (search-path-specification
+ (variable "LIBRETRO_DATABASE_DIRECTORY")
+ (separator #f) ;single entry
+ (files '("share/libretro/database/rdb")))
+ (search-path-specification
+ (variable "LIBRETRO_SYSTEM_DIRECTORY")
+ (separator #f) ;single entry
+ (files '("share/libretro/system")))
(search-path-specification
(variable "LIBRETRO_VIDEO_FILTER_DIRECTORY")
(separator #f) ;single entry
@@ -1,25 +1,22 @@
-Allows discovery of assets file via the LIBRETRO_ASSETS_DIRECTORY environment
-variable.
-
-Upstream-status: https://github.com/libretro/RetroArch/pull/17054
-
diff --git a/configuration.c b/configuration.c
-index 5808a3f21c..0cc2909102 100644
+index 5808a3f21c..e1c56f2f1b 100644
--- a/configuration.c
+++ b/configuration.c
-@@ -3573,6 +3573,11 @@ static bool config_load_file(global_t *global,
+@@ -3573,6 +3573,13 @@ static bool config_load_file(global_t *global,
{
unsigned i;
char tmp_str[PATH_MAX_LENGTH];
+ char* libretro_directory = NULL;
+ char* libretro_assets_directory = NULL;
+ char* libretro_autoconfig_directory = NULL;
++ char* libretro_database_directory = NULL;
++ char* libretro_system_directory = NULL;
+ char* libretro_video_filter_directory = NULL;
+ char* libretro_video_shader_directory = NULL;
static bool first_load = true;
bool without_overrides = false;
unsigned msg_color = 0;
-@@ -3848,12 +3853,6 @@ static bool config_load_file(global_t *global,
+@@ -3848,12 +3855,6 @@ static bool config_load_file(global_t *global,
strlcpy(path_settings[i].ptr, tmp_str, PATH_MAX_LENGTH);
}
@@ -32,7 +29,7 @@ index 5808a3f21c..0cc2909102 100644
#ifdef RARCH_CONSOLE
if (conf)
video_driver_load_settings(global, conf);
-@@ -3861,6 +3860,20 @@ static bool config_load_file(global_t *global,
+@@ -3861,6 +3862,32 @@ static bool config_load_file(global_t *global,
/* Post-settings load */
@@ -45,15 +42,27 @@ index 5808a3f21c..0cc2909102 100644
+ }
+
+ libretro_autoconfig_directory = getenv("LIBRETRO_AUTOCONFIG_DIRECTORY");
-+ if (libretro_autoconfig_directory)
++ if (libretro_autoconfig_directory) /* override configuration value */
+ configuration_set_string(settings,
+ settings->paths.directory_autoconfig,
+ libretro_autoconfig_directory);
++
++ libretro_database_directory = getenv("LIBRETRO_DATABASE_DIRECTORY");
++ if (libretro_database_directory) /* override configuration value */
++ configuration_set_string(settings,
++ settings->paths.path_content_database,
++ libretro_database_directory);
++
++ libretro_system_directory = getenv("LIBRETRO_SYSTEM_DIRECTORY");
++ if (libretro_system_directory) /* override configuration value */
++ configuration_set_string(settings,
++ settings->paths.directory_system,
++ libretro_system_directory);
+
if ( (rarch_flags & RARCH_FLAGS_HAS_SET_USERNAME)
&& (override_username))
{
-@@ -4032,15 +4045,27 @@ static bool config_load_file(global_t *global,
+@@ -4032,15 +4059,27 @@ static bool config_load_file(global_t *global,
*settings->paths.path_menu_wallpaper = '\0';
if (string_is_equal(settings->paths.path_rgui_theme_preset, "default"))
*settings->paths.path_rgui_theme_preset = '\0';
@@ -85,18 +94,18 @@ index 5808a3f21c..0cc2909102 100644
#ifdef _3DS
if (string_is_equal(settings->paths.directory_bottom_assets, "default"))
diff --git a/docs/retroarch.6 b/docs/retroarch.6
-index 7478040e17..f864e0e0d5 100644
+index 7478040e17..f26a1219f0 100644
--- a/docs/retroarch.6
+++ b/docs/retroarch.6
@@ -1,6 +1,6 @@
.\" retroarch.6:
-.TH "RETROARCH" "6" "November 1, 2011" "RETROARCH" "System Manager's Manual: retroarch"
-+.TH "RETROARCH" "6" "September 28, 2024" "RETROARCH" "System Manager's Manual: retroarch"
++.TH "RETROARCH" "6" "January 18, 2025" "RETROARCH" "System Manager's Manual: retroarch"
.SH NAME
-@@ -239,3 +239,36 @@ Disables all kinds of content patching.
+@@ -239,3 +239,48 @@ Disables all kinds of content patching.
.TP
\fB-D, --detach\fR
Detach from the current console. This is currently only relevant for Microsoft Windows.
@@ -123,6 +132,18 @@ index 7478040e17..f864e0e0d5 100644
+"joypad_autoconfig_dir" configuration file option.
+
+.TP
++\fBLIBRETRO_DATABASE_DIRECTORY\fR
++Specify the directory where RetroArch looks for database files,
++overriding the value of the "content_database_path" configuration file
++option.
++
++.TP
++\fBLIBRETRO_SYSTEM_DIRECTORY\fR
++Specify the directory where RetroArch looks for system files,
++overriding the value of the "system_directory" configuration file
++option.
++
++.TP
+\fBLIBRETRO_VIDEO_FILTER_DIRECTORY\fR
+Specify the directory where RetroArch looks for video filters,
+overriding the value of the "video_filter_dir" configuration file
@@ -134,21 +155,23 @@ index 7478040e17..f864e0e0d5 100644
+overriding the value of the "video_shader_dir" configuration file
+option.
diff --git a/frontend/drivers/platform_unix.c b/frontend/drivers/platform_unix.c
-index c157d355a1..ddf0b5ca87 100644
+index c157d355a1..bec65ca949 100644
--- a/frontend/drivers/platform_unix.c
+++ b/frontend/drivers/platform_unix.c
-@@ -1324,6 +1324,10 @@ static void frontend_unix_get_env(int *argc,
+@@ -1324,6 +1324,12 @@ static void frontend_unix_get_env(int *argc,
{
unsigned i;
const char* libretro_directory = getenv("LIBRETRO_DIRECTORY");
+ const char* libretro_assets_directory = getenv("LIBRETRO_ASSETS_DIRECTORY");
+ const char* libretro_autoconfig_directory = getenv("LIBRETRO_AUTOCONFIG_DIRECTORY");
++ const char* libretro_database_directory = getenv("LIBRETRO_DATABASE_DIRECTORY");
++ const char* libretro_system_directory = getenv("LIBRETRO_SYSTEM_DIRECTORY");
+ const char* libretro_video_filter_directory = getenv("LIBRETRO_VIDEO_FILTER_DIRECTORY");
+ const char* libretro_video_shader_directory = getenv("LIBRETRO_VIDEO_SHADER_DIRECTORY");
#ifdef ANDROID
int32_t major, minor, rel;
char device_model[PROP_VALUE_MAX] = {0};
-@@ -1765,12 +1769,20 @@ static void frontend_unix_get_env(int *argc,
+@@ -1765,12 +1771,20 @@ static void frontend_unix_get_env(int *argc,
"cores", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE_INFO]));
else
#endif
@@ -174,7 +197,7 @@ index c157d355a1..ddf0b5ca87 100644
#ifdef ASSETS_DIR
if (path_is_directory(ASSETS_DIR "/assets"))
fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_ASSETS],
-@@ -1778,7 +1790,10 @@ static void frontend_unix_get_env(int *argc,
+@@ -1778,7 +1792,10 @@ static void frontend_unix_get_env(int *argc,
"assets", sizeof(g_defaults.dirs[DEFAULT_DIR_ASSETS]));
else
#endif
@@ -186,7 +209,7 @@ index c157d355a1..ddf0b5ca87 100644
fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_ASSETS],
"/usr/local/share/retroarch",
"assets", sizeof(g_defaults.dirs[DEFAULT_DIR_ASSETS]));
-@@ -1838,7 +1853,11 @@ static void frontend_unix_get_env(int *argc,
+@@ -1838,7 +1855,11 @@ static void frontend_unix_get_env(int *argc,
"filters/video", sizeof(g_defaults.dirs[DEFAULT_DIR_VIDEO_FILTER]));
else
#endif
@@ -199,12 +222,21 @@ index c157d355a1..ddf0b5ca87 100644
fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_VIDEO_FILTER],
"/usr/local/share/retroarch",
"filters/video", sizeof(g_defaults.dirs[DEFAULT_DIR_VIDEO_FILTER]));
-@@ -1872,8 +1891,13 @@ static void frontend_unix_get_env(int *argc,
+@@ -1870,10 +1891,20 @@ static void frontend_unix_get_env(int *argc,
+ "records_config", sizeof(g_defaults.dirs[DEFAULT_DIR_RECORD_CONFIG]));
+ fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_RECORD_OUTPUT], base_path,
"records", sizeof(g_defaults.dirs[DEFAULT_DIR_RECORD_OUTPUT]));
- fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_DATABASE], base_path,
- "database/rdb", sizeof(g_defaults.dirs[DEFAULT_DIR_DATABASE]));
+- fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_DATABASE], base_path,
+- "database/rdb", sizeof(g_defaults.dirs[DEFAULT_DIR_DATABASE]));
- fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_SHADER], base_path,
- "shaders", sizeof(g_defaults.dirs[DEFAULT_DIR_SHADER]));
++ if (!string_is_empty(libretro_database_directory))
++ strlcpy(g_defaults.dirs[DEFAULT_DIR_DATABASE],
++ libretro_database_directory,
++ sizeof(g_defaults.dirs[DEFAULT_DIR_DATABASE]));
++ else
++ fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_DATABASE], base_path,
++ "database/rdb", sizeof(g_defaults.dirs[DEFAULT_DIR_DATABASE]));
+ if (!string_is_empty(libretro_video_shader_directory))
+ strlcpy(g_defaults.dirs[DEFAULT_DIR_SHADER],
+ libretro_video_shader_directory,
@@ -215,16 +247,34 @@ index c157d355a1..ddf0b5ca87 100644
fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CHEATS], base_path,
"cheats", sizeof(g_defaults.dirs[DEFAULT_DIR_CHEATS]));
fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_OVERLAY], base_path,
+@@ -1892,8 +1923,13 @@ static void frontend_unix_get_env(int *argc,
+ "saves", sizeof(g_defaults.dirs[DEFAULT_DIR_SRAM]));
+ fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_SAVESTATE], base_path,
+ "states", sizeof(g_defaults.dirs[DEFAULT_DIR_SAVESTATE]));
+- fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_SYSTEM], base_path,
+- "system", sizeof(g_defaults.dirs[DEFAULT_DIR_SYSTEM]));
++ if (!string_is_empty(libretro_system_directory))
++ strlcpy(g_defaults.dirs[DEFAULT_DIR_SYSTEM],
++ libretro_system_directory,
++ sizeof(g_defaults.dirs[DEFAULT_DIR_SYSTEM]));
++ else
++ fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_SYSTEM], base_path,
++ "system", sizeof(g_defaults.dirs[DEFAULT_DIR_SYSTEM]));
+ #endif
+
+ #ifndef IS_SALAMANDER
diff --git a/frontend/drivers/platform_win32.c b/frontend/drivers/platform_win32.c
-index 26ed25c04f..0cc9a9dc95 100644
+index 26ed25c04f..77d415f0e7 100644
--- a/frontend/drivers/platform_win32.c
+++ b/frontend/drivers/platform_win32.c
-@@ -565,24 +565,38 @@ static void frontend_win32_env_get(int *argc, char *argv[],
+@@ -565,24 +565,45 @@ static void frontend_win32_env_get(int *argc, char *argv[],
{
const char *tmp_dir = getenv("TMP");
const char *libretro_directory = getenv("LIBRETRO_DIRECTORY");
+ const char *libretro_assets_directory = getenv("LIBRETRO_ASSETS_DIRECTORY");
+ const char* libretro_autoconfig_directory = getenv("LIBRETRO_AUTOCONFIG_DIRECTORY");
++ const char* libretro_database_directory = getenv("LIBRETRO_DATABASE_DIRECTORY");
++ const char* libretro_system_directory = getenv("LIBRETRO_SYSTEM_DIRECTORY");
+ const char* libretro_video_filter_directory = getenv("LIBRETRO_VIDEO_FILTER_DIRECTORY");
+ const char* libretro_video_shader_directory = getenv("LIBRETRO_VIDEO_SHADER_DIRECTORY");
if (!string_is_empty(tmp_dir))
@@ -255,15 +305,22 @@ index 26ed25c04f..0cc9a9dc95 100644
+ ":\\filters\\video", sizeof(g_defaults.dirs[DEFAULT_DIR_VIDEO_FILTER]));
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_CHEATS],
":\\cheats", sizeof(g_defaults.dirs[DEFAULT_DIR_CHEATS]));
- fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_DATABASE],
- ":\\database\\rdb", sizeof(g_defaults.dirs[DEFAULT_DIR_DATABASE]));
+- fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_DATABASE],
+- ":\\database\\rdb", sizeof(g_defaults.dirs[DEFAULT_DIR_DATABASE]));
++ if (!string_is_empty(libretro_database_directory))
++ strlcpy(g_defaults.dirs[DEFAULT_DIR_DATABASE],
++ libretro_database_directory,
++ sizeof(g_defaults.dirs[DEFAULT_DIR_DATABASE]));
++ else
++ fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_DATABASE],
++ ":\\database\\rdb", sizeof(g_defaults.dirs[DEFAULT_DIR_DATABASE]));
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_PLAYLIST],
- ":\\playlists", sizeof(g_defaults.dirs[DEFAULT_DIR_ASSETS]));
+ ":\\playlists", sizeof(g_defaults.dirs[DEFAULT_DIR_PLAYLIST]));
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_RECORD_CONFIG],
":\\config\\record", sizeof(g_defaults.dirs[DEFAULT_DIR_RECORD_CONFIG]));
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_RECORD_OUTPUT],
-@@ -605,12 +619,26 @@ static void frontend_win32_env_get(int *argc, char *argv[],
+@@ -605,12 +626,26 @@ static void frontend_win32_env_get(int *argc, char *argv[],
else
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_CORE],
":\\cores", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE]));
@@ -296,3 +353,19 @@ index 26ed25c04f..0cc9a9dc95 100644
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_CORE_ASSETS],
":\\downloads", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE_ASSETS]));
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SCREENSHOT],
+@@ -619,8 +654,13 @@ static void frontend_win32_env_get(int *argc, char *argv[],
+ ":\\saves", sizeof(g_defaults.dirs[DEFAULT_DIR_SRAM]));
+ fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SAVESTATE],
+ ":\\states", sizeof(g_defaults.dirs[DEFAULT_DIR_SAVESTATE]));
+- fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SYSTEM],
+- ":\\system", sizeof(g_defaults.dirs[DEFAULT_DIR_SYSTEM]));
++ if (!string_is_empty(libretro_system_directory))
++ strlcpy(g_defaults.dirs[DEFAULT_DIR_SYSTEM],
++ libretro_system_directory,
++ sizeof(g_defaults.dirs[DEFAULT_DIR_SYSTEM]));
++ else
++ fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SYSTEM],
++ ":\\system", sizeof(g_defaults.dirs[DEFAULT_DIR_SYSTEM]));
+ fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_LOGS],
+ ":\\logs", sizeof(g_defaults.dirs[DEFAULT_DIR_LOGS]));
+