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

Message ID 20250711201232.129264-12-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
To support easy switching of configurations, let's introduce
LIBCAMERA_CONFIG_NAME environment variable, which:

- specifies the path of the configuration file to load if it is an
  absolute path; or
- prevents any configuration file from loading if it is defined and
  empty; or
- specifies the path of the configuration file to load, relative to
  the configuration directories.

If such a configuration file doesn't exist, no custom configuration is
loaded.

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

Patch
diff mbox series

diff --git a/Documentation/runtime_configuration.rst b/Documentation/runtime_configuration.rst
index 66f4cc913..4647ff213 100644
--- a/Documentation/runtime_configuration.rst
+++ b/Documentation/runtime_configuration.rst
@@ -19,6 +19,14 @@  order:
 - LIBCAMERA_SYSCONF_DIR/configuration.yaml
 - LIBCAMERA_DATA_DIR/libcamera/configuration.yaml
 
+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
+in the locations above, or it can contain a whole relative or absolute
+path. If an absolute path is specified then it is the only location that
+is used; if the given file doesn't exist then no configuration file is
+read. If the variable is defined but empty, no configuration is loaded.
+
 The first configuration file found wins, configuration files in other
 locations are ignored.
 
diff --git a/src/libcamera/global_configuration.cpp b/src/libcamera/global_configuration.cpp
index 1d447e1e3..4ae122924 100644
--- a/src/libcamera/global_configuration.cpp
+++ b/src/libcamera/global_configuration.cpp
@@ -23,13 +23,6 @@ 
 
 namespace libcamera {
 
-namespace {
-const std::vector<std::filesystem::path> globalConfigurationFiles = {
-	std::filesystem::path(LIBCAMERA_SYSCONF_DIR) / "configuration.yaml",
-	std::filesystem::path(LIBCAMERA_DATA_DIR) / "configuration.yaml",
-};
-}
-
 LOG_DEFINE_CATEGORY(Configuration)
 
 /**
@@ -74,6 +67,28 @@  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')
+		return false;
+	if (!libcameraConfigName)
+		libcameraConfigName = "";
+
+	std::filesystem::path configName(libcameraConfigName);
+
+	if (configName.is_absolute()) {
+		loadFile(configName);
+		return !!yamlConfiguration_;
+	}
+
+	if (configName.empty())
+		configName = std::filesystem::path("configuration.yaml");
+
 	std::filesystem::path userConfigurationDirectory;
 	const char *xdgConfigHome = utils::secure_getenv("XDG_CONFIG_HOME");
 	if (xdgConfigHome) {
@@ -87,15 +102,14 @@  bool GlobalConfiguration::load()
 
 	if (!userConfigurationDirectory.empty()) {
 		std::filesystem::path user_configuration_file =
-			userConfigurationDirectory / "libcamera" / "configuration.yaml";
+			userConfigurationDirectory / "libcamera" / configName;
 		if (loadFile(user_configuration_file))
 			return !!yamlConfiguration_;
 	}
 
-	for (const auto &path : globalConfigurationFiles) {
-		if (loadFile(path))
+	for (const auto &path : globalConfigurationDirectories)
+		if (loadFile(path / configName))
 			return !!yamlConfiguration_;
-	}
 
 	return true;
 }