[v13,12/12] config: Make configuration directories configurable
diff mbox series

Message ID 20250711201232.129264-13-mzamazal@redhat.com
State New
Headers show
Series
  • Add global configuration file
Related show

Commit Message

Milan Zamazal July 11, 2025, 8:12 p.m. UTC
A newly introduced LIBCAMERA_CONFIG_DIR environment variable specifies a
directory or a list of directories separated by colons where to look for
the libcamera configuration file before trying the standard locations.

Signed-off-by: Milan Zamazal <mzamazal@redhat.com>
---
 Documentation/runtime_configuration.rst |  5 +++++
 src/libcamera/global_configuration.cpp  | 28 ++++++++++++++-----------
 2 files changed, 21 insertions(+), 12 deletions(-)

Patch
diff mbox series

diff --git a/Documentation/runtime_configuration.rst b/Documentation/runtime_configuration.rst
index 4647ff213..552dccd41 100644
--- a/Documentation/runtime_configuration.rst
+++ b/Documentation/runtime_configuration.rst
@@ -19,6 +19,11 @@  order:
 - LIBCAMERA_SYSCONF_DIR/configuration.yaml
 - LIBCAMERA_DATA_DIR/libcamera/configuration.yaml
 
+If LIBCAMERA_CONFIG_DIR environment variable is non-empty then it
+specifies additional directories where to look for the configuration
+file, before looking at the standard locations. It can be a single
+directory or multiple directories separated by colons.
+
 The default name of the configuration file, configuration.yaml, can be
 overridden in LIBCAMERA_CONFIG_NAME environment variable. The variable
 can specify just an alternative configuration file name to be looked up
diff --git a/src/libcamera/global_configuration.cpp b/src/libcamera/global_configuration.cpp
index 4ae122924..553d5f221 100644
--- a/src/libcamera/global_configuration.cpp
+++ b/src/libcamera/global_configuration.cpp
@@ -67,11 +67,6 @@  bool GlobalConfiguration::loadFile(const std::filesystem::path &fileName)
 
 bool GlobalConfiguration::load()
 {
-	const std::vector<std::filesystem::path> globalConfigurationDirectories = {
-		std::filesystem::path(LIBCAMERA_SYSCONF_DIR),
-		std::filesystem::path(LIBCAMERA_DATA_DIR),
-	};
-
 	const char *libcameraConfigName =
 		utils::secure_getenv("LIBCAMERA_CONFIG_NAME");
 	if (libcameraConfigName && libcameraConfigName[0] == '\0')
@@ -89,6 +84,16 @@  bool GlobalConfiguration::load()
 	if (configName.empty())
 		configName = std::filesystem::path("configuration.yaml");
 
+	std::vector<std::filesystem::path> configurationDirectories;
+
+	const char *configDir = utils::secure_getenv("LIBCAMERA_CONFIG_DIR");
+	if (configDir) {
+		for (auto const &path : utils::split(configDir, ":")) {
+			if (!path.empty())
+				configurationDirectories.push_back(path);
+		}
+	}
+
 	std::filesystem::path userConfigurationDirectory;
 	const char *xdgConfigHome = utils::secure_getenv("XDG_CONFIG_HOME");
 	if (xdgConfigHome) {
@@ -99,15 +104,14 @@  bool GlobalConfiguration::load()
 			userConfigurationDirectory =
 				std::filesystem::path(home) / ".config";
 	}
+	if (!userConfigurationDirectory.empty())
+		configurationDirectories.push_back(
+			userConfigurationDirectory / "libcamera");
 
-	if (!userConfigurationDirectory.empty()) {
-		std::filesystem::path user_configuration_file =
-			userConfigurationDirectory / "libcamera" / configName;
-		if (loadFile(user_configuration_file))
-			return !!yamlConfiguration_;
-	}
+	configurationDirectories.push_back(LIBCAMERA_SYSCONF_DIR);
+	configurationDirectories.push_back(LIBCAMERA_DATA_DIR);
 
-	for (const auto &path : globalConfigurationDirectories)
+	for (const auto &path : configurationDirectories)
 		if (loadFile(path / configName))
 			return !!yamlConfiguration_;