[{"id":35502,"web_url":"https://patchwork.libcamera.org/comment/35502/","msgid":"<707476ce-1f2e-4cdf-a228-02051c632d89@ideasonboard.com>","date":"2025-08-19T08:42:49","subject":"Re: [PATCH 2/2] meson: Check for Python modules manually","submitter":{"id":109,"url":"https://patchwork.libcamera.org/api/people/109/","name":"Tomi Valkeinen","email":"tomi.valkeinen@ideasonboard.com"},"content":"Hi,\n\nOn 18/08/2025 15:11, Laurent Pinchart wrote:\n> The meson python module's find_installation() method conveniently allows\n> testing if the interpreter provides a set of modules. We use it to check\n> for the presence of the modules required at build time. Unfortunately,\n> the meson python module is not meant to access the native Python\n> interpreter of the build machine, but the Python environment of the host\n> machine. Usage of find_installation() for this purpose is incorrect, it\n> may find modules in a different interpreter than the one used to run the\n> build scripts that use those modules.\n\nSame comments here as for the previous patch. And I'm not sure if\n\"native\" helps here or just confuses... You can't use non-native Python\nanyway. Well, you could, with qemu.\n\nIn any case, with the desc changes for both patches:\n\nReviewed-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>\n\nI also wonder if there should be variables for the pythons, \"host_py\"\nand \"build_py\", that could be used in the meson files.\n\n Tomi\n\n> Replace find_installation() with a manual check using python3 directly.\n> \n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> ---\n>  meson.build | 11 ++++++++---\n>  1 file changed, 8 insertions(+), 3 deletions(-)\n> \n> diff --git a/meson.build b/meson.build\n> index d82dbaeb99ce..5e015692a22c 100644\n> --- a/meson.build\n> +++ b/meson.build\n> @@ -287,9 +287,14 @@ run_command('ln', '-fsT', meson.project_source_root(), meson.project_build_root(\n>  \n>  configure_file(output : 'config.h', configuration : config_h)\n>  \n> -# Check for python installation and modules.\n> -py_mod = import('python')\n> -py_mod.find_installation('python3', modules : py_modules)\n> +# Check for python modules.\n> +foreach module : py_modules\n> +    result = run_command('python3', '-c' , 'import @0@'.format(module),\n> +                         capture : false, check : false)\n> +    if result.returncode() != 0\n> +        error('Python module \\'@0@\\' not found'.format(module))\n> +    endif\n> +endforeach\n>  \n>  ## Summarise Configurations\n>  summary({","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 D00F6BDCC1\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 19 Aug 2025 08:42:55 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 99F4961421;\n\tTue, 19 Aug 2025 10:42:54 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 18EE761421\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 19 Aug 2025 10:42:53 +0200 (CEST)","from [192.168.88.20] (91-158-153-178.elisa-laajakaista.fi\n\t[91.158.153.178])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 1C0631A37;\n\tTue, 19 Aug 2025 10:41:55 +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=\"Wbj+CFyK\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1755592915;\n\tbh=rCDQyMG1um0pajXopDBvHuwSeX3nqJtacuvRJ+MhsXU=;\n\th=Date:Subject:To:References:From:In-Reply-To:From;\n\tb=Wbj+CFyKJTMbbTwoMDXnfEQgSzDRufa4YL1q19W61qQcRKVaiuHPwQKiW2zG5/5fm\n\t12G6MKv3wGbVv3cI1BNRMOjTIRZQJQZUUUjZo/htlkfV6hgF9P+kvVN143ODg/NBgL\n\t7dd54PjiHDCFS4qsMWg+/vDeURf4I8r+28sSws6A=","Message-ID":"<707476ce-1f2e-4cdf-a228-02051c632d89@ideasonboard.com>","Date":"Tue, 19 Aug 2025 11:42:49 +0300","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH 2/2] meson: Check for Python modules manually","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","References":"<20250818121103.20073-1-laurent.pinchart@ideasonboard.com>\n\t<20250818121103.20073-2-laurent.pinchart@ideasonboard.com>","Content-Language":"en-US","From":"Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>","Autocrypt":"addr=tomi.valkeinen@ideasonboard.com; keydata=\n\txsFNBE6ms0cBEACyizowecZqXfMZtnBniOieTuFdErHAUyxVgtmr0f5ZfIi9Z4l+uUN4Zdw2\n\twCEZjx3o0Z34diXBaMRJ3rAk9yB90UJAnLtb8A97Oq64DskLF81GCYB2P1i0qrG7UjpASgCA\n\tRu0lVvxsWyIwSfoYoLrazbT1wkWRs8YBkkXQFfL7Mn3ZMoGPcpfwYH9O7bV1NslbmyJzRCMO\n\teYV258gjCcwYlrkyIratlHCek4GrwV8Z9NQcjD5iLzrONjfafrWPwj6yn2RlL0mQEwt1lOvn\n\tLnI7QRtB3zxA3yB+FLsT1hx0va6xCHpX3QO2gBsyHCyVafFMrg3c/7IIWkDLngJxFgz6DLiA\n\tG4ld1QK/jsYqfP2GIMH1mFdjY+iagG4DqOsjip479HCWAptpNxSOCL6z3qxCU8MCz8iNOtZk\n\tDYXQWVscM5qgYSn+fmMM2qN+eoWlnCGVURZZLDjg387S2E1jT/dNTOsM/IqQj+ZROUZuRcF7\n\t0RTtuU5q1HnbRNwy+23xeoSGuwmLQ2UsUk7Q5CnrjYfiPo3wHze8avK95JBoSd+WIRmV3uoO\n\trXCoYOIRlDhg9XJTrbnQ3Ot5zOa0Y9c4IpyAlut6mDtxtKXr4+8OzjSVFww7tIwadTK3wDQv\n\tBus4jxHjS6dz1g2ypT65qnHen6mUUH63lhzewqO9peAHJ0SLrQARAQABzTBUb21pIFZhbGtl\n\taW5lbiA8dG9taS52YWxrZWluZW5AaWRlYXNvbmJvYXJkLmNvbT7CwY4EEwEIADgWIQTEOAw+\n\tll79gQef86f6PaqMvJYe9QUCX/HruAIbAwULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRD6\n\tPaqMvJYe9WmFD/99NGoD5lBJhlFDHMZvO+Op8vCwnIRZdTsyrtGl72rVh9xRfcSgYPZUvBuT\n\tVDxE53mY9HaZyu1eGMccYRBaTLJSfCXl/g317CrMNdY0k40b9YeIX10feiRYEWoDIPQ3tMmA\n\t0nHDygzcnuPiPT68JYZ6tUOvAt7r6OX/litM+m2/E9mtp8xCoWOo/kYO4mOAIoMNvLB8vufi\n\tuBB4e/AvAjtny4ScuNV5c5q8MkfNIiOyag9QCiQ/JfoAqzXRjVb4VZG72AKaElwipiKCWEcU\n\tR4+Bu5Qbaxj7Cd36M/bI54OrbWWETJkVVSV1i0tghCd6HHyquTdFl7wYcz6cL1hn/6byVnD+\n\tsR3BLvSBHYp8WSwv0TCuf6tLiNgHAO1hWiQ1pOoXyMEsxZlgPXT+wb4dbNVunckwqFjGxRbl\n\tRz7apFT/ZRwbazEzEzNyrBOfB55xdipG/2+SmFn0oMFqFOBEszXLQVslh64lI0CMJm2OYYe3\n\tPxHqYaztyeXsx13Bfnq9+bUynAQ4uW1P5DJ3OIRZWKmbQd/Me3Fq6TU57LsvwRgE0Le9PFQs\n\tdcP2071rMTpqTUteEgODJS4VDf4lXJfY91u32BJkiqM7/62Cqatcz5UWWHq5xeF03MIUTqdE\n\tqHWk3RJEoWHWQRzQfcx6Fn2fDAUKhAddvoopfcjAHfpAWJ+ENc7BTQROprNHARAAx0aat8GU\n\thsusCLc4MIxOQwidecCTRc9Dz/7U2goUwhw2O5j9TPqLtp57VITmHILnvZf6q3QAho2QMQyE\n\tDDvHubrdtEoqaaSKxKkFie1uhWNNvXPhwkKLYieyL9m2JdU+b88HaDnpzdyTTR4uH7wk0bBa\n\tKbTSgIFDDe5lXInypewPO30TmYNkFSexnnM3n1PBCqiJXsJahE4ZQ+WnV5FbPUj8T2zXS2xk\n\t0LZ0+DwKmZ0ZDovvdEWRWrz3UzJ8DLHb7blPpGhmqj3ANXQXC7mb9qJ6J/VSl61GbxIO2Dwb\n\txPNkHk8fwnxlUBCOyBti/uD2uSTgKHNdabhVm2dgFNVuS1y3bBHbI/qjC3J7rWE0WiaHWEqy\n\tUVPk8rsph4rqITsj2RiY70vEW0SKePrChvET7D8P1UPqmveBNNtSS7In+DdZ5kUqLV7rJnM9\n\t/4cwy+uZUt8cuCZlcA5u8IsBCNJudxEqBG10GHg1B6h1RZIz9Q9XfiBdaqa5+CjyFs8ua01c\n\t9HmyfkuhXG2OLjfQuK+Ygd56mV3lq0aFdwbaX16DG22c6flkkBSjyWXYepFtHz9KsBS0DaZb\n\t4IkLmZwEXpZcIOQjQ71fqlpiXkXSIaQ6YMEs8WjBbpP81h7QxWIfWtp+VnwNGc6nq5IQDESH\n\tmvQcsFS7d3eGVI6eyjCFdcAO8eMAEQEAAcLBXwQYAQIACQUCTqazRwIbDAAKCRD6PaqMvJYe\n\t9fA7EACS6exUedsBKmt4pT7nqXBcRsqm6YzT6DeCM8PWMTeaVGHiR4TnNFiT3otD5UpYQI7S\n\tsuYxoTdHrrrBzdlKe5rUWpzoZkVK6p0s9OIvGzLT0lrb0HC9iNDWT3JgpYDnk4Z2mFi6tTbq\n\txKMtpVFRA6FjviGDRsfkfoURZI51nf2RSAk/A8BEDDZ7lgJHskYoklSpwyrXhkp9FHGMaYII\n\tm9EKuUTX9JPDG2FTthCBrdsgWYPdJQvM+zscq09vFMQ9Fykbx5N8z/oFEUy3ACyPqW2oyfvU\n\tCH5WDpWBG0s5BALp1gBJPytIAd/pY/5ZdNoi0Cx3+Z7jaBFEyYJdWy1hGddpkgnMjyOfLI7B\n\tCFrdecTZbR5upjNSDvQ7RG85SnpYJTIin+SAUazAeA2nS6gTZzumgtdw8XmVXZwdBfF+ICof\n\t92UkbYcYNbzWO/GHgsNT1WnM4sa9lwCSWH8Fw1o/3bX1VVPEsnESOfxkNdu+gAF5S6+I6n3a\n\tueeIlwJl5CpT5l8RpoZXEOVtXYn8zzOJ7oGZYINRV9Pf8qKGLf3Dft7zKBP832I3PQjeok7F\n\tyjt+9S+KgSFSHP3Pa4E7lsSdWhSlHYNdG/czhoUkSCN09C0rEK93wxACx3vtxPLjXu6RptBw\n\t3dRq7n+mQChEB1am0BueV1JZaBboIL0AGlSJkm23kw==","In-Reply-To":"<20250818121103.20073-2-laurent.pinchart@ideasonboard.com>","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"7bit","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":35504,"web_url":"https://patchwork.libcamera.org/comment/35504/","msgid":"<20250819091406.GP5862@pendragon.ideasonboard.com>","date":"2025-08-19T09:14:06","subject":"Re: [PATCH 2/2] meson: Check for Python modules manually","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"On Tue, Aug 19, 2025 at 11:42:49AM +0300, Tomi Valkeinen wrote:\n> On 18/08/2025 15:11, Laurent Pinchart wrote:\n> > The meson python module's find_installation() method conveniently allows\n> > testing if the interpreter provides a set of modules. We use it to check\n> > for the presence of the modules required at build time. Unfortunately,\n> > the meson python module is not meant to access the native Python\n> > interpreter of the build machine, but the Python environment of the host\n> > machine. Usage of find_installation() for this purpose is incorrect, it\n> > may find modules in a different interpreter than the one used to run the\n> > build scripts that use those modules.\n> \n> Same comments here as for the previous patch. And I'm not sure if\n> \"native\" helps here or just confuses...\n\nI'll replace \"native\" with \"system\". I'll rewrite the commit message as\n\n----------\nThe meson python module's find_installation() method conveniently allows\ntesting if the interpreter provides a set of modules. We use it to check\nfor the presence of the modules required at build time. Unfortunately,\nthe meson python module is not meant to access the system Python\ninterpreter of the build machine, but the Python environment of the host\nmachine.\n\nUsage of find_installation() for this purpose is incorrect, it may find\nmodules in a different interpreter than the one used to run the build\nscripts that use those modules. For instance, when cross-compiling\nlibcamera against a Buildroot environment, and pointing meson in the\ncross-file to the build machine Python interpreter from Buildroot, the\nfind_installation() method will refer to the latter, while our code\ngeneration scripts that use the modules will use the former.\n\nReplace find_installation() with a manual check using python3 directly.\n----------\n\n> You can't use non-native Python\n> anyway. Well, you could, with qemu.\n\nThat's one workaround for the issues we're experiencing when\ncross-compiling, but I fear users would scream at me if I wanted to make\nthat mandatory :-)\n\n> In any case, with the desc changes for both patches:\n> \n> Reviewed-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>\n> \n> I also wonder if there should be variables for the pythons, \"host_py\"\n> and \"build_py\", that could be used in the meson files.\n\nWhat would you set those variables to ? Something like\n\nbuild_py = find_program('python3')\nhost_py = import('python').find_installation('python3')\n\n? I think they would both refer to the host interpreter.\n\n> > Replace find_installation() with a manual check using python3 directly.\n> > \n> > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> > ---\n> >  meson.build | 11 ++++++++---\n> >  1 file changed, 8 insertions(+), 3 deletions(-)\n> > \n> > diff --git a/meson.build b/meson.build\n> > index d82dbaeb99ce..5e015692a22c 100644\n> > --- a/meson.build\n> > +++ b/meson.build\n> > @@ -287,9 +287,14 @@ run_command('ln', '-fsT', meson.project_source_root(), meson.project_build_root(\n> >  \n> >  configure_file(output : 'config.h', configuration : config_h)\n> >  \n> > -# Check for python installation and modules.\n> > -py_mod = import('python')\n> > -py_mod.find_installation('python3', modules : py_modules)\n> > +# Check for python modules.\n> > +foreach module : py_modules\n> > +    result = run_command('python3', '-c' , 'import @0@'.format(module),\n> > +                         capture : false, check : false)\n> > +    if result.returncode() != 0\n> > +        error('Python module \\'@0@\\' not found'.format(module))\n> > +    endif\n> > +endforeach\n> >  \n> >  ## Summarise Configurations\n> >  summary({","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 8D1E4BDCC1\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 19 Aug 2025 09:14:32 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 42E20692CA;\n\tTue, 19 Aug 2025 11:14:31 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 5AF536923C\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 19 Aug 2025 11:14:29 +0200 (CEST)","from pendragon.ideasonboard.com (81-175-209-231.bb.dnainternet.fi\n\t[81.175.209.231])\n\tby perceval.ideasonboard.com (Postfix) with UTF8SMTPSA id 172DFC6D;\n\tTue, 19 Aug 2025 11:13:30 +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=\"Mg2yIDSj\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1755594811;\n\tbh=wKdY63aV+NVcpP0W0rWAlaXIBlESuB93sBs5U/GkwhI=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=Mg2yIDSjVvsEsnyifIZVFaKizt1d/AckZ4+vrSvzH1PYwWYLvh6phuEICMPJ2viPv\n\teAT54YKdReD+af82MuuM4S3uw5SKBLgHYZQv3U0Sh6Q4wPrmsmzRMl2Yy0zj643hrw\n\tE2YlLmS+gyntoEX7Nm/sInWXbZLLO2ZbC/DDaJKc=","Date":"Tue, 19 Aug 2025 12:14:06 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Subject":"Re: [PATCH 2/2] meson: Check for Python modules manually","Message-ID":"<20250819091406.GP5862@pendragon.ideasonboard.com>","References":"<20250818121103.20073-1-laurent.pinchart@ideasonboard.com>\n\t<20250818121103.20073-2-laurent.pinchart@ideasonboard.com>\n\t<707476ce-1f2e-4cdf-a228-02051c632d89@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<707476ce-1f2e-4cdf-a228-02051c632d89@ideasonboard.com>","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":35512,"web_url":"https://patchwork.libcamera.org/comment/35512/","msgid":"<e0c23c37-541d-480f-967e-c8253527e475@ideasonboard.com>","date":"2025-08-19T12:54:16","subject":"Re: [PATCH 2/2] meson: Check for Python modules manually","submitter":{"id":109,"url":"https://patchwork.libcamera.org/api/people/109/","name":"Tomi Valkeinen","email":"tomi.valkeinen@ideasonboard.com"},"content":"Hi,\n\nOn 19/08/2025 12:14, Laurent Pinchart wrote:\n> On Tue, Aug 19, 2025 at 11:42:49AM +0300, Tomi Valkeinen wrote:\n>> On 18/08/2025 15:11, Laurent Pinchart wrote:\n>>> The meson python module's find_installation() method conveniently allows\n>>> testing if the interpreter provides a set of modules. We use it to check\n>>> for the presence of the modules required at build time. Unfortunately,\n>>> the meson python module is not meant to access the native Python\n>>> interpreter of the build machine, but the Python environment of the host\n>>> machine. Usage of find_installation() for this purpose is incorrect, it\n>>> may find modules in a different interpreter than the one used to run the\n>>> build scripts that use those modules.\n>>\n>> Same comments here as for the previous patch. And I'm not sure if\n>> \"native\" helps here or just confuses...\n> \n> I'll replace \"native\" with \"system\". I'll rewrite the commit message as\n> \n> ----------\n> The meson python module's find_installation() method conveniently allows\n> testing if the interpreter provides a set of modules. We use it to check\n> for the presence of the modules required at build time. Unfortunately,\n> the meson python module is not meant to access the system Python\n> interpreter of the build machine, but the Python environment of the host\n> machine.\n> \n> Usage of find_installation() for this purpose is incorrect, it may find\n> modules in a different interpreter than the one used to run the build\n> scripts that use those modules. For instance, when cross-compiling\n> libcamera against a Buildroot environment, and pointing meson in the\n> cross-file to the build machine Python interpreter from Buildroot, the\n> find_installation() method will refer to the latter, while our code\n> generation scripts that use the modules will use the former.\n> \n> Replace find_installation() with a manual check using python3 directly.\n> ----------\n> \n>> You can't use non-native Python\n>> anyway. Well, you could, with qemu.\n> \n> That's one workaround for the issues we're experiencing when\n> cross-compiling, but I fear users would scream at me if I wanted to make\n> that mandatory :-)\n> \n>> In any case, with the desc changes for both patches:\n>>\n>> Reviewed-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>\n>>\n>> I also wonder if there should be variables for the pythons, \"host_py\"\n>> and \"build_py\", that could be used in the meson files.\n> \n> What would you set those variables to ? Something like\n> \n> build_py = find_program('python3')\n> host_py = import('python').find_installation('python3')\n> \n> ? I think they would both refer to the host interpreter.\n\nI'm confused... Didn't this this series just do that change? Switching\nfrom \"import('python').find_installation('python3')\" to (essentially)\n\"find_program('python3')\". And the point was that they are different?\n\nOh, wait, now I'm actually confused also on the meaning of the words. If\nI'm not mistaken, in autoconf terminology host and target are the same\nhere. We can't run the target interpreter. What do you mean with \"host\"?\n\nWhat we want is to distinguish between the system/distro python, and the\nbuild environment (buildroot's dev environment) python, right?\n\n Tomi","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 BB46BBD87C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 19 Aug 2025 12:54:21 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 00E1F692CB;\n\tTue, 19 Aug 2025 14:54:20 +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 5030669252\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 19 Aug 2025 14:54:19 +0200 (CEST)","from [192.168.88.20] (91-158-153-178.elisa-laajakaista.fi\n\t[91.158.153.178])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 3FB2A2391;\n\tTue, 19 Aug 2025 14:53:21 +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=\"Lx5iKYST\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1755608001;\n\tbh=NnZ3KZD0ct0Jj6tEn5sDdKz7Oeo5u1IP8q1GoYowqVw=;\n\th=Date:Subject:To:Cc:References:From:In-Reply-To:From;\n\tb=Lx5iKYSTwsFSY1dUdfTdYWX1YMSXsMHYXC8SkcudBGzmxf83Xtw+Sg0NjB6iAx0sS\n\tQ54nQuwR1INXemm7I6LWnrRuSMR9/lA2DPPp4V7pOC04qEDANYRnS5b/ev0ay0F00Q\n\tAKANaqdvozGNtZSS3em6uHgsHSItx0UuutUuLk/s=","Message-ID":"<e0c23c37-541d-480f-967e-c8253527e475@ideasonboard.com>","Date":"Tue, 19 Aug 2025 15:54:16 +0300","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH 2/2] meson: Check for Python modules manually","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","References":"<20250818121103.20073-1-laurent.pinchart@ideasonboard.com>\n\t<20250818121103.20073-2-laurent.pinchart@ideasonboard.com>\n\t<707476ce-1f2e-4cdf-a228-02051c632d89@ideasonboard.com>\n\t<20250819091406.GP5862@pendragon.ideasonboard.com>","Content-Language":"en-US","From":"Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>","Autocrypt":"addr=tomi.valkeinen@ideasonboard.com; keydata=\n\t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","In-Reply-To":"<20250819091406.GP5862@pendragon.ideasonboard.com>","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"7bit","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":35514,"web_url":"https://patchwork.libcamera.org/comment/35514/","msgid":"<7cdcaed8-ecdf-4cfa-9162-0ebff0a6e4ac@ideasonboard.com>","date":"2025-08-19T13:18:58","subject":"Re: [PATCH 2/2] meson: Check for Python modules manually","submitter":{"id":109,"url":"https://patchwork.libcamera.org/api/people/109/","name":"Tomi Valkeinen","email":"tomi.valkeinen@ideasonboard.com"},"content":"Hi again,\n\nOn 19/08/2025 15:54, Tomi Valkeinen wrote:\n> Hi,\n> \n> On 19/08/2025 12:14, Laurent Pinchart wrote:\n>> On Tue, Aug 19, 2025 at 11:42:49AM +0300, Tomi Valkeinen wrote:\n>>> On 18/08/2025 15:11, Laurent Pinchart wrote:\n>>>> The meson python module's find_installation() method conveniently allows\n>>>> testing if the interpreter provides a set of modules. We use it to check\n>>>> for the presence of the modules required at build time. Unfortunately,\n>>>> the meson python module is not meant to access the native Python\n>>>> interpreter of the build machine, but the Python environment of the host\n>>>> machine. Usage of find_installation() for this purpose is incorrect, it\n>>>> may find modules in a different interpreter than the one used to run the\n>>>> build scripts that use those modules.\n>>>\n>>> Same comments here as for the previous patch. And I'm not sure if\n>>> \"native\" helps here or just confuses...\n>>\n>> I'll replace \"native\" with \"system\". I'll rewrite the commit message as\n>>\n>> ----------\n>> The meson python module's find_installation() method conveniently allows\n>> testing if the interpreter provides a set of modules. We use it to check\n>> for the presence of the modules required at build time. Unfortunately,\n>> the meson python module is not meant to access the system Python\n>> interpreter of the build machine, but the Python environment of the host\n>> machine.\n>>\n>> Usage of find_installation() for this purpose is incorrect, it may find\n>> modules in a different interpreter than the one used to run the build\n>> scripts that use those modules. For instance, when cross-compiling\n>> libcamera against a Buildroot environment, and pointing meson in the\n>> cross-file to the build machine Python interpreter from Buildroot, the\n>> find_installation() method will refer to the latter, while our code\n>> generation scripts that use the modules will use the former.\n>>\n>> Replace find_installation() with a manual check using python3 directly.\n>> ----------\n>>\n>>> You can't use non-native Python\n>>> anyway. Well, you could, with qemu.\n>>\n>> That's one workaround for the issues we're experiencing when\n>> cross-compiling, but I fear users would scream at me if I wanted to make\n>> that mandatory :-)\n>>\n>>> In any case, with the desc changes for both patches:\n>>>\n>>> Reviewed-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>\n>>>\n>>> I also wonder if there should be variables for the pythons, \"host_py\"\n>>> and \"build_py\", that could be used in the meson files.\n>>\n>> What would you set those variables to ? Something like\n>>\n>> build_py = find_program('python3')\n>> host_py = import('python').find_installation('python3')\n>>\n>> ? I think they would both refer to the host interpreter.\n> \n> I'm confused... Didn't this this series just do that change? Switching\n> from \"import('python').find_installation('python3')\" to (essentially)\n> \"find_program('python3')\". And the point was that they are different?\n> \n> Oh, wait, now I'm actually confused also on the meaning of the words. If\n> I'm not mistaken, in autoconf terminology host and target are the same\n> here. We can't run the target interpreter. What do you mean with \"host\"?\n\nOk, saw your another email. So in your terms, \"build\" refers to the\nbuild environment (buildroot's \"host\"), and \"host\" means the target\n(buildroot's \"target\"). We also have the \"system\" (the distro, outside\nthe build env). Is this right?\n\nBut... no... In your example above, find_program('python3') returns the\nsystem python, but you assign it to build_py. And the other one is the\nbuild_py.\n\nSo: I'm even more confused now =).\n\n Tomi","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 77218BEFBE\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 19 Aug 2025 13:19:05 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 5C8DE692D4;\n\tTue, 19 Aug 2025 15:19:04 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 4136D692CA\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 19 Aug 2025 15:19:02 +0200 (CEST)","from [192.168.88.20] (91-158-153-178.elisa-laajakaista.fi\n\t[91.158.153.178])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 44F612391;\n\tTue, 19 Aug 2025 15:18:04 +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=\"vl8KgImT\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1755609484;\n\tbh=RzE2e6SxmRo5Ee+2R35WWvyE0r+uF7KeO0HTa+LzqX0=;\n\th=Date:Subject:From:To:Cc:References:In-Reply-To:From;\n\tb=vl8KgImTvZuZFCW/gAHaC+OGNDVmWt6chgi9nRXURaQytZu9oUTPUxGCKnys2fdlu\n\tWZanKdtb0t03r4la27ARZlkkZss7XJXf/SA50AgDElhatQ0WZn4OTeShhDZFmMcyU7\n\tQJFpdCkNzsiOFXQLqhewjrvmLqZZFOIQeIiCBQSs=","Message-ID":"<7cdcaed8-ecdf-4cfa-9162-0ebff0a6e4ac@ideasonboard.com>","Date":"Tue, 19 Aug 2025 16:18:58 +0300","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH 2/2] meson: Check for Python modules manually","From":"Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","References":"<20250818121103.20073-1-laurent.pinchart@ideasonboard.com>\n\t<20250818121103.20073-2-laurent.pinchart@ideasonboard.com>\n\t<707476ce-1f2e-4cdf-a228-02051c632d89@ideasonboard.com>\n\t<20250819091406.GP5862@pendragon.ideasonboard.com>\n\t<e0c23c37-541d-480f-967e-c8253527e475@ideasonboard.com>","Content-Language":"en-US","Autocrypt":"addr=tomi.valkeinen@ideasonboard.com; keydata=\n\t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","In-Reply-To":"<e0c23c37-541d-480f-967e-c8253527e475@ideasonboard.com>","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"7bit","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":35515,"web_url":"https://patchwork.libcamera.org/comment/35515/","msgid":"<20250819133020.GV5862@pendragon.ideasonboard.com>","date":"2025-08-19T13:30:20","subject":"Re: [PATCH 2/2] meson: Check for Python modules manually","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"On Tue, Aug 19, 2025 at 03:54:16PM +0300, Tomi Valkeinen wrote:\n> On 19/08/2025 12:14, Laurent Pinchart wrote:\n> > On Tue, Aug 19, 2025 at 11:42:49AM +0300, Tomi Valkeinen wrote:\n> >> On 18/08/2025 15:11, Laurent Pinchart wrote:\n> >>> The meson python module's find_installation() method conveniently allows\n> >>> testing if the interpreter provides a set of modules. We use it to check\n> >>> for the presence of the modules required at build time. Unfortunately,\n> >>> the meson python module is not meant to access the native Python\n> >>> interpreter of the build machine, but the Python environment of the host\n> >>> machine. Usage of find_installation() for this purpose is incorrect, it\n> >>> may find modules in a different interpreter than the one used to run the\n> >>> build scripts that use those modules.\n> >>\n> >> Same comments here as for the previous patch. And I'm not sure if\n> >> \"native\" helps here or just confuses...\n> > \n> > I'll replace \"native\" with \"system\". I'll rewrite the commit message as\n> > \n> > ----------\n> > The meson python module's find_installation() method conveniently allows\n> > testing if the interpreter provides a set of modules. We use it to check\n> > for the presence of the modules required at build time. Unfortunately,\n> > the meson python module is not meant to access the system Python\n> > interpreter of the build machine, but the Python environment of the host\n> > machine.\n> > \n> > Usage of find_installation() for this purpose is incorrect, it may find\n> > modules in a different interpreter than the one used to run the build\n> > scripts that use those modules. For instance, when cross-compiling\n> > libcamera against a Buildroot environment, and pointing meson in the\n> > cross-file to the build machine Python interpreter from Buildroot, the\n> > find_installation() method will refer to the latter, while our code\n> > generation scripts that use the modules will use the former.\n> > \n> > Replace find_installation() with a manual check using python3 directly.\n> > ----------\n> > \n> >> You can't use non-native Python\n> >> anyway. Well, you could, with qemu.\n> > \n> > That's one workaround for the issues we're experiencing when\n> > cross-compiling, but I fear users would scream at me if I wanted to make\n> > that mandatory :-)\n> > \n> >> In any case, with the desc changes for both patches:\n> >>\n> >> Reviewed-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>\n> >>\n> >> I also wonder if there should be variables for the pythons, \"host_py\"\n> >> and \"build_py\", that could be used in the meson files.\n> > \n> > What would you set those variables to ? Something like\n> > \n> > build_py = find_program('python3')\n> > host_py = import('python').find_installation('python3')\n> > \n> > ? I think they would both refer to the host interpreter.\n> \n> I'm confused... Didn't this this series just do that change? Switching\n> from \"import('python').find_installation('python3')\" to (essentially)\n> \"find_program('python3')\". And the point was that they are different?\n\nfind_program('python3') will essentially look for a binary called\npython3 in the search paths used by meson. It also takes the cross-file\ninto account, if you have\n\n[binaries]\npython3 = /path/to/other/python3\n\nthat's what build_py would give you. The same will happen if you use\nfind_program('python') and replace the 'python3' key with 'python' in\nthe cross-file.\n\nimport('python').find_installation('python3') will do something similar.\nWithout any override in the cross-file, you'll get the same system\nPython as find_program('python3'). You can override this through the\n'python' entry in the cross-file. Note that this has to be 'python', not\n'python3', a 'python3' key in the cross-file will be ignored. This\ndiffers from find_program().\n\nYou can get the system Python interpreter with\n\nfind_program('python3', native : true)\n\nI suppose we could indeed do that in a central location\n\npy3_build = find_program('python3', native : true)\npy3_host = import('python').find_installation('python3')\n\n> Oh, wait, now I'm actually confused also on the meaning of the words. If\n> I'm not mistaken, in autoconf terminology host and target are the same\n> here. We can't run the target interpreter. What do you mean with \"host\"?\n\nIn meson terminology, build is the machine on which you build the\nsoftware, host is the machine on which it runs, and target is the\nmachine for which it will generate output. The target is mostly used\nwhen building compilers, you can for instance crosscompile gcc on a x86\nmachine, creating a binary that will run on arm64 and will generate\noutput to be run on a riscv. For libcamera we only care about build and\nhost architectures, target is irrelevant.\n\nNote that what meson calls build and host is respectively called host\nand target in buildroot.\n\n> What we want is to distinguish between the system/distro python, and the\n> build environment (buildroot's dev environment) python, right?","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 96B4EBD87C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 19 Aug 2025 13:30:47 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 4A7B3692DA;\n\tTue, 19 Aug 2025 15:30:46 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 8218D692CE\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 19 Aug 2025 15:30:44 +0200 (CEST)","from pendragon.ideasonboard.com (85-76-43-215-nat.elisa-mobile.fi\n\t[85.76.43.215])\n\tby perceval.ideasonboard.com (Postfix) with UTF8SMTPSA id 0B0331A37; \n\tTue, 19 Aug 2025 15:29:45 +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=\"C7UU2Uj/\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1755610186;\n\tbh=GKQJBVlTPOL2fNdjzo2raFlsqlny9cwSbUgIwUOkNiU=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=C7UU2Uj/Wk5Ki2dVMrW5P7dCSU2YMeOI8Ch6j4SsAV9c9BokheIR6AKLK5jgNb8Fq\n\taVc2Mn/iF+DRhcE9S9dp9T8DVdLBYvJ6DpEd2TkksmtwSHLPhxyDj6fOcCsXWzaLUM\n\tKdv2ddR/Dz8Ky3lJo2puY4bVi1Z5MBl+Vffymw60=","Date":"Tue, 19 Aug 2025 16:30:20 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Subject":"Re: [PATCH 2/2] meson: Check for Python modules manually","Message-ID":"<20250819133020.GV5862@pendragon.ideasonboard.com>","References":"<20250818121103.20073-1-laurent.pinchart@ideasonboard.com>\n\t<20250818121103.20073-2-laurent.pinchart@ideasonboard.com>\n\t<707476ce-1f2e-4cdf-a228-02051c632d89@ideasonboard.com>\n\t<20250819091406.GP5862@pendragon.ideasonboard.com>\n\t<e0c23c37-541d-480f-967e-c8253527e475@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<e0c23c37-541d-480f-967e-c8253527e475@ideasonboard.com>","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":35525,"web_url":"https://patchwork.libcamera.org/comment/35525/","msgid":"<a2102f32-090d-4ab8-bf83-aa56d0b5d95b@ideasonboard.com>","date":"2025-08-20T09:51:39","subject":"Re: [PATCH 2/2] meson: Check for Python modules manually","submitter":{"id":109,"url":"https://patchwork.libcamera.org/api/people/109/","name":"Tomi Valkeinen","email":"tomi.valkeinen@ideasonboard.com"},"content":"Hi,\n\nOn 19/08/2025 16:30, Laurent Pinchart wrote:\n> On Tue, Aug 19, 2025 at 03:54:16PM +0300, Tomi Valkeinen wrote:\n>> On 19/08/2025 12:14, Laurent Pinchart wrote:\n>>> On Tue, Aug 19, 2025 at 11:42:49AM +0300, Tomi Valkeinen wrote:\n>>>> On 18/08/2025 15:11, Laurent Pinchart wrote:\n>>>>> The meson python module's find_installation() method conveniently allows\n>>>>> testing if the interpreter provides a set of modules. We use it to check\n>>>>> for the presence of the modules required at build time. Unfortunately,\n>>>>> the meson python module is not meant to access the native Python\n>>>>> interpreter of the build machine, but the Python environment of the host\n>>>>> machine. Usage of find_installation() for this purpose is incorrect, it\n>>>>> may find modules in a different interpreter than the one used to run the\n>>>>> build scripts that use those modules.\n>>>>\n>>>> Same comments here as for the previous patch. And I'm not sure if\n>>>> \"native\" helps here or just confuses...\n>>>\n>>> I'll replace \"native\" with \"system\". I'll rewrite the commit message as\n>>>\n>>> ----------\n>>> The meson python module's find_installation() method conveniently allows\n>>> testing if the interpreter provides a set of modules. We use it to check\n>>> for the presence of the modules required at build time. Unfortunately,\n>>> the meson python module is not meant to access the system Python\n>>> interpreter of the build machine, but the Python environment of the host\n>>> machine.\n>>>\n>>> Usage of find_installation() for this purpose is incorrect, it may find\n>>> modules in a different interpreter than the one used to run the build\n>>> scripts that use those modules. For instance, when cross-compiling\n>>> libcamera against a Buildroot environment, and pointing meson in the\n>>> cross-file to the build machine Python interpreter from Buildroot, the\n>>> find_installation() method will refer to the latter, while our code\n>>> generation scripts that use the modules will use the former.\n>>>\n>>> Replace find_installation() with a manual check using python3 directly.\n>>> ----------\n>>>\n>>>> You can't use non-native Python\n>>>> anyway. Well, you could, with qemu.\n>>>\n>>> That's one workaround for the issues we're experiencing when\n>>> cross-compiling, but I fear users would scream at me if I wanted to make\n>>> that mandatory :-)\n>>>\n>>>> In any case, with the desc changes for both patches:\n>>>>\n>>>> Reviewed-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>\n>>>>\n>>>> I also wonder if there should be variables for the pythons, \"host_py\"\n>>>> and \"build_py\", that could be used in the meson files.\n>>>\n>>> What would you set those variables to ? Something like\n>>>\n>>> build_py = find_program('python3')\n>>> host_py = import('python').find_installation('python3')\n>>>\n>>> ? I think they would both refer to the host interpreter.\n>>\n>> I'm confused... Didn't this this series just do that change? Switching\n>> from \"import('python').find_installation('python3')\" to (essentially)\n>> \"find_program('python3')\". And the point was that they are different?\n> \n> find_program('python3') will essentially look for a binary called\n> python3 in the search paths used by meson. It also takes the cross-file\n> into account, if you have\n> \n> [binaries]\n> python3 = /path/to/other/python3\n> \n> that's what build_py would give you. The same will happen if you use\n> find_program('python') and replace the 'python3' key with 'python' in\n> the cross-file.\n> \n> import('python').find_installation('python3') will do something similar.\n> Without any override in the cross-file, you'll get the same system\n> Python as find_program('python3'). You can override this through the\n> 'python' entry in the cross-file. Note that this has to be 'python', not\n> 'python3', a 'python3' key in the cross-file will be ignored. This\n> differs from find_program().\n> \n> You can get the system Python interpreter with\n> \n> find_program('python3', native : true)\n> \n> I suppose we could indeed do that in a central location\n> \n> py3_build = find_program('python3', native : true)\n> py3_host = import('python').find_installation('python3')\n\nAfter some rabbit-holeing, I think I now understand your patches a bit\nbetter.\n\nThose two (py3_build and py3_host) are very different things:\n\"py3_build\" is a python command for running python scripts while\nbuilding, whereas \"py3_host\" is a target definition for python3\nextension modules.\n\nSo py3_host (I don't like \"host\" name =) should only really be visible\nin a few specific meson files that are creating py extensions for the\ntarget. And \"py3_build\" could be set in the root meson.build, so that\nother meson files don't need to find the python interpreter themselves\n(and maybe get it wrong by using find_program('python3'), which returns\nthe wrong interpreter).\n\nMaybe the \"py3_host\", which is \"py3\" currently in the src/py/ files can\nstay as \"py3\", and perhaps \"py3_build\" could be \"py_cmd\"?\n\nI think I have a headache from all this... =)\n\n Tomi","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 BFE3FBD87C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 20 Aug 2025 09:51:44 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 7B98D692D7;\n\tWed, 20 Aug 2025 11:51:43 +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 415BD613C5\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 20 Aug 2025 11:51:42 +0200 (CEST)","from [192.168.88.20] (91-158-153-178.elisa-laajakaista.fi\n\t[91.158.153.178])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 8A4A3606;\n\tWed, 20 Aug 2025 11:50:43 +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=\"KXMnn3gE\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1755683443;\n\tbh=kNiAPJNfw7y/2yrnAkXbIrkmsyiNvPRryM68vH0VfE4=;\n\th=Date:Subject:To:Cc:References:From:In-Reply-To:From;\n\tb=KXMnn3gEHmx/PqkDEwp6qNxRXFD9hJGZAu98Wnfw6/Axu7rteTPOBq/0B4mCUSOHf\n\tSvMZRLY0DwHAJDAaTPlHUvRN8Wq92e8ubf2gGHslj+6NOvSB/TqCU8WGi/pSv2HB8s\n\t7ygEKPLsj+u5w0k2I4B266EhbvllJJqHZ2ZhShgY=","Message-ID":"<a2102f32-090d-4ab8-bf83-aa56d0b5d95b@ideasonboard.com>","Date":"Wed, 20 Aug 2025 12:51:39 +0300","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH 2/2] meson: Check for Python modules manually","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","References":"<20250818121103.20073-1-laurent.pinchart@ideasonboard.com>\n\t<20250818121103.20073-2-laurent.pinchart@ideasonboard.com>\n\t<707476ce-1f2e-4cdf-a228-02051c632d89@ideasonboard.com>\n\t<20250819091406.GP5862@pendragon.ideasonboard.com>\n\t<e0c23c37-541d-480f-967e-c8253527e475@ideasonboard.com>\n\t<20250819133020.GV5862@pendragon.ideasonboard.com>","Content-Language":"en-US","From":"Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>","Autocrypt":"addr=tomi.valkeinen@ideasonboard.com; keydata=\n\t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","In-Reply-To":"<20250819133020.GV5862@pendragon.ideasonboard.com>","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"7bit","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":35528,"web_url":"https://patchwork.libcamera.org/comment/35528/","msgid":"<20250820100010.GF10308@pendragon.ideasonboard.com>","date":"2025-08-20T10:00:10","subject":"Re: [PATCH 2/2] meson: Check for Python modules manually","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"On Wed, Aug 20, 2025 at 12:51:39PM +0300, Tomi Valkeinen wrote:\n> Hi,\n> \n> On 19/08/2025 16:30, Laurent Pinchart wrote:\n> > On Tue, Aug 19, 2025 at 03:54:16PM +0300, Tomi Valkeinen wrote:\n> >> On 19/08/2025 12:14, Laurent Pinchart wrote:\n> >>> On Tue, Aug 19, 2025 at 11:42:49AM +0300, Tomi Valkeinen wrote:\n> >>>> On 18/08/2025 15:11, Laurent Pinchart wrote:\n> >>>>> The meson python module's find_installation() method conveniently allows\n> >>>>> testing if the interpreter provides a set of modules. We use it to check\n> >>>>> for the presence of the modules required at build time. Unfortunately,\n> >>>>> the meson python module is not meant to access the native Python\n> >>>>> interpreter of the build machine, but the Python environment of the host\n> >>>>> machine. Usage of find_installation() for this purpose is incorrect, it\n> >>>>> may find modules in a different interpreter than the one used to run the\n> >>>>> build scripts that use those modules.\n> >>>>\n> >>>> Same comments here as for the previous patch. And I'm not sure if\n> >>>> \"native\" helps here or just confuses...\n> >>>\n> >>> I'll replace \"native\" with \"system\". I'll rewrite the commit message as\n> >>>\n> >>> ----------\n> >>> The meson python module's find_installation() method conveniently allows\n> >>> testing if the interpreter provides a set of modules. We use it to check\n> >>> for the presence of the modules required at build time. Unfortunately,\n> >>> the meson python module is not meant to access the system Python\n> >>> interpreter of the build machine, but the Python environment of the host\n> >>> machine.\n> >>>\n> >>> Usage of find_installation() for this purpose is incorrect, it may find\n> >>> modules in a different interpreter than the one used to run the build\n> >>> scripts that use those modules. For instance, when cross-compiling\n> >>> libcamera against a Buildroot environment, and pointing meson in the\n> >>> cross-file to the build machine Python interpreter from Buildroot, the\n> >>> find_installation() method will refer to the latter, while our code\n> >>> generation scripts that use the modules will use the former.\n> >>>\n> >>> Replace find_installation() with a manual check using python3 directly.\n> >>> ----------\n> >>>\n> >>>> You can't use non-native Python\n> >>>> anyway. Well, you could, with qemu.\n> >>>\n> >>> That's one workaround for the issues we're experiencing when\n> >>> cross-compiling, but I fear users would scream at me if I wanted to make\n> >>> that mandatory :-)\n> >>>\n> >>>> In any case, with the desc changes for both patches:\n> >>>>\n> >>>> Reviewed-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>\n> >>>>\n> >>>> I also wonder if there should be variables for the pythons, \"host_py\"\n> >>>> and \"build_py\", that could be used in the meson files.\n> >>>\n> >>> What would you set those variables to ? Something like\n> >>>\n> >>> build_py = find_program('python3')\n> >>> host_py = import('python').find_installation('python3')\n> >>>\n> >>> ? I think they would both refer to the host interpreter.\n> >>\n> >> I'm confused... Didn't this this series just do that change? Switching\n> >> from \"import('python').find_installation('python3')\" to (essentially)\n> >> \"find_program('python3')\". And the point was that they are different?\n> > \n> > find_program('python3') will essentially look for a binary called\n> > python3 in the search paths used by meson. It also takes the cross-file\n> > into account, if you have\n> > \n> > [binaries]\n> > python3 = /path/to/other/python3\n> > \n> > that's what build_py would give you. The same will happen if you use\n> > find_program('python') and replace the 'python3' key with 'python' in\n> > the cross-file.\n> > \n> > import('python').find_installation('python3') will do something similar.\n> > Without any override in the cross-file, you'll get the same system\n> > Python as find_program('python3'). You can override this through the\n> > 'python' entry in the cross-file. Note that this has to be 'python', not\n> > 'python3', a 'python3' key in the cross-file will be ignored. This\n> > differs from find_program().\n> > \n> > You can get the system Python interpreter with\n> > \n> > find_program('python3', native : true)\n> > \n> > I suppose we could indeed do that in a central location\n> > \n> > py3_build = find_program('python3', native : true)\n> > py3_host = import('python').find_installation('python3')\n> \n> After some rabbit-holeing, I think I now understand your patches a bit\n> better.\n> \n> Those two (py3_build and py3_host) are very different things:\n> \"py3_build\" is a python command for running python scripts while\n> building, whereas \"py3_host\" is a target definition for python3\n> extension modules.\n> \n> So py3_host (I don't like \"host\" name =) should only really be visible\n> in a few specific meson files that are creating py extensions for the\n> target. And \"py3_build\" could be set in the root meson.build, so that\n> other meson files don't need to find the python interpreter themselves\n> (and maybe get it wrong by using find_program('python3'), which returns\n> the wrong interpreter).\n> \n> Maybe the \"py3_host\", which is \"py3\" currently in the src/py/ files can\n> stay as \"py3\", and perhaps \"py3_build\" could be \"py_cmd\"?\n\nKeeping \"py3\" is fine with me as it means I won't have to change my\npatches :-)\n\nAs for introducing py_cmd, there are two occurences of\nrun_command('python3', ...) at the moment. Would you want to replace\nthat ?\n\n> I think I have a headache from all this... =)\n\nWelcome to the club :-)","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 26F1BBD87C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 20 Aug 2025 10:00:36 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id B1741692D9;\n\tWed, 20 Aug 2025 12:00:35 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 6FF6F613DC\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 20 Aug 2025 12:00:33 +0200 (CEST)","from pendragon.ideasonboard.com (81-175-209-231.bb.dnainternet.fi\n\t[81.175.209.231])\n\tby perceval.ideasonboard.com (Postfix) with UTF8SMTPSA id D7B6E606;\n\tWed, 20 Aug 2025 11:59:34 +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=\"Us1RUMEL\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1755683975;\n\tbh=H4HCGTI3euvI3lhxadAhHTyO/qaMwdxb2zU/8V2cHms=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=Us1RUMELOON5pZ6TV8IoKpegpCdvIrBDyYM/ZeajTMn3ZhbeZIOUayWux3NpzKLnw\n\t9hLY4DuJSKMrZVLKncBo7elVMY3WRa9ZESzOWFor9IoqVRkJmu2KhoWAPPccMEqUAI\n\tWTNj3vj45BAULEhO9r6DDmsHZ8KnP5spRri0tV5s=","Date":"Wed, 20 Aug 2025 13:00:10 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Subject":"Re: [PATCH 2/2] meson: Check for Python modules manually","Message-ID":"<20250820100010.GF10308@pendragon.ideasonboard.com>","References":"<20250818121103.20073-1-laurent.pinchart@ideasonboard.com>\n\t<20250818121103.20073-2-laurent.pinchart@ideasonboard.com>\n\t<707476ce-1f2e-4cdf-a228-02051c632d89@ideasonboard.com>\n\t<20250819091406.GP5862@pendragon.ideasonboard.com>\n\t<e0c23c37-541d-480f-967e-c8253527e475@ideasonboard.com>\n\t<20250819133020.GV5862@pendragon.ideasonboard.com>\n\t<a2102f32-090d-4ab8-bf83-aa56d0b5d95b@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<a2102f32-090d-4ab8-bf83-aa56d0b5d95b@ideasonboard.com>","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":35529,"web_url":"https://patchwork.libcamera.org/comment/35529/","msgid":"<722abdaf-c91b-479a-ac64-9457f06b76cb@ideasonboard.com>","date":"2025-08-20T10:04:25","subject":"Re: [PATCH 2/2] meson: Check for Python modules manually","submitter":{"id":109,"url":"https://patchwork.libcamera.org/api/people/109/","name":"Tomi Valkeinen","email":"tomi.valkeinen@ideasonboard.com"},"content":"Hi,\n\nOn 20/08/2025 13:00, Laurent Pinchart wrote:\n\n> As for introducing py_cmd, there are two occurences of\n> run_command('python3', ...) at the moment. Would you want to replace\n> that ?\n\nAh, right, we don't (and didn't) do find_program('python3'). I assume\nrun_command('python3', ...) should always do the right thing, so I think\nwe can forget the py_cmd.\n\n Tomi","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 A29B1BEFBE\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 20 Aug 2025 10:04:32 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id AC235692D9;\n\tWed, 20 Aug 2025 12:04:31 +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 C3299613DC\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 20 Aug 2025 12:04:29 +0200 (CEST)","from [192.168.88.20] (91-158-153-178.elisa-laajakaista.fi\n\t[91.158.153.178])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id F2082666;\n\tWed, 20 Aug 2025 12:03:30 +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=\"pGKsmAjT\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1755684211;\n\tbh=VNyujTLAkNpn9aEjgZL/GT5jYW5NF7/rfpZ3k7T5Ud8=;\n\th=Date:Subject:To:Cc:References:From:In-Reply-To:From;\n\tb=pGKsmAjTyBIwIdhN9w2hZMVvCSIMXtZMh6cIPcbKdpERnzRx8vj8JV1fzoD4WBv9G\n\tpOfh0OKMzeKFYBB0wSJgdmY+qCwoNTxn9KT9T0oQHoJuc19Dl6mo2iOFI5W0vfdcAY\n\tL1O8ko6L2IY7fwJcjXEZKwXqb56LECJlYB5DJyxE=","Message-ID":"<722abdaf-c91b-479a-ac64-9457f06b76cb@ideasonboard.com>","Date":"Wed, 20 Aug 2025 13:04:25 +0300","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH 2/2] meson: Check for Python modules manually","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","References":"<20250818121103.20073-1-laurent.pinchart@ideasonboard.com>\n\t<20250818121103.20073-2-laurent.pinchart@ideasonboard.com>\n\t<707476ce-1f2e-4cdf-a228-02051c632d89@ideasonboard.com>\n\t<20250819091406.GP5862@pendragon.ideasonboard.com>\n\t<e0c23c37-541d-480f-967e-c8253527e475@ideasonboard.com>\n\t<20250819133020.GV5862@pendragon.ideasonboard.com>\n\t<a2102f32-090d-4ab8-bf83-aa56d0b5d95b@ideasonboard.com>\n\t<20250820100010.GF10308@pendragon.ideasonboard.com>","Content-Language":"en-US","From":"Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>","Autocrypt":"addr=tomi.valkeinen@ideasonboard.com; keydata=\n\t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","In-Reply-To":"<20250820100010.GF10308@pendragon.ideasonboard.com>","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"7bit","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>"}}]