[{"id":34700,"web_url":"https://patchwork.libcamera.org/comment/34700/","msgid":"<aadfb17d-2fe4-45f9-a5ec-f62dc8e4ec5c@ideasonboard.com>","date":"2025-06-27T14:00:44","subject":"Re: [PATCH v11 11/12] config: Make configuration file configurable","submitter":{"id":216,"url":"https://patchwork.libcamera.org/api/people/216/","name":"Barnabás Pőcze","email":"barnabas.pocze@ideasonboard.com"},"content":"Hi\n\n2025. 06. 24. 10:36 keltezéssel, Milan Zamazal írta:\n> To support easy switching of configurations, let's introduce\n> LIBCAMERA_CONFIG_NAME environment variable, which denotes:\n> \n> - The path of the configuration file to load if it is an absolute path; or\n> - the path of the configuration file to load, relative to the configuration\n>    directories.\n> \n> If such a configuration file doesn't exist, no custom configuration is\n> loaded.\n> \n> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>\n> ---\n>   Documentation/runtime_configuration.rst |  8 ++++++\n>   src/libcamera/global_configuration.cpp  | 33 ++++++++++++++++---------\n>   2 files changed, 30 insertions(+), 11 deletions(-)\n> \n> diff --git a/Documentation/runtime_configuration.rst b/Documentation/runtime_configuration.rst\n> index de74fa732..5648db7d7 100644\n> --- a/Documentation/runtime_configuration.rst\n> +++ b/Documentation/runtime_configuration.rst\n> @@ -19,6 +19,14 @@ order:\n>   - LIBCAMERA_SYSCONF_DIR/configuration.yaml\n>   - /etc/libcamera/configuration.yaml\n>   \n> +The default name of the configuration file, configuration.yaml, can be\n> +overridden in LIBCAMERA_CONFIG_NAME environment variable. The variable\n> +can specify just an alternative configuration file name to be looked up\n> +in the locations above, or it can contain a whole relative or absolute\n> +path. If an absolute path is specified then it is the only location that\n> +is used; if the given file doesn't exist then no configuration file is\n> +read.\n> +\n>   The first configuration file found wins, contingent configuration files\n>   in other locations are ignored.\n>   \n> diff --git a/src/libcamera/global_configuration.cpp b/src/libcamera/global_configuration.cpp\n> index f7c69890c..2c3b6cf97 100644\n> --- a/src/libcamera/global_configuration.cpp\n> +++ b/src/libcamera/global_configuration.cpp\n> @@ -23,13 +23,6 @@\n>   \n>   namespace libcamera {\n>   \n> -namespace {\n> -const std::vector<std::filesystem::path> globalConfigurationFiles = {\n> -\tstd::filesystem::path(LIBCAMERA_SYSCONF_DIR) / \"configuration.yaml\",\n> -\tstd::filesystem::path(\"/etc/libcamera/configuration.yaml\"),\n> -};\n> -}\n> -\n>   LOG_DEFINE_CATEGORY(Configuration)\n>   \n>   /**\n> @@ -74,6 +67,25 @@ bool GlobalConfiguration::loadFile(const std::filesystem::path &fileName)\n>   \n>   bool GlobalConfiguration::load()\n>   {\n> +\tconst std::vector<std::filesystem::path> globalConfigurationDirectories = {\n> +\t\tstd::filesystem::path(LIBCAMERA_SYSCONF_DIR),\n\nI would probably add `LIBCAMERA_DATA_DIR` after the above, so e.g. `/usr/share/libcamera/configuration.yaml`\ncould be the configuration that libcamera ships by default. Although I suppose\nit might not be too useful until configuration file merging is implemented.\n\n\n> +\t\tstd::filesystem::path(\"/etc/libcamera\"),\n\nI am not sure if we want any hard-coded paths. I believe removing this won't affect\nthe vast majority, but e.g. if one wants a local installation with a custom prefix,\nit might be surprising that libcamera loads configuration from outside.\n\n\nRegards,\nBarnabás Pőcze\n\n\n> +\t};\n> +\n> +\tconst char *libcameraConfigName =\n> +\t\tutils::secure_getenv(\"LIBCAMERA_CONFIG_NAME\");\n> +\tif (!libcameraConfigName)\n> +\t\tlibcameraConfigName = \"\";\n> +\tstd::filesystem::path configName(libcameraConfigName);\n> +\n> +\tif (configName.is_absolute()) {\n> +\t\tloadFile(configName);\n> +\t\treturn !!yamlConfiguration_;\n> +\t}\n> +\n> +\tif (configName.empty())\n> +\t\tconfigName = std::filesystem::path(\"configuration.yaml\");\n> +\n>   \tstd::filesystem::path userConfigurationDirectory;\n>   \tconst char *xdgConfigHome = utils::secure_getenv(\"XDG_CONFIG_HOME\");\n>   \tif (xdgConfigHome) {\n> @@ -87,15 +99,14 @@ bool GlobalConfiguration::load()\n>   \n>   \tif (!userConfigurationDirectory.empty()) {\n>   \t\tstd::filesystem::path user_configuration_file =\n> -\t\t\tuserConfigurationDirectory / \"libcamera\" / \"configuration.yaml\";\n> +\t\t\tuserConfigurationDirectory / \"libcamera\" / configName;\n>   \t\tif (loadFile(user_configuration_file))\n>   \t\t\treturn !!yamlConfiguration_;\n>   \t}\n>   \n> -\tfor (const auto &path : globalConfigurationFiles) {\n> -\t\tif (loadFile(path))\n> +\tfor (const auto &path : globalConfigurationDirectories)\n> +\t\tif (loadFile(path / configName))\n>   \t\t\treturn !!yamlConfiguration_;\n> -\t}\n>   \n>   \tyamlConfiguration_ = std::make_unique<YamlObject>();\n>   \treturn true;","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 7B003C3237\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 27 Jun 2025 14:01:10 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id A2D1F68E0F;\n\tFri, 27 Jun 2025 16:01:09 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 9222968DFE\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 27 Jun 2025 16:00:53 +0200 (CEST)","from [192.168.33.12] (185.221.143.107.nat.pool.zt.hu\n\t[185.221.143.107])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id D214716C5;\n\tFri, 27 Jun 2025 16:00:33 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"HlKUMKnX\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1751032834;\n\tbh=gqaGEXdLqGEl8zKVoVMc9lQLxZIniX6aivuvKrMH1xQ=;\n\th=Date:Subject:To:Cc:References:From:In-Reply-To:From;\n\tb=HlKUMKnXDz2VsxGwE/6SqwJ5IYIB/dPhd7vwtoHMDo9dI0/If+GaMy192H3Oc9dzX\n\tY3Gwa24UqF/0u4B5q5y54oxrwSTyxq7vy1k4Mm1rGj36Q5/NS/LWXHHelNmnwhLn+Y\n\tErYRAtPsKtDDyQd/U5xKH+Aaco/qThIVwr+9q4N8=","Message-ID":"<aadfb17d-2fe4-45f9-a5ec-f62dc8e4ec5c@ideasonboard.com>","Date":"Fri, 27 Jun 2025 16:00:44 +0200","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH v11 11/12] config: Make configuration file configurable","To":"Milan Zamazal <mzamazal@redhat.com>, libcamera-devel@lists.libcamera.org","Cc":"Kieran Bingham <kieran.bingham@ideasonboard.com>,\n\tLaurent Pinchart <laurent.pinchart@ideasonboard.com>","References":"<20250624083612.27230-1-mzamazal@redhat.com>\n\t<20250624083612.27230-12-mzamazal@redhat.com>","From":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","Content-Language":"en-US, hu-HU","In-Reply-To":"<20250624083612.27230-12-mzamazal@redhat.com>","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"8bit","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":34718,"web_url":"https://patchwork.libcamera.org/comment/34718/","msgid":"<85pleovpk0.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","date":"2025-06-27T21:32:15","subject":"Re: [PATCH v11 11/12] config: Make configuration file configurable","submitter":{"id":177,"url":"https://patchwork.libcamera.org/api/people/177/","name":"Milan Zamazal","email":"mzamazal@redhat.com"},"content":"Hi Barnabás,\n\nBarnabás Pőcze <barnabas.pocze@ideasonboard.com> writes:\n\n> Hi\n>\n> 2025. 06. 24. 10:36 keltezéssel, Milan Zamazal írta:\n>> To support easy switching of configurations, let's introduce\n>> LIBCAMERA_CONFIG_NAME environment variable, which denotes:\n>> - The path of the configuration file to load if it is an absolute path; or\n>> - the path of the configuration file to load, relative to the configuration\n>>    directories.\n>> If such a configuration file doesn't exist, no custom configuration is\n>> loaded.\n>> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>\n>> ---\n>>   Documentation/runtime_configuration.rst |  8 ++++++\n>>   src/libcamera/global_configuration.cpp  | 33 ++++++++++++++++---------\n>>   2 files changed, 30 insertions(+), 11 deletions(-)\n>> diff --git a/Documentation/runtime_configuration.rst b/Documentation/runtime_configuration.rst\n>> index de74fa732..5648db7d7 100644\n>> --- a/Documentation/runtime_configuration.rst\n>> +++ b/Documentation/runtime_configuration.rst\n>> @@ -19,6 +19,14 @@ order:\n>>   - LIBCAMERA_SYSCONF_DIR/configuration.yaml\n>>   - /etc/libcamera/configuration.yaml\n>>   +The default name of the configuration file, configuration.yaml, can be\n>> +overridden in LIBCAMERA_CONFIG_NAME environment variable. The variable\n>> +can specify just an alternative configuration file name to be looked up\n>> +in the locations above, or it can contain a whole relative or absolute\n>> +path. If an absolute path is specified then it is the only location that\n>> +is used; if the given file doesn't exist then no configuration file is\n>> +read.\n>> +\n>>   The first configuration file found wins, contingent configuration files\n>>   in other locations are ignored.\n>>   diff --git a/src/libcamera/global_configuration.cpp b/src/libcamera/global_configuration.cpp\n>> index f7c69890c..2c3b6cf97 100644\n>> --- a/src/libcamera/global_configuration.cpp\n>> +++ b/src/libcamera/global_configuration.cpp\n>> @@ -23,13 +23,6 @@\n>>     namespace libcamera {\n>>   -namespace {\n>> -const std::vector<std::filesystem::path> globalConfigurationFiles = {\n>> -\tstd::filesystem::path(LIBCAMERA_SYSCONF_DIR) / \"configuration.yaml\",\n>> -\tstd::filesystem::path(\"/etc/libcamera/configuration.yaml\"),\n>> -};\n>> -}\n>> -\n>>   LOG_DEFINE_CATEGORY(Configuration)\n>>     /**\n>> @@ -74,6 +67,25 @@ bool GlobalConfiguration::loadFile(const std::filesystem::path &fileName)\n>>     bool GlobalConfiguration::load()\n>>   {\n>> +\tconst std::vector<std::filesystem::path> globalConfigurationDirectories = {\n>> +\t\tstd::filesystem::path(LIBCAMERA_SYSCONF_DIR),\n\nLet's avoid cycling discussions:\n\n> I would probably add `LIBCAMERA_DATA_DIR` after the above, so\n> e.g. `/usr/share/libcamera/configuration.yaml`\n> could be the configuration that libcamera ships by default. Although I suppose\n> it might not be too useful until configuration file merging is implemented.\n\nhttps://lists.libcamera.org/pipermail/libcamera-devel/2025-June/050991.html:\n\n  At the moment, we don't need a default configuration in\n  /usr/share/libcamera, maybe distributions could utilise it but they can\n  simply patch libcamera if they need to change e.g. some path.\n  /etc/libcamera is needed, for system-specific defaults.\n\nDo you agree or disagree?\n\n>> +\t\tstd::filesystem::path(\"/etc/libcamera\"),\n>\n> I am not sure if we want any hard-coded paths. I believe removing this won't affect\n> the vast majority, but e.g. if one wants a local installation with a custom prefix,\n> it might be surprising that libcamera loads configuration from outside.\n\nhttps://lists.libcamera.org/pipermail/libcamera-devel/2025-June/050992.html:\n\n  With the default /usr/local prefix, LIBCAMERA_SYSCONF_DIR is\n  /usr/local/etc, which makes sense.  Imagine somebody installs libcamera\n  from the sources to /usr/local, the idea is that /etc/libcamera should\n  still be looked up and have a preference.  Good or bad?\n\nOK, makes sense, if libcamera is installed both from a package manager\nand locally from the sources, they should have separate configurations.\n\n> Regards,\n> Barnabás Pőcze\n>\n>\n>> +\t};\n>> +\n>> +\tconst char *libcameraConfigName =\n>> +\t\tutils::secure_getenv(\"LIBCAMERA_CONFIG_NAME\");\n>> +\tif (!libcameraConfigName)\n>> +\t\tlibcameraConfigName = \"\";\n>> +\tstd::filesystem::path configName(libcameraConfigName);\n>> +\n>> +\tif (configName.is_absolute()) {\n>> +\t\tloadFile(configName);\n>> +\t\treturn !!yamlConfiguration_;\n>> +\t}\n>> +\n>> +\tif (configName.empty())\n>> +\t\tconfigName = std::filesystem::path(\"configuration.yaml\");\n>> +\n>>   \tstd::filesystem::path userConfigurationDirectory;\n>>   \tconst char *xdgConfigHome = utils::secure_getenv(\"XDG_CONFIG_HOME\");\n>>   \tif (xdgConfigHome) {\n>> @@ -87,15 +99,14 @@ bool GlobalConfiguration::load()\n>>     \tif (!userConfigurationDirectory.empty()) {\n>>   \t\tstd::filesystem::path user_configuration_file =\n>> -\t\t\tuserConfigurationDirectory / \"libcamera\" / \"configuration.yaml\";\n>> +\t\t\tuserConfigurationDirectory / \"libcamera\" / configName;\n>>   \t\tif (loadFile(user_configuration_file))\n>>   \t\t\treturn !!yamlConfiguration_;\n>>   \t}\n>>   -\tfor (const auto &path : globalConfigurationFiles) {\n>> -\t\tif (loadFile(path))\n>> +\tfor (const auto &path : globalConfigurationDirectories)\n>> +\t\tif (loadFile(path / configName))\n>>   \t\t\treturn !!yamlConfiguration_;\n>> -\t}\n>>     \tyamlConfiguration_ = std::make_unique<YamlObject>();\n>>   \treturn true;","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 677AEBDCBF\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 27 Jun 2025 21:35:57 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 2A45368E04;\n\tFri, 27 Jun 2025 23:35:56 +0200 (CEST)","from us-smtp-delivery-124.mimecast.com\n\t(us-smtp-delivery-124.mimecast.com [170.10.133.124])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 806F768DE5\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 27 Jun 2025 23:35:54 +0200 (CEST)","from mail-wr1-f72.google.com (mail-wr1-f72.google.com\n\t[209.85.221.72]) by relay.mimecast.com with ESMTP with STARTTLS\n\t(version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n\tus-mta-636-Yofuw4H3Mh-cwrKLZc7meA-1; Fri, 27 Jun 2025 17:32:19 -0400","by mail-wr1-f72.google.com with SMTP id\n\tffacd0b85a97d-3a578958000so76658f8f.3\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 27 Jun 2025 14:32:19 -0700 (PDT)","from mzamazal-thinkpadp1gen7.tpbc.csb\n\t(ip-77-48-47-2.net.vodafone.cz. [77.48.47.2])\n\tby smtp.gmail.com with ESMTPSA id\n\tffacd0b85a97d-3a88c7e74fbsm3772370f8f.10.2025.06.27.14.32.16\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tFri, 27 Jun 2025 14:32:16 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=redhat.com header.i=@redhat.com\n\theader.b=\"e5WFdAY/\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1751060153;\n\th=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n\tto:to:cc:cc:mime-version:mime-version:content-type:content-type:\n\tcontent-transfer-encoding:content-transfer-encoding:\n\tin-reply-to:in-reply-to:references:references;\n\tbh=BoLLN7Qa+D+iYHckrEj5Ihd2fkMICYwx+856lPrOaEU=;\n\tb=e5WFdAY/oTRI2RZoNxNilhWYQb8IBdI6RJBLcLKojqfqeMDHcfIL4ZIWYJLLMDtNiYmhz5\n\t2paV7wQIeEuS4HBrQ/ABF/KdEZhqM6GLzYUbBqR2g7rfoy67Je/BeYpHAP9wlAJN47flkv\n\ta6RUokwdkBCUxCxLZB6hVIO++o0c3bI=","X-MC-Unique":"Yofuw4H3Mh-cwrKLZc7meA-1","X-Mimecast-MFC-AGG-ID":"Yofuw4H3Mh-cwrKLZc7meA_1751059938","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1751059938; x=1751664738;\n\th=content-transfer-encoding:mime-version:user-agent:message-id:date\n\t:references:in-reply-to:subject:cc:to:from:x-gm-message-state:from\n\t:to:cc:subject:date:message-id:reply-to;\n\tbh=Y18hAdZtICwTgqhs3TYRH8tAoh3MM9rac+xY+bZbO24=;\n\tb=WJI+AOE2guvdtfOqVi8D4JE0zv83QA86bRjsWCsMGzaSV7SyceYLhGNZEVZxUmCiAb\n\t39b+Tri1l7PwRQDJ/pihTNlCfUB9YnT0ZXMLrnp7Yl9sPOzQKxhFt6aQ7Y55aRfcTd2S\n\tivNf5s5Y/pYpY2TS4LphFGkONVmxTZjBsoD4YWYeSkAFJzHgIDlT1I4yiKECuRVmzc5f\n\trTV64hf9HqpDdM7IVGVLme+I+Hx+UK+t8UhvBssqQ8w8dJQQRMrnHwlm8dlE5ZXRGSpW\n\t2DGmjETcZKYN8u7B57/XoUxoGrnn031ZUnEFoXWaUFo7uk5ivH+WFR+XfYOjlqyyLfjZ\n\tieCg==","X-Gm-Message-State":"AOJu0YxbbK20Qo8ltY887OYis2oK/oB5akgMPBXtgMWf1ynd/lIwIXxX\n\tXq4DTKHW2QE5sEZY4HRkCtJxrNSvAOoLNKExoJvnsOStiGOhPg2Se0yAb+cDVQkFT5PImGoKg5V\n\tXkZhm6Cv9RX7b58y9FOghBbd8BaxCpw7nMHzR85eg0LJytp+9so5lMDhN6lHnKSUlAJAJaqvo61\n\tFm1/mADMw=","X-Gm-Gg":"ASbGnctbXCZnV2pIBFOe94Mgoxs76IVUcpaFf7fmp5pZSgzBHyxZ/u2ouAlKZ7NvMCC\n\tjTnSOwC2pq0yJ8HlhHk+TSQKBEml5BLQXII8YzeOdviuYNmvVtgaKvsE72F/IG22XdG9WsSX9wr\n\tmxp+kw4gyRTwpC884KEQcmBDL6pBxP03jrT2735gHqtlz8MT4Rytw1+ImzlezAGkB6NNkb4/fu9\n\tbeFawRJl8mWwLBstOKf/266TcUad0lGCIfVxqdi7K3ihcJjDUP7Lkb7Jfw6rtRv/WxDKyqjOq1s\n\t/YzUKY85ZMbV8WxPvD0yQiFHt80wORLp95kthqRVSnbmKrTxchhmzwyM4gCkFDOrvxP5c6zPLZ0\n\t=","X-Received":["by 2002:a05:6000:1a8f:b0:3a4:ead4:5ea4 with SMTP id\n\tffacd0b85a97d-3a8f53ab011mr4538144f8f.24.1751059937615; \n\tFri, 27 Jun 2025 14:32:17 -0700 (PDT)","by 2002:a05:6000:1a8f:b0:3a4:ead4:5ea4 with SMTP id\n\tffacd0b85a97d-3a8f53ab011mr4538131f8f.24.1751059937210; \n\tFri, 27 Jun 2025 14:32:17 -0700 (PDT)"],"X-Google-Smtp-Source":"AGHT+IFWa4GnaOsOfIYjO5sNqch+mlwQX2VUVIBq9AuRtBg9qLGP0Nv5bDT605+RVFtsbpZd4l+K+Q==","From":"Milan Zamazal <mzamazal@redhat.com>","To":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org,  Kieran Bingham\n\t<kieran.bingham@ideasonboard.com>,  Laurent Pinchart\n\t<laurent.pinchart@ideasonboard.com>","Subject":"Re: [PATCH v11 11/12] config: Make configuration file configurable","In-Reply-To":"<aadfb17d-2fe4-45f9-a5ec-f62dc8e4ec5c@ideasonboard.com> (\n\t=?utf-8?b?IkJhcm5hYsOhcyBQxZFjemUiJ3M=?= message of \"Fri,\n\t27 Jun 2025  16:00:44 +0200\")","References":"<20250624083612.27230-1-mzamazal@redhat.com>\n\t<20250624083612.27230-12-mzamazal@redhat.com>\n\t<aadfb17d-2fe4-45f9-a5ec-f62dc8e4ec5c@ideasonboard.com>","Date":"Fri, 27 Jun 2025 23:32:15 +0200","Message-ID":"<85pleovpk0.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","User-Agent":"Gnus/5.13 (Gnus v5.13)","MIME-Version":"1.0","X-Mimecast-Spam-Score":"0","X-Mimecast-MFC-PROC-ID":"-SVGoI8LE9kkEhneX2s-WN5BBc-U-QCgjQhG0vIDdj8_1751059938","X-Mimecast-Originator":"redhat.com","Content-Type":"text/plain; charset=utf-8","Content-Transfer-Encoding":"quoted-printable","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":34726,"web_url":"https://patchwork.libcamera.org/comment/34726/","msgid":"<b1088691-7ba2-49bc-9037-e7fc89c5c4d3@ideasonboard.com>","date":"2025-06-30T08:27:57","subject":"Re: [PATCH v11 11/12] config: Make configuration file configurable","submitter":{"id":216,"url":"https://patchwork.libcamera.org/api/people/216/","name":"Barnabás Pőcze","email":"barnabas.pocze@ideasonboard.com"},"content":"Hi\n\n2025. 06. 27. 23:32 keltezéssel, Milan Zamazal írta:\n> Hi Barnabás,\n> \n> Barnabás Pőcze <barnabas.pocze@ideasonboard.com> writes:\n> \n>> Hi\n>>\n>> 2025. 06. 24. 10:36 keltezéssel, Milan Zamazal írta:\n>>> To support easy switching of configurations, let's introduce\n>>> LIBCAMERA_CONFIG_NAME environment variable, which denotes:\n>>> - The path of the configuration file to load if it is an absolute path; or\n>>> - the path of the configuration file to load, relative to the configuration\n>>>     directories.\n>>> If such a configuration file doesn't exist, no custom configuration is\n>>> loaded.\n>>> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>\n>>> ---\n>>>    Documentation/runtime_configuration.rst |  8 ++++++\n>>>    src/libcamera/global_configuration.cpp  | 33 ++++++++++++++++---------\n>>>    2 files changed, 30 insertions(+), 11 deletions(-)\n>>> diff --git a/Documentation/runtime_configuration.rst b/Documentation/runtime_configuration.rst\n>>> index de74fa732..5648db7d7 100644\n>>> --- a/Documentation/runtime_configuration.rst\n>>> +++ b/Documentation/runtime_configuration.rst\n>>> @@ -19,6 +19,14 @@ order:\n>>>    - LIBCAMERA_SYSCONF_DIR/configuration.yaml\n>>>    - /etc/libcamera/configuration.yaml\n>>>    +The default name of the configuration file, configuration.yaml, can be\n>>> +overridden in LIBCAMERA_CONFIG_NAME environment variable. The variable\n>>> +can specify just an alternative configuration file name to be looked up\n>>> +in the locations above, or it can contain a whole relative or absolute\n>>> +path. If an absolute path is specified then it is the only location that\n>>> +is used; if the given file doesn't exist then no configuration file is\n>>> +read.\n>>> +\n>>>    The first configuration file found wins, contingent configuration files\n>>>    in other locations are ignored.\n>>>    diff --git a/src/libcamera/global_configuration.cpp b/src/libcamera/global_configuration.cpp\n>>> index f7c69890c..2c3b6cf97 100644\n>>> --- a/src/libcamera/global_configuration.cpp\n>>> +++ b/src/libcamera/global_configuration.cpp\n>>> @@ -23,13 +23,6 @@\n>>>      namespace libcamera {\n>>>    -namespace {\n>>> -const std::vector<std::filesystem::path> globalConfigurationFiles = {\n>>> -\tstd::filesystem::path(LIBCAMERA_SYSCONF_DIR) / \"configuration.yaml\",\n>>> -\tstd::filesystem::path(\"/etc/libcamera/configuration.yaml\"),\n>>> -};\n>>> -}\n>>> -\n>>>    LOG_DEFINE_CATEGORY(Configuration)\n>>>      /**\n>>> @@ -74,6 +67,25 @@ bool GlobalConfiguration::loadFile(const std::filesystem::path &fileName)\n>>>      bool GlobalConfiguration::load()\n>>>    {\n>>> +\tconst std::vector<std::filesystem::path> globalConfigurationDirectories = {\n>>> +\t\tstd::filesystem::path(LIBCAMERA_SYSCONF_DIR),\n> \n> Let's avoid cycling discussions:\n> \n>> I would probably add `LIBCAMERA_DATA_DIR` after the above, so\n>> e.g. `/usr/share/libcamera/configuration.yaml`\n>> could be the configuration that libcamera ships by default. Although I suppose\n>> it might not be too useful until configuration file merging is implemented.\n> \n> https://lists.libcamera.org/pipermail/libcamera-devel/2025-June/050991.html:\n> \n>    At the moment, we don't need a default configuration in\n>    /usr/share/libcamera, maybe distributions could utilise it but they can\n>    simply patch libcamera if they need to change e.g. some path.\n>    /etc/libcamera is needed, for system-specific defaults.\n> \n> Do you agree or disagree?\n\nOops, sorry, I forgot about the earlier conversation. I agree with the above paragraph\nexcept I don't necessarily believe that patching libcamera should be \"the way\" (or maybe\nI misunderstand what you mean by that). I still think that in the future libcamera will\nprobably want to ship some kind of default configuration file, and I think that should go\nto $LIBCAMERA_DATA_DIR. Since no such configuration file is introduced here, I think it's\nfine to just omit LIBCAMERA_DATA_DIR for now; but I feel like it might be forgotten when\na default configuration file is added / configuration file merging is implemented. So if\nthere are no objections to the above \"future plans\", then my preference is adding it,\neven if it is not really used at the moment.\n\n\n> \n>>> +\t\tstd::filesystem::path(\"/etc/libcamera\"),\n>>\n>> I am not sure if we want any hard-coded paths. I believe removing this won't affect\n>> the vast majority, but e.g. if one wants a local installation with a custom prefix,\n>> it might be surprising that libcamera loads configuration from outside.\n> \n> https://lists.libcamera.org/pipermail/libcamera-devel/2025-June/050992.html:\n> \n>    With the default /usr/local prefix, LIBCAMERA_SYSCONF_DIR is\n>    /usr/local/etc, which makes sense.  Imagine somebody installs libcamera\n>    from the sources to /usr/local, the idea is that /etc/libcamera should\n>    still be looked up and have a preference.  Good or bad?\n> \n> OK, makes sense, if libcamera is installed both from a package manager\n> and locally from the sources, they should have separate configurations.\n\nEspecially if one is a development version for testing or similar, maybe they need\ndifferent options, etc. After thinking more, I believe both (having hard-coded\n/etc/libcamera and not) can be reasonable choices. But in the end my preference\nis not having hard-coded /etc/libcamera.\n\n\nRegards,\nBarnabás Pőcze\n\n> \n>> Regards,\n>> Barnabás Pőcze\n>>\n>>\n>>> +\t};\n>>> +\n>>> +\tconst char *libcameraConfigName =\n>>> +\t\tutils::secure_getenv(\"LIBCAMERA_CONFIG_NAME\");\n>>> +\tif (!libcameraConfigName)\n>>> +\t\tlibcameraConfigName = \"\";\n>>> +\tstd::filesystem::path configName(libcameraConfigName);\n>>> +\n>>> +\tif (configName.is_absolute()) {\n>>> +\t\tloadFile(configName);\n>>> +\t\treturn !!yamlConfiguration_;\n>>> +\t}\n>>> +\n>>> +\tif (configName.empty())\n>>> +\t\tconfigName = std::filesystem::path(\"configuration.yaml\");\n>>> +\n>>>    \tstd::filesystem::path userConfigurationDirectory;\n>>>    \tconst char *xdgConfigHome = utils::secure_getenv(\"XDG_CONFIG_HOME\");\n>>>    \tif (xdgConfigHome) {\n>>> @@ -87,15 +99,14 @@ bool GlobalConfiguration::load()\n>>>      \tif (!userConfigurationDirectory.empty()) {\n>>>    \t\tstd::filesystem::path user_configuration_file =\n>>> -\t\t\tuserConfigurationDirectory / \"libcamera\" / \"configuration.yaml\";\n>>> +\t\t\tuserConfigurationDirectory / \"libcamera\" / configName;\n>>>    \t\tif (loadFile(user_configuration_file))\n>>>    \t\t\treturn !!yamlConfiguration_;\n>>>    \t}\n>>>    -\tfor (const auto &path : globalConfigurationFiles) {\n>>> -\t\tif (loadFile(path))\n>>> +\tfor (const auto &path : globalConfigurationDirectories)\n>>> +\t\tif (loadFile(path / configName))\n>>>    \t\t\treturn !!yamlConfiguration_;\n>>> -\t}\n>>>      \tyamlConfiguration_ = std::make_unique<YamlObject>();\n>>>    \treturn true;\n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id C73B6C3237\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 30 Jun 2025 08:28:04 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 5F3E068E06;\n\tMon, 30 Jun 2025 10:28:03 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id F279F68E00\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 30 Jun 2025 10:28:01 +0200 (CEST)","from [192.168.33.21] (185.221.143.107.nat.pool.zt.hu\n\t[185.221.143.107])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 3E4046BE;\n\tMon, 30 Jun 2025 10:27:40 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"hsSZl8s8\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1751272060;\n\tbh=IrRJ4HUB3hJGErTBwgqpfs7IcGNCvEdYGMhszBnMN6Q=;\n\th=Date:Subject:To:Cc:References:From:In-Reply-To:From;\n\tb=hsSZl8s8q49K1XrQNmv39LC6buDTKMmlUK810HSt2ThsiwC6YWYP/AVyKYJXmZPwW\n\tydwYYeapsqrmYhCyLXzTkOqsv5A0cgkeaUiSMwZrPkReuhh0Mj314b4G0PFDEH+M/4\n\t62g8jv1eWRFE1pJdyPMjdLBcrx+jNc2rYfGFaoUY=","Message-ID":"<b1088691-7ba2-49bc-9037-e7fc89c5c4d3@ideasonboard.com>","Date":"Mon, 30 Jun 2025 10:27:57 +0200","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH v11 11/12] config: Make configuration file configurable","To":"Milan Zamazal <mzamazal@redhat.com>","Cc":"libcamera-devel@lists.libcamera.org,\n\tKieran Bingham <kieran.bingham@ideasonboard.com>,\n\tLaurent Pinchart <laurent.pinchart@ideasonboard.com>","References":"<20250624083612.27230-1-mzamazal@redhat.com>\n\t<20250624083612.27230-12-mzamazal@redhat.com>\n\t<aadfb17d-2fe4-45f9-a5ec-f62dc8e4ec5c@ideasonboard.com>\n\t<85pleovpk0.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","From":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","Content-Language":"en-US, hu-HU","In-Reply-To":"<85pleovpk0.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"8bit","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":34731,"web_url":"https://patchwork.libcamera.org/comment/34731/","msgid":"<85ikkdef0h.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","date":"2025-06-30T09:48:46","subject":"Re: [PATCH v11 11/12] config: Make configuration file configurable","submitter":{"id":177,"url":"https://patchwork.libcamera.org/api/people/177/","name":"Milan Zamazal","email":"mzamazal@redhat.com"},"content":"Barnabás Pőcze <barnabas.pocze@ideasonboard.com> writes:\n\n> Hi\n>\n> 2025. 06. 27. 23:32 keltezéssel, Milan Zamazal írta:\n>> Hi Barnabás,\n>> Barnabás Pőcze <barnabas.pocze@ideasonboard.com> writes:\n>> \n>>> Hi\n>>>\n>>> 2025. 06. 24. 10:36 keltezéssel, Milan Zamazal írta:\n>>>> To support easy switching of configurations, let's introduce\n>>>> LIBCAMERA_CONFIG_NAME environment variable, which denotes:\n>>>> - The path of the configuration file to load if it is an absolute path; or\n>>>> - the path of the configuration file to load, relative to the configuration\n>>>>     directories.\n>>>> If such a configuration file doesn't exist, no custom configuration is\n>>>> loaded.\n>>>> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>\n>>>> ---\n>>>>    Documentation/runtime_configuration.rst |  8 ++++++\n>>>>    src/libcamera/global_configuration.cpp  | 33 ++++++++++++++++---------\n>>>>    2 files changed, 30 insertions(+), 11 deletions(-)\n>>>> diff --git a/Documentation/runtime_configuration.rst b/Documentation/runtime_configuration.rst\n>>>> index de74fa732..5648db7d7 100644\n>>>> --- a/Documentation/runtime_configuration.rst\n>>>> +++ b/Documentation/runtime_configuration.rst\n>>>> @@ -19,6 +19,14 @@ order:\n>>>>    - LIBCAMERA_SYSCONF_DIR/configuration.yaml\n>>>>    - /etc/libcamera/configuration.yaml\n>>>>    +The default name of the configuration file, configuration.yaml, can be\n>>>> +overridden in LIBCAMERA_CONFIG_NAME environment variable. The variable\n>>>> +can specify just an alternative configuration file name to be looked up\n>>>> +in the locations above, or it can contain a whole relative or absolute\n>>>> +path. If an absolute path is specified then it is the only location that\n>>>> +is used; if the given file doesn't exist then no configuration file is\n>>>> +read.\n>>>> +\n>>>>    The first configuration file found wins, contingent configuration files\n>>>>    in other locations are ignored.\n>>>>    diff --git a/src/libcamera/global_configuration.cpp b/src/libcamera/global_configuration.cpp\n>>>> index f7c69890c..2c3b6cf97 100644\n>>>> --- a/src/libcamera/global_configuration.cpp\n>>>> +++ b/src/libcamera/global_configuration.cpp\n>>>> @@ -23,13 +23,6 @@\n>>>>      namespace libcamera {\n>>>>    -namespace {\n>>>> -const std::vector<std::filesystem::path> globalConfigurationFiles = {\n>>>> -\tstd::filesystem::path(LIBCAMERA_SYSCONF_DIR) / \"configuration.yaml\",\n>>>> -\tstd::filesystem::path(\"/etc/libcamera/configuration.yaml\"),\n>>>> -};\n>>>> -}\n>>>> -\n>>>>    LOG_DEFINE_CATEGORY(Configuration)\n>>>>      /**\n>>>> @@ -74,6 +67,25 @@ bool GlobalConfiguration::loadFile(const std::filesystem::path &fileName)\n>>>>      bool GlobalConfiguration::load()\n>>>>    {\n>>>> +\tconst std::vector<std::filesystem::path> globalConfigurationDirectories = {\n>>>> +\t\tstd::filesystem::path(LIBCAMERA_SYSCONF_DIR),\n>> Let's avoid cycling discussions:\n>> \n>>> I would probably add `LIBCAMERA_DATA_DIR` after the above, so\n>>> e.g. `/usr/share/libcamera/configuration.yaml`\n>>> could be the configuration that libcamera ships by default. Although I suppose\n>>> it might not be too useful until configuration file merging is implemented.\n>> https://lists.libcamera.org/pipermail/libcamera-devel/2025-June/050991.html:\n>>    At the moment, we don't need a default configuration in\n>>    /usr/share/libcamera, maybe distributions could utilise it but they can\n>>    simply patch libcamera if they need to change e.g. some path.\n>>    /etc/libcamera is needed, for system-specific defaults.\n>> Do you agree or disagree?\n>\n> Oops, sorry, I forgot about the earlier conversation. I agree with the above paragraph\n> except I don't necessarily believe that patching libcamera should be \"the way\" (or maybe\n> I misunderstand what you mean by that). \n\nI primarily meant when a distribution uses non-standard paths generally\n(think about e.g. NixOS) or perhaps in this specific case.\n\n> I still think that in the future libcamera will probably want to ship\n> some kind of default configuration file, and I think that should go to\n> $LIBCAMERA_DATA_DIR. Since no such configuration file is introduced\n> here, I think it's fine to just omit LIBCAMERA_DATA_DIR for now; but I\n> feel like it might be forgotten when a default configuration file is\n> added / configuration file merging is implemented. So if there are no\n> objections to the above \"future plans\", then my preference is adding\n> it, even if it is not really used at the moment.\n\nThere have been no objections so far (and I don't really object either)\nso I can change it this way.\n\n>>>> +\t\tstd::filesystem::path(\"/etc/libcamera\"),\n>>>\n>>> I am not sure if we want any hard-coded paths. I believe removing this won't affect\n>>> the vast majority, but e.g. if one wants a local installation with a custom prefix,\n>>> it might be surprising that libcamera loads configuration from outside.\n>> https://lists.libcamera.org/pipermail/libcamera-devel/2025-June/050992.html:\n>>    With the default /usr/local prefix, LIBCAMERA_SYSCONF_DIR is\n>>    /usr/local/etc, which makes sense.  Imagine somebody installs libcamera\n>>    from the sources to /usr/local, the idea is that /etc/libcamera should\n>>    still be looked up and have a preference.  Good or bad?\n>> OK, makes sense, if libcamera is installed both from a package manager\n>> and locally from the sources, they should have separate configurations.\n>\n> Especially if one is a development version for testing or similar, maybe they need\n> different options, etc. After thinking more, I believe both (having hard-coded\n> /etc/libcamera and not) can be reasonable choices. But in the end my preference\n> is not having hard-coded /etc/libcamera.\n\nI can remove it.  It's easy to add later if needed.\n\n> Regards,\n> Barnabás Pőcze\n>\n>> \n>>> Regards,\n>>> Barnabás Pőcze\n>>>\n>>>\n>>>> +\t};\n>>>> +\n>>>> +\tconst char *libcameraConfigName =\n>>>> +\t\tutils::secure_getenv(\"LIBCAMERA_CONFIG_NAME\");\n>>>> +\tif (!libcameraConfigName)\n>>>> +\t\tlibcameraConfigName = \"\";\n>>>> +\tstd::filesystem::path configName(libcameraConfigName);\n>>>> +\n>>>> +\tif (configName.is_absolute()) {\n>>>> +\t\tloadFile(configName);\n>>>> +\t\treturn !!yamlConfiguration_;\n>>>> +\t}\n>>>> +\n>>>> +\tif (configName.empty())\n>>>> +\t\tconfigName = std::filesystem::path(\"configuration.yaml\");\n>>>> +\n>>>>    \tstd::filesystem::path userConfigurationDirectory;\n>>>>    \tconst char *xdgConfigHome = utils::secure_getenv(\"XDG_CONFIG_HOME\");\n>>>>    \tif (xdgConfigHome) {\n>>>> @@ -87,15 +99,14 @@ bool GlobalConfiguration::load()\n>>>>      \tif (!userConfigurationDirectory.empty()) {\n>>>>    \t\tstd::filesystem::path user_configuration_file =\n>>>> -\t\t\tuserConfigurationDirectory / \"libcamera\" / \"configuration.yaml\";\n>>>> +\t\t\tuserConfigurationDirectory / \"libcamera\" / configName;\n>>>>    \t\tif (loadFile(user_configuration_file))\n>>>>    \t\t\treturn !!yamlConfiguration_;\n>>>>    \t}\n>>>>    -\tfor (const auto &path : globalConfigurationFiles) {\n>>>> -\t\tif (loadFile(path))\n>>>> +\tfor (const auto &path : globalConfigurationDirectories)\n>>>> +\t\tif (loadFile(path / configName))\n>>>>    \t\t\treturn !!yamlConfiguration_;\n>>>> -\t}\n>>>>      \tyamlConfiguration_ = std::make_unique<YamlObject>();\n>>>>    \treturn true;\n>>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 48B69C3237\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 30 Jun 2025 09:48:54 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 083AB68E05;\n\tMon, 30 Jun 2025 11:48:53 +0200 (CEST)","from us-smtp-delivery-124.mimecast.com\n\t(us-smtp-delivery-124.mimecast.com [170.10.133.124])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id C9B8A61529\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 30 Jun 2025 11:48:51 +0200 (CEST)","from mail-ej1-f69.google.com (mail-ej1-f69.google.com\n\t[209.85.218.69]) by relay.mimecast.com with ESMTP with STARTTLS\n\t(version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n\tus-mta-422-PDW-NpBTM_S8IWmjxrOMoA-1; Mon, 30 Jun 2025 05:48:49 -0400","by mail-ej1-f69.google.com with SMTP id\n\ta640c23a62f3a-ae37a8f000bso78514766b.0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 30 Jun 2025 02:48:49 -0700 (PDT)","from mzamazal-thinkpadp1gen7.tpbc.csb\n\t(ip-77-48-47-2.net.vodafone.cz. [77.48.47.2])\n\tby smtp.gmail.com with ESMTPSA id\n\ta640c23a62f3a-ae353c6bd2dsm643205266b.113.2025.06.30.02.48.46\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tMon, 30 Jun 2025 02:48:46 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=redhat.com header.i=@redhat.com\n\theader.b=\"HXwQB6Md\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1751276930;\n\th=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n\tto:to:cc:cc:mime-version:mime-version:content-type:content-type:\n\tcontent-transfer-encoding:content-transfer-encoding:\n\tin-reply-to:in-reply-to:references:references;\n\tbh=BUxvh1NWz1G7u+TN/5sBN52D4/+c+ocJemowGSevEmI=;\n\tb=HXwQB6Mdq4qwPYsEPiO1LLmHlNndRyh2nhcdvemPuLGp2p1ITmobvgO5MGCtZkdSQMfL5C\n\tpoYr623F8hy8oNSCtD/vkrATL3ebcB38Ju8+t6N6OgS2IEo/3K6hz7WrUNgrMjD0Qjb6wB\n\t/BygUbKVrFLdivkqyoP5KyApg6VBja8=","X-MC-Unique":"PDW-NpBTM_S8IWmjxrOMoA-1","X-Mimecast-MFC-AGG-ID":"PDW-NpBTM_S8IWmjxrOMoA_1751276928","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1751276928; x=1751881728;\n\th=content-transfer-encoding:mime-version:user-agent:message-id:date\n\t:references:in-reply-to:subject:cc:to:from:x-gm-message-state:from\n\t:to:cc:subject:date:message-id:reply-to;\n\tbh=hvOcNzxNC4uJtQaM8RjpUdUFx2e3WMx981pbRWKjwoE=;\n\tb=OQoU/BZyx5gTMYkBO7YZ70MTGS0Ss5PoGQr7+Sod79C3PeN2J47HJID6jKnElv8LEl\n\tJ/PPf5+BFONGar52Wu+r2pExmwSwM7kMu2KibDLCSy73fE1HuTUWfdl2q5VGP0NGtfA/\n\tLlSwiHSRGkPEG8EKNAfDBpzGLGL7P+nVm8hlg/UClQ5GnetD0hz+F9t0ewNB8M0j06kh\n\teQxuQSZJj8DgIGTFxtw+SEHcs9I8/406Urth84HSZGYxmJD0N8UTot0UwqO/OdYltA1D\n\tsKqOlJH1F7Boa5dPgtyxxXWAzcLbSCCGcfCxpkdAAsrfvX1/TX2TYCKP9arLX3vtM7YW\n\tg1Vw==","X-Gm-Message-State":"AOJu0Yzfsn7uM6K67tfUYkjdEUVs2n1rt/VDE7jabMSG3ROAwn/FQBFT\n\tdel+Ml1f8UO2EaPeXfPVgxhXDtpeVXep/a/tjlP6NKFQA/Q6mZt6F61DDqNgc/Gjl0ZloVWUJ5d\n\tMOv199nzqo9oEqIcNszaIMh2vFUJfIZsE5FFViy/33Wv6NyevRnFAIckGjVuVNXDYAsqO7ntN9r\n\tw=","X-Gm-Gg":"ASbGncvhkPlOHvHag0YPeUs5FmVemhmMkO2A7HWVMeCv7CjT5wz+hoWHI6Dhy22NI7u\n\tqoLVsc21u80tzLHY9andLsfy4ht8WMK6HWV2IpWITqKbZVr+/pqKR8hswRRXpTG0Q9EgFUeqphW\n\tt1qK8QwTS0yvQ6oo/Ch/yZoJNlYGzqzTHn6CPtyxk4IVdj5XlYQsmy5Qhps81VjrW9HMfC3uBfQ\n\tKXbwLuoJNvUrR+KWzv27oMNumBocIv46BM0TrMnuhMCehEcddwtyANY1zhKqS84QGKz/59YUBV2\n\tpb+ncWujllS5FA8nwbo+bIzd9asnynZ2LfPohQUyJwEz5RQREtc0HGM3O+YglZfmXCnFDpPuCs8\n\t=","X-Received":["by 2002:a17:907:728e:b0:ad8:8621:9268 with SMTP id\n\ta640c23a62f3a-ae35020a9e0mr1177355466b.59.1751276927929; \n\tMon, 30 Jun 2025 02:48:47 -0700 (PDT)","by 2002:a17:907:728e:b0:ad8:8621:9268 with SMTP id\n\ta640c23a62f3a-ae35020a9e0mr1177352766b.59.1751276927366; \n\tMon, 30 Jun 2025 02:48:47 -0700 (PDT)"],"X-Google-Smtp-Source":"AGHT+IF3L4q5G/s7WAJHIi8toNzqmh6wthP4seUkC1JT9jLjxXIU9mv1zNuzlbEwPwLc+HhGvO9c0g==","From":"Milan Zamazal <mzamazal@redhat.com>","To":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org,  Kieran Bingham\n\t<kieran.bingham@ideasonboard.com>,  Laurent Pinchart\n\t<laurent.pinchart@ideasonboard.com>","Subject":"Re: [PATCH v11 11/12] config: Make configuration file configurable","In-Reply-To":"<b1088691-7ba2-49bc-9037-e7fc89c5c4d3@ideasonboard.com> (\n\t=?utf-8?b?IkJhcm5hYsOhcyBQxZFjemUiJ3M=?= message of \"Mon,\n\t30 Jun 2025  10:27:57 +0200\")","References":"<20250624083612.27230-1-mzamazal@redhat.com>\n\t<20250624083612.27230-12-mzamazal@redhat.com>\n\t<aadfb17d-2fe4-45f9-a5ec-f62dc8e4ec5c@ideasonboard.com>\n\t<85pleovpk0.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>\n\t<b1088691-7ba2-49bc-9037-e7fc89c5c4d3@ideasonboard.com>","Date":"Mon, 30 Jun 2025 11:48:46 +0200","Message-ID":"<85ikkdef0h.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","User-Agent":"Gnus/5.13 (Gnus v5.13)","MIME-Version":"1.0","X-Mimecast-Spam-Score":"0","X-Mimecast-MFC-PROC-ID":"aBeYjNagEhEGPRNWauugkzd3ufKBomR6QDGk0e3ugnk_1751276928","X-Mimecast-Originator":"redhat.com","Content-Type":"text/plain; charset=utf-8","Content-Transfer-Encoding":"quoted-printable","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]