@@ -19,6 +19,14 @@ order:
- LIBCAMERA_SYSCONF_DIR/configuration.yaml
- /etc/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.
+
The first configuration file found wins, contingent configuration files
in other locations are ignored.
@@ -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,25 @@ 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 = "";
+ 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 +99,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_;
- }
yamlConfiguration_ = std::make_unique<YamlObject>();
return true;
To support easy switching of configurations, let's introduce LIBCAMERA_CONFIG_NAME environment variable, which denotes: - The path of the configuration file to load if it is an absolute path; or - 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 | 33 ++++++++++++++++--------- 2 files changed, 30 insertions(+), 11 deletions(-)