From patchwork Wed Nov 4 13:20:53 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adam Duskett X-Patchwork-Id: 102909 Received: from mail-ej1-f42.google.com (mail-ej1-f42.google.com [209.85.218.42]) by mx.groups.io with SMTP id smtpd.msgproc01-g2.8907.1793798463816163864 for ; Wed, 04 Nov 2026 05:21:04 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@amarulasolutions.com header.s=google header.b=FdwaGev4; spf=pass (domain: amarulasolutions.com, ip: 209.85.218.42, mailfrom: adam.duskett@amarulasolutions.com) Received: by mail-ej1-f42.google.com with SMTP id a640c23a62f3a-c40f5077425so10357666b.1 for ; Wed, 04 Nov 2026 05:21:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amarulasolutions.com; s=google; t=1793798462; x=1794403262; darn=lists.openembedded.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to:content-type; bh=rAT0p06uFiC/KOR/Q+yxGmPyBliloon1QjwJr4+/lBI=; b=FdwaGev4TZtr9q1F3gCBzGiNUbLiN6HTUWqF6ZmSOBRM+70TN90ISPCKbEb6gD3Nz+ 8IePcgRVf1KiHQP/FkBOqLrpGOdv0eLXCGrVVdXJMygloKg1H4hWp8Ilvysk7ugsq9Aa LQDiOpwUYrgY7ygErTX47WNl2g6vuHs67ygeU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1793798462; x=1794403262; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=rAT0p06uFiC/KOR/Q+yxGmPyBliloon1QjwJr4+/lBI=; b=L5rzUofuPIsGIUfFM8E6lF1W/bP9iX7VTDFqLjXvM9ypXKCdF0OJPnVCGdExzpS6mv ehBXg2dxhzjVCWmN1ijETJkMr86vpe48cTTXp0A/auPugiU8YUc8OZOjhRV04oilia28 wJs/JDfEduoioQdy0ejYOWqJG+i9Ck9HqonJoO5RNNxs1AxAcoI12wCnn2CODtDuLDDO VTyHMa0WlV8hAI/BmxfTXPTUNIf/eN3gQTxfqSQc1RyU6THJTUae3nzCwcjxhjXoY9xg 2tNC81UjbgjPJM7OrGWLM9gwiMm0dz65SecLkpkzfMydKby+O6hQHU9UKS8UnXyURHFA FDmw== X-Gm-Message-State: APuU4Z/K4Lvb0m0CRS3n1nrf/iw88aTfg8Vg1TrRtOGq/yIpgsTMa2XO Rc+ppIoId5RW43Kff74+iM7MXpc8eFpiZyXldYMYFb0jd6TEaniWFtfDt0eYiKTXcMfl1opV0je oGAlLEqI= X-Gm-Gg: AYBFou2ImYFgkMxFAWQ3OA3B+PNmgYlns6Kb0hhnKAehIlK4O9tXa5yj5CG13+YAiwt Sa1HzPRzK3l67jCg3E/iumaAhbU6nFePATyP2stDG/teZ78rVR8uSPmzXRe14DV/uw0t57hGe44 WMHlBy66FnGpIOISIqbZnAmAW3y/tcCzZPYk2XuIyn7ggVcqwAOVPAFszfekZoKHyieZFisTak+ iciK6S8bAMeWeX6j+FKqgFjE3rEltYuKVFfjDDU4isOokirlpWA8qytdTpju0VZ9TYl4TpLyBrq WpclVcpvPxp5Up6SHkdQyji/wXWIVVg/3ghMzyU0llwZqInSSEqLipvyaNcVWKNp7l/+HVS4Hfx dsjOm/EaFOjCE9h/YokHdU2i1SXgZq79MRKu5/v8N8o6B0c5QC3h/7Q7qooaHrEokr/2K2xxVKD 4R8gqF7tSPo+659zommjR9/MLta0ynXF21c7NVPixdd89pTOly40/GwF4t+LILnc75GenMYDEiV 0hMDVm+O/VHA0S4ZBi6PW3ogfUhSMkuSoQbU+bxoCqcfMBpqnj8qkblUBj7Q/QtszHroA+FpaYS NQWWW6uqlm7bjJecT1oPEMXu+cWPYYrqFFax1wb2tNrnX2sIAVc6gGOsqM0mTXxFirF2NyFO1h1 WzBONOTVrY5FY8cOsw7PQWCfOZcBgPg4y9T7r0lMY2Ht3MR8WdCU7hkZryi73NvRGwTrgcrnUrG MK+dR57mbkEhrp+OWNa03PcQGsgtyTi1E= X-Received: by 2002:a17:906:a005:b0:c29:4634:5c8f with SMTP id a640c23a62f3a-c4ca7405bffmr1437890366b.0.1793798461738; Wed, 04 Nov 2026 05:21:01 -0800 (PST) Return-Path: Received: from adam-linux.tail032493.ts.net (2001-1c00-8181-e800-030c-182b-b2a8-e89d.cable.dynamic.v6.ziggo.nl. [2001:1c00:8181:e800:30c:182b:b2a8:e89d]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-c4d0e140f93sm70343466b.6.2026.11.04.05.20.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 04 Nov 2026 05:20:59 -0800 (PST) From: Adam Duskett To: openembedded-core@lists.openembedded.org Cc: Adam Duskett Subject: [PATCH v12 1/4] libtoml1: fix building tests with gcc 16 Date: Wed, 4 Nov 2026 14:20:53 +0100 Message-ID: <20261104132057.607953-1-adam.duskett@amarulasolutions.com> X-Mailer: git-send-email 2.56.0 MIME-Version: 1.0 List-Id: X-Webhook-Received: from 45-33-107-173.ip.linodeusercontent.com [45.33.107.173] by lin-tor-korg-lkml-alma10-1 with HTTPS for ; Wed, 04 Nov 2026 13:21:12 -0000 X-Groupsio-URL: https://lists.openembedded.org/g/openembedded-core/message/249376 GCC 16 warns that the format may be used uninitialized when a value is assigned a different type, for example: toml::value v(true); v = std::chrono::hours(1); The warning is a false positive, but the tests build with -Werror, so the build fails. Every operator= copied the old format out of the union behind a type check that GCC could not see through, so it flagged a possible read of an inactive member. Add a small helper that keeps the format when the type is unchanged and uses the default format otherwise, so the old format is never copied. The convenience overloads now convert their argument and forward to the main ones, removing a lot of duplicated code. Fixes: https://autobuilder.yoctoproject.org/valkyrie/#/builders/40/builds/4814 Signed-off-by: Adam Duskett --- ...e-uninitialized-warnings-in-operator.patch | 466 ++++++++++++++++++ .../libtoml11/libtoml11_4.4.0.bb | 1 + 2 files changed, 467 insertions(+) create mode 100644 meta/recipes-devtools/libtoml11/files/0002-avoid-maybe-uninitialized-warnings-in-operator.patch diff --git a/meta/recipes-devtools/libtoml11/files/0002-avoid-maybe-uninitialized-warnings-in-operator.patch b/meta/recipes-devtools/libtoml11/files/0002-avoid-maybe-uninitialized-warnings-in-operator.patch new file mode 100644 index 0000000000..9de62ff3fc --- /dev/null +++ b/meta/recipes-devtools/libtoml11/files/0002-avoid-maybe-uninitialized-warnings-in-operator.patch @@ -0,0 +1,466 @@ +From e53cc3da832cae3722b969e515b9f8612250377d Mon Sep 17 00:00:00 2001 +From: Adam Duskett +Date: Tue, 3 Nov 2026 15:08:49 +0100 +Subject: [PATCH] avoid maybe-uninitialized warnings in operator= + +GCC 16 warns that the format may be used uninitialized when a value is +assigned a different type, for example: + + toml::value v(true); + v = std::chrono::hours(1); + +The warning is a false positive, but the tests build with -Werror, so +the build fails. + +Every operator= copied the old format out of the union behind a type +check that GCC could not see through, so it flagged a possible read of +an inactive member. + +Add a small helper that keeps the format when the type is unchanged and +uses the default format otherwise, so the old format is never copied. +The convenience overloads now convert their argument and forward to the +main ones, removing a lot of duplicated code. + +Upstream-Status: Submitted [https://github.com/ToruNiina/toml11/pull/325] +Signed-off-by: Adam Duskett +--- + include/toml11/value.hpp | 293 ++++++++------------------------------- + 1 file changed, 57 insertions(+), 236 deletions(-) + +diff --git a/include/toml11/value.hpp b/include/toml11/value.hpp +index 8b446a7..e512c3e 100644 +--- a/include/toml11/value.hpp ++++ b/include/toml11/value.hpp +@@ -404,18 +404,8 @@ class basic_value + {} + basic_value& operator=(boolean_type x) + { +- boolean_format_info fmt; +- if(this->is_boolean()) +- { +- fmt = this->as_boolean_fmt(); +- } +- this->cleanup(); +- this->type_ = value_t::boolean; +- this->region_ = region_type{}; +-#ifdef TOML11_ENABLE_ACCESS_CHECK +- this->accessed_ = false; +-#endif +- assigner(this->boolean_, boolean_storage(x, fmt)); ++ this->assign_keeping_format(value_t::boolean, this->boolean_, ++ std::move(x)); + return *this; + } + +@@ -444,18 +434,8 @@ class basic_value + {} + basic_value& operator=(integer_type x) + { +- integer_format_info fmt; +- if(this->is_integer()) +- { +- fmt = this->as_integer_fmt(); +- } +- this->cleanup(); +- this->type_ = value_t::integer; +- this->region_ = region_type{}; +-#ifdef TOML11_ENABLE_ACCESS_CHECK +- this->accessed_ = false; +-#endif +- assigner(this->integer_, integer_storage(std::move(x), std::move(fmt))); ++ this->assign_keeping_format(value_t::integer, this->integer_, ++ std::move(x)); + return *this; + } + +@@ -497,18 +477,7 @@ class basic_value + template = nullptr> + basic_value& operator=(T x) + { +- integer_format_info fmt; +- if(this->is_integer()) +- { +- fmt = this->as_integer_fmt(); +- } +- this->cleanup(); +- this->type_ = value_t::integer; +- this->region_ = region_type{}; +-#ifdef TOML11_ENABLE_ACCESS_CHECK +- this->accessed_ = false; +-#endif +- assigner(this->integer_, integer_storage(x, std::move(fmt))); ++ *this = static_cast(x); + return *this; + } + +@@ -537,18 +506,8 @@ class basic_value + {} + basic_value& operator=(floating_type x) + { +- floating_format_info fmt; +- if(this->is_floating()) +- { +- fmt = this->as_floating_fmt(); +- } +- this->cleanup(); +- this->type_ = value_t::floating; +- this->region_ = region_type{}; +-#ifdef TOML11_ENABLE_ACCESS_CHECK +- this->accessed_ = false; +-#endif +- assigner(this->floating_, floating_storage(std::move(x), std::move(fmt))); ++ this->assign_keeping_format(value_t::floating, this->floating_, ++ std::move(x)); + return *this; + } + +@@ -594,18 +553,7 @@ class basic_value + template = nullptr> + basic_value& operator=(T x) + { +- floating_format_info fmt; +- if(this->is_floating()) +- { +- fmt = this->as_floating_fmt(); +- } +- this->cleanup(); +- this->type_ = value_t::floating; +- this->region_ = region_type{}; +-#ifdef TOML11_ENABLE_ACCESS_CHECK +- this->accessed_ = false; +-#endif +- assigner(this->floating_, floating_storage(x, std::move(fmt))); ++ *this = static_cast(x); + return *this; + } + +@@ -635,18 +583,8 @@ class basic_value + {} + basic_value& operator=(string_type x) + { +- string_format_info fmt; +- if(this->is_string()) +- { +- fmt = this->as_string_fmt(); +- } +- this->cleanup(); +- this->type_ = value_t::string; +- this->region_ = region_type{}; +-#ifdef TOML11_ENABLE_ACCESS_CHECK +- this->accessed_ = false; +-#endif +- assigner(this->string_, string_storage(x, std::move(fmt))); ++ this->assign_keeping_format(value_t::string, this->string_, ++ std::move(x)); + return *this; + } + +@@ -674,18 +612,7 @@ class basic_value + {} + basic_value& operator=(const typename string_type::value_type* x) + { +- string_format_info fmt; +- if(this->is_string()) +- { +- fmt = this->as_string_fmt(); +- } +- this->cleanup(); +- this->type_ = value_t::string; +- this->region_ = region_type{}; +-#ifdef TOML11_ENABLE_ACCESS_CHECK +- this->accessed_ = false; +-#endif +- assigner(this->string_, string_storage(string_type(x), std::move(fmt))); ++ *this = string_type(x); + return *this; + } + +@@ -715,18 +642,7 @@ class basic_value + {} + basic_value& operator=(string_view_type x) + { +- string_format_info fmt; +- if(this->is_string()) +- { +- fmt = this->as_string_fmt(); +- } +- this->cleanup(); +- this->type_ = value_t::string; +- this->region_ = region_type{}; +-#ifdef TOML11_ENABLE_ACCESS_CHECK +- this->accessed_ = false; +-#endif +- assigner(this->string_, string_storage(string_type(x), std::move(fmt))); ++ *this = string_type(x); + return *this; + } + +@@ -779,18 +695,7 @@ class basic_value + >::value, std::nullptr_t> = nullptr> + basic_value& operator=(const T& x) + { +- string_format_info fmt; +- if(this->is_string()) +- { +- fmt = this->as_string_fmt(); +- } +- this->cleanup(); +- this->type_ = value_t::string; +- this->region_ = region_type{}; +-#ifdef TOML11_ENABLE_ACCESS_CHECK +- this->accessed_ = false; +-#endif +- assigner(this->string_, string_storage(detail::string_conv(x), std::move(fmt))); ++ *this = detail::string_conv(x); + return *this; + } + +@@ -820,18 +725,8 @@ class basic_value + {} + basic_value& operator=(local_date_type x) + { +- local_date_format_info fmt; +- if(this->is_local_date()) +- { +- fmt = this->as_local_date_fmt(); +- } +- this->cleanup(); +- this->type_ = value_t::local_date; +- this->region_ = region_type{}; +-#ifdef TOML11_ENABLE_ACCESS_CHECK +- this->accessed_ = false; +-#endif +- assigner(this->local_date_, local_date_storage(x, fmt)); ++ this->assign_keeping_format(value_t::local_date, this->local_date_, ++ std::move(x)); + return *this; + } + +@@ -861,18 +756,8 @@ class basic_value + {} + basic_value& operator=(local_time_type x) + { +- local_time_format_info fmt; +- if(this->is_local_time()) +- { +- fmt = this->as_local_time_fmt(); +- } +- this->cleanup(); +- this->type_ = value_t::local_time; +- this->region_ = region_type{}; +-#ifdef TOML11_ENABLE_ACCESS_CHECK +- this->accessed_ = false; +-#endif +- assigner(this->local_time_, local_time_storage(x, fmt)); ++ this->assign_keeping_format(value_t::local_time, this->local_time_, ++ std::move(x)); + return *this; + } + +@@ -901,18 +786,7 @@ class basic_value + template + basic_value& operator=(const std::chrono::duration& x) + { +- local_time_format_info fmt; +- if(this->is_local_time()) +- { +- fmt = this->as_local_time_fmt(); +- } +- this->cleanup(); +- this->type_ = value_t::local_time; +- this->region_ = region_type{}; +-#ifdef TOML11_ENABLE_ACCESS_CHECK +- this->accessed_ = false; +-#endif +- assigner(this->local_time_, local_time_storage(local_time_type(x), std::move(fmt))); ++ *this = local_time_type(x); + return *this; + } + +@@ -942,18 +816,8 @@ class basic_value + {} + basic_value& operator=(local_datetime_type x) + { +- local_datetime_format_info fmt; +- if(this->is_local_datetime()) +- { +- fmt = this->as_local_datetime_fmt(); +- } +- this->cleanup(); +- this->type_ = value_t::local_datetime; +- this->region_ = region_type{}; +-#ifdef TOML11_ENABLE_ACCESS_CHECK +- this->accessed_ = false; +-#endif +- assigner(this->local_datetime_, local_datetime_storage(x, fmt)); ++ this->assign_keeping_format(value_t::local_datetime, this->local_datetime_, ++ std::move(x)); + return *this; + } + +@@ -983,18 +847,8 @@ class basic_value + {} + basic_value& operator=(offset_datetime_type x) + { +- offset_datetime_format_info fmt; +- if(this->is_offset_datetime()) +- { +- fmt = this->as_offset_datetime_fmt(); +- } +- this->cleanup(); +- this->type_ = value_t::offset_datetime; +- this->region_ = region_type{}; +-#ifdef TOML11_ENABLE_ACCESS_CHECK +- this->accessed_ = false; +-#endif +- assigner(this->offset_datetime_, offset_datetime_storage(x, fmt)); ++ this->assign_keeping_format(value_t::offset_datetime, this->offset_datetime_, ++ std::move(x)); + return *this; + } + +@@ -1018,18 +872,7 @@ class basic_value + {} + basic_value& operator=(std::chrono::system_clock::time_point x) + { +- offset_datetime_format_info fmt; +- if(this->is_offset_datetime()) +- { +- fmt = this->as_offset_datetime_fmt(); +- } +- this->cleanup(); +- this->type_ = value_t::offset_datetime; +- this->region_ = region_type{}; +-#ifdef TOML11_ENABLE_ACCESS_CHECK +- this->accessed_ = false; +-#endif +- assigner(this->offset_datetime_, offset_datetime_storage(offset_datetime_type(x), fmt)); ++ *this = offset_datetime_type(x); + return *this; + } + +@@ -1060,19 +903,8 @@ class basic_value + {} + basic_value& operator=(array_type x) + { +- array_format_info fmt; +- if(this->is_array()) +- { +- fmt = this->as_array_fmt(); +- } +- this->cleanup(); +- this->type_ = value_t::array; +- this->region_ = region_type{}; +-#ifdef TOML11_ENABLE_ACCESS_CHECK +- this->accessed_ = false; +-#endif +- assigner(this->array_, array_storage( +- detail::storage(std::move(x)), std::move(fmt))); ++ this->assign_keeping_format(value_t::array, this->array_, ++ detail::storage(std::move(x))); + return *this; + } + +@@ -1124,21 +956,8 @@ class basic_value + template = nullptr> + basic_value& operator=(T x) + { +- array_format_info fmt; +- if(this->is_array()) +- { +- fmt = this->as_array_fmt(); +- } +- this->cleanup(); +- this->type_ = value_t::array; +- this->region_ = region_type{}; +-#ifdef TOML11_ENABLE_ACCESS_CHECK +- this->accessed_ = false; +-#endif +- array_type a(std::make_move_iterator(x.begin()), +- std::make_move_iterator(x.end())); +- assigner(this->array_, array_storage( +- detail::storage(std::move(a)), std::move(fmt))); ++ *this = array_type(std::make_move_iterator(x.begin()), ++ std::make_move_iterator(x.end())); + return *this; + } + +@@ -1169,19 +988,8 @@ class basic_value + {} + basic_value& operator=(table_type x) + { +- table_format_info fmt; +- if(this->is_table()) +- { +- fmt = this->as_table_fmt(); +- } +- this->cleanup(); +- this->type_ = value_t::table; +- this->region_ = region_type{}; +-#ifdef TOML11_ENABLE_ACCESS_CHECK +- this->accessed_ = false; +-#endif +- assigner(this->table_, table_storage( +- detail::storage(std::move(x)), std::move(fmt))); ++ this->assign_keeping_format(value_t::table, this->table_, ++ detail::storage(std::move(x))); + return *this; + } + +@@ -1231,21 +1039,8 @@ class basic_value + template = nullptr> + basic_value& operator=(T x) + { +- table_format_info fmt; +- if(this->is_table()) +- { +- fmt = this->as_table_fmt(); +- } +- this->cleanup(); +- this->type_ = value_t::table; +- this->region_ = region_type{}; +-#ifdef TOML11_ENABLE_ACCESS_CHECK +- this->accessed_ = false; +-#endif +- table_type t(std::make_move_iterator(x.begin()), +- std::make_move_iterator(x.end())); +- assigner(this->table_, table_storage( +- detail::storage(std::move(t)), std::move(fmt))); ++ *this = table_type(std::make_move_iterator(x.begin()), ++ std::make_move_iterator(x.end())); + return *this; + } + +@@ -2083,6 +1878,32 @@ class basic_value + return; + } + ++ // Assign a new value of type `ty`. If this already holds a value of that ++ // type, only the value is replaced and its format is kept. Otherwise the ++ // current value is destroyed and the new one gets the default format. ++ // ++ // The format of the inactive union member is never read, so compilers do ++ // not see a (false positive) maybe-uninitialized read through the union. ++ template ++ void assign_keeping_format(const value_t ty, Storage& dst, ++ typename Storage::value_type v) ++ { ++ if(this->type_ == ty) ++ { ++ dst.value = std::move(v); ++ } ++ else ++ { ++ this->cleanup(); ++ this->type_ = ty; ++ assigner(dst, Storage(std::move(v), typename Storage::format_type{})); ++ } ++ this->region_ = region_type{}; ++#ifdef TOML11_ENABLE_ACCESS_CHECK ++ this->accessed_ = false; ++#endif ++ } ++ + template + static void assigner(T& dst, U&& v) + { diff --git a/meta/recipes-devtools/libtoml11/libtoml11_4.4.0.bb b/meta/recipes-devtools/libtoml11/libtoml11_4.4.0.bb index 49f9840f06..d9f0fa82f0 100644 --- a/meta/recipes-devtools/libtoml11/libtoml11_4.4.0.bb +++ b/meta/recipes-devtools/libtoml11/libtoml11_4.4.0.bb @@ -17,6 +17,7 @@ SRC_URI = "\ gitsm://github.com/ToruNiina/toml11.git;protocol=https;branch=main;tag=v${PV} \ file://0001-Remove-whitespace-in-operator.patch \ file://0001-Remove-more-whitespaces-after-operator.patch \ + file://0002-avoid-maybe-uninitialized-warnings-in-operator.patch \ file://run-ptest \ " SRCREV = "be08ba2be2a964edcdb3d3e3ea8d100abc26f286" From patchwork Wed Nov 4 13:20:54 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adam Duskett X-Patchwork-Id: 102910 Received: from mail-ej1-f45.google.com (mail-ej1-f45.google.com [209.85.218.45]) by mx.groups.io with SMTP id smtpd.msgproc01-g2.8909.1793798465313753897 for ; Wed, 04 Nov 2026 05:21:05 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@amarulasolutions.com header.s=google header.b=d4izVXUD; spf=pass (domain: amarulasolutions.com, ip: 209.85.218.45, mailfrom: adam.duskett@amarulasolutions.com) Received: by mail-ej1-f45.google.com with SMTP id a640c23a62f3a-c41d20c016fso12792666b.2 for ; Wed, 04 Nov 2026 05:21:05 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amarulasolutions.com; s=google; t=1793798463; x=1794403263; darn=lists.openembedded.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=Gx7cJZTp27XKDa/D6tqXUH7BccgF3znA3x9uQjA+mtU=; b=d4izVXUDejn8y2RD3/7HVMA7F8hLsoBewRyZUpzHJYyXiX+qFX4FdQ73LmPQAPvE8d CMT4/YkO8E41wSlfyRR+GEZyEpeSgLs8y1rikiKLWQZhtrIJiyfonddaFQEYfdZo+h70 Bz4wjiePnXPzWwvjbQiwGiZ1vdAE5touBBqCc= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1793798463; x=1794403263; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=Gx7cJZTp27XKDa/D6tqXUH7BccgF3znA3x9uQjA+mtU=; b=d6mPG/iwPbjHuBbWzKvege0DTCi5et8wtgLMTVwYWmpcd+zPIv5RI9L5SZINFNF6ce jmy3q1E84IfFHMIhOZMHGAuClJoCl557NTN9nj5KjZX3XvIdXeCTuk+S3vtkE+0EJkVE Zik+SdAh5ypbL55FCNWDWenOc8F3otz8IbIaaMV6/6R+WO9Uh3R7GrUFL0IGoKLveGpV Vv4tQCshvXDIOI5gLIWo8Qg0N2fh+8gzb+PTgE6053uk5W25HNymkBfIyE4zEkkzVER/ z6t634kSdyGZH/Z7VU6A7K+HquLvCYdFl0vV836NncxoCYpTumTjdj+rGPkMZIGWfiKw w9AQ== X-Gm-Message-State: APuU4Z/nN4AQR4lxk6wNt7+BYsvyoTiiWCAMhhZbQghwy16Oth/Nw9zL TwnIUvlQp5aWTxL8vBaaDMudDMJ3958yT1qaikbwDt0EehMEBEz+luewiIsLT3v+HH4ga6JuuIc ePrCO2T8= X-Gm-Gg: AYBFou1rJG1WAcL3o3lEDgR1QlQd9xAAu2q7P3ZheLs52JRiIRxBkI3zBJVzG7Fye4m SUpcv/CXfWpPBChseUzCX3UgEHCBofkcaBkQiKfxIW+PQ4yBNjBPzl7quP5JoULAF+CILbGuv7T tCevKfY2iacuqcAsIiibg9xllRgrXjOG2Xa2mT4pW1JV3ehZOir9YihehILTG4WzmViV4uLONTf ZqgKbZmFjRKFbithZS/JUETM4gh7U2WgRetdoHlK+ZH/0uWuv4WlcCDQ7xZoPYfP8rAKH/Tiqx2 v/RXsbbGwb0OES1LNv4dmyHfIfeMUTtecK5gvNp7T3Giw48AP0zotM9K7vwr+aF59rEiW0Doutc cRkiMoU0XBdIPBg43cI26pVCNibFKMy495g+kJeE6Qwmw5t77Dn7P5sx3U8WJwMD1Wx6EtkL+CG xDB+eiWIz0pO+vB1xF1Iu4UPE7b8oaJEJT0ewjXLZakmmkmf9k4dOYJScSXBHh0aQauzmOYlJB5 bpxK3UY9S3FVX06edAN7FIqTrDmhd0+I2tws1ULgkQC8HytdmiMl/B/T+oagcykSouZFAAxFp8/ xc3Zao9EyKzKCA9T6rZl+lckKulOPSdMpQ35pe8d76EX3CYfM84RiGD7LyrHf6AVpwqG5rwnJ6b MZ5csnu6AvqLa8Jojgruuiz1ruGDXKvcjZFIttInIY3NV0zZBtekvStlR8rNXxBIupHURai6Qbx rOek2BzE3P8tDs/W6JquritqRbN9rOTkg= X-Received: by 2002:a17:906:c0c1:b0:c40:b180:db3b with SMTP id a640c23a62f3a-c4ca7a6b633mr1253158366b.3.1793798463527; Wed, 04 Nov 2026 05:21:03 -0800 (PST) Return-Path: Received: from adam-linux.tail032493.ts.net (2001-1c00-8181-e800-030c-182b-b2a8-e89d.cable.dynamic.v6.ziggo.nl. [2001:1c00:8181:e800:30c:182b:b2a8:e89d]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-c4d0e140f93sm70343466b.6.2026.11.04.05.21.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 04 Nov 2026 05:21:02 -0800 (PST) From: Adam Duskett To: openembedded-core@lists.openembedded.org Cc: Adam Duskett Subject: [PATCH v12 2/4] rpm: add 0017-critically-fail-if-post-install-fails.patch Date: Wed, 4 Nov 2026 14:20:54 +0100 Message-ID: <20261104132057.607953-2-adam.duskett@amarulasolutions.com> X-Mailer: git-send-email 2.56.0 In-Reply-To: <20261104132057.607953-1-adam.duskett@amarulasolutions.com> References: <20261104132057.607953-1-adam.duskett@amarulasolutions.com> MIME-Version: 1.0 List-Id: X-Webhook-Received: from 45-33-107-173.ip.linodeusercontent.com [45.33.107.173] by lin-tor-korg-lkml-alma10-1 with HTTPS for ; Wed, 04 Nov 2026 13:21:12 -0000 X-Groupsio-URL: https://lists.openembedded.org/g/openembedded-core/message/249377 Starting with commit b5fe8a926aeb80e3ce84787e7624685326a2f412, DNF5 respects the callbacks of RPM and no longer fails unless RPM reports a failure. RPM does not report post install failures as critical. However, Yocto does expect DNF to fail on post-install failures. Signed-off-by: Adam Duskett --- ...ritically-fail-if-post-install-fails.patch | 34 +++++++++++++++++++ meta/recipes-devtools/rpm/rpm_6.0.2.bb | 1 + 2 files changed, 35 insertions(+) create mode 100644 meta/recipes-devtools/rpm/files/0017-critically-fail-if-post-install-fails.patch diff --git a/meta/recipes-devtools/rpm/files/0017-critically-fail-if-post-install-fails.patch b/meta/recipes-devtools/rpm/files/0017-critically-fail-if-post-install-fails.patch new file mode 100644 index 0000000000..05e8ba0cf5 --- /dev/null +++ b/meta/recipes-devtools/rpm/files/0017-critically-fail-if-post-install-fails.patch @@ -0,0 +1,34 @@ +From 390841ea7870408826fbddacf50f07a70778a22b Mon Sep 17 00:00:00 2001 +From: Adam Duskett +Date: Thu, 30 Jul 2026 12:48:24 +0200 +Subject: [PATCH] critically fail if post-install fails + +Starting with commit b5fe8a926aeb80e3ce84787e7624685326a2f412, +DNF5 respects the callback of RPM and no longer fails unless +RPM reports a failure. + +RPM does not report post install failures as critical. However, +Yocto does expect DNF to fail on post-install failures. + +Upstream-Status: Inappropriate [oe-core specific] +Signed-off-by: Adam Duskett +--- + lib/rpmscript.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/lib/rpmscript.cc b/lib/rpmscript.cc +index 97bd8da62..a354d944c 100644 +--- a/lib/rpmscript.cc ++++ b/lib/rpmscript.cc +@@ -60,7 +60,7 @@ static const struct scriptInfo_s scriptInfo[] = { + RPMSCRIPT_FLAG_CRITICAL, }, + { RPMSCRIPT_POSTIN, "post", 0, + RPMTAG_POSTIN, RPMTAG_POSTINPROG, RPMTAG_POSTINFLAGS, +- 0, }, ++ RPMSCRIPT_FLAG_CRITICAL, }, + { RPMSCRIPT_POSTUN, "postun", 0, + RPMTAG_POSTUN, RPMTAG_POSTUNPROG, RPMTAG_POSTUNFLAGS, + 0, }, +-- +2.55.0 + diff --git a/meta/recipes-devtools/rpm/rpm_6.0.2.bb b/meta/recipes-devtools/rpm/rpm_6.0.2.bb index c27f58a0e8..a8f35f87bf 100644 --- a/meta/recipes-devtools/rpm/rpm_6.0.2.bb +++ b/meta/recipes-devtools/rpm/rpm_6.0.2.bb @@ -40,6 +40,7 @@ SRC_URI = "git://github.com/rpm-software-management/rpm;protocol=https;branch=rp file://0001-tools-elfdeps.cc-Remove-format-module.patch \ file://0001-macros.in-Set-_pkgverify_level-to-digest-as-RCPM-4.2.patch \ file://0003-Do-not-install-the-pkgconfig-dependency-generator.patch \ + file://0017-critically-fail-if-post-install-fails.patch \ " PE = "1" From patchwork Wed Nov 4 13:20:55 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Adam Duskett X-Patchwork-Id: 102911 Received: from mail-ed1-f51.google.com (mail-ed1-f51.google.com [209.85.208.51]) by mx.groups.io with SMTP id smtpd.msgproc01-g2.8910.1793798468695356761 for ; Wed, 04 Nov 2026 05:21:09 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@amarulasolutions.com header.s=google header.b=QITGmQkW; spf=pass (domain: amarulasolutions.com, ip: 209.85.208.51, mailfrom: adam.duskett@amarulasolutions.com) Received: by mail-ed1-f51.google.com with SMTP id 4fb4d7f45d1cf-6aa77d4d968so132261a12.0 for ; Wed, 04 Nov 2026 05:21:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amarulasolutions.com; s=google; t=1793798467; x=1794403267; darn=lists.openembedded.org; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:from:to:cc:subject :date:message-id:reply-to:content-type; bh=xgXR3GqZLOFNlDUb8D6kmicflSQHgvbDiZrZWHn2zJg=; b=QITGmQkW4rn7LL12f/DW+J1N9P3EakU7e/4DuwsjpYRZPxjipiWYOtHpz6JfIDNIMT kMaMkkC10AQ/Atd6Ze4JuZxtjINzG9u1eswWoR9M7yNoUxrBTHohnfMnEHiB21g5FU45 q6dU7VMYR5I7OFMGbks9mNuKTNM3esv8t9Y5w= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1793798467; x=1794403267; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=xgXR3GqZLOFNlDUb8D6kmicflSQHgvbDiZrZWHn2zJg=; b=i7I1LxAlgLorxK91dcYDT95uS7GhAAv7W0Tz+zfpLtmGcwSHE0JVfGoO9lfFkHYlza 83yOCwP/ebZqZxu6iDkmRlg5aseiiriUJp7qmOjluDYvIy/IPMbkit5WjYkwitCzKGnJ EmN6ntSS5+dlpJOs4R/M2uaj2AY+mVxjfCtSNSO7jZmMIb2IklYRt7Oq7ynpTvs8N17g KlfQ/OwXBD642Og5Ikf6wiNQ5xdBC7bLCe+uu7BE6YnNVpQK1RcMbPqV585s+QNCz0A0 uE9Ztsz3qH3sVGVjZu6HXo5Ri1srwSDIYFtVXWz4mvjTiMqgPWTS2iariOyFleWKZanW qQTA== X-Gm-Message-State: APuU4Z/kqCxtBwe8YT+3hU/+CUHLJUrbb2xzNMGixKbLEwlbslc0vIkX sbvkOpSFDxdZQegfwgsos20siPWI/G5u9BaTn0fr+ptyagcAcKsH7hvLMvi16oEU0GR8bv8zKXM G4xfspzU= X-Gm-Gg: AYBFou198fWf640d03Rg9rfnnyLany60MP8vGSkz1o6PXldHtG8GOcjnZsS3TDfapxB C+Ccd9dameJzOAA1G3M1PN2plCYRhTuFR1C8NI/GsWxSMg52KQdx+qW1oUQw7TVay5wBKhSuXQz u9fHyfbyFrw2mujfUdL8Z7ncNVXa55M2pdAMxSsx214HiJMbO/SB1g+d1PrE0/xC2dfx674AXcz CyjcwcLpLhqAuC4ySbKbVlayLnsoJZuRnpleRzr+m4N9lvLfKP6zLA5sVYZcQ3zxAZ6rPA/C6oF Xkv0EjbHeyC5DuDXPW60+FQgmWUWlraRXqYvh2T2EPuQBwGx8Fl2/xke3x9HFcWZ/06DFGfZEfh W8ca8ntFg8kN2qlYTtBanMxmBVXf/pvqEnXTIULYrOo/QLfvGCaoKxPdmryfVuXfgT7LAT7M93V Rwn9cvolO37hpIgH8gYGdZaOm0r6yxxeKxiaeKc0rWf11uCBQsvvuoZfb16W6t90jPDvS0ed2I3 52/KEYqPn2pZthRh1Pzl7M3WCmdodsTcV7o1b2oepZCTD6OYCiGgAxlsHKeislMPfzIX/i9uRyw 4ihj0+0qaJPKNlEhMe46MfXA+mtYDBDEohIMR5gngq+ZCaSJkCnB9k1SsIAgTsKQPeNfSwQcSfW +NYP7K44wMOFNk0Fcqv6sKaXxblO9933I1hDhUyfTYJA7hoRyq/UEhn1GDBUYI87lEg3C89w0lw Z63TXmuDsh1m1KX0GJLgwmncR0+tUgGiM= X-Received: by 2002:a17:906:f15:b0:c43:f1ab:167c with SMTP id a640c23a62f3a-c4ca7970666mr1383300466b.1.1793798465953; Wed, 04 Nov 2026 05:21:05 -0800 (PST) Return-Path: Received: from adam-linux.tail032493.ts.net (2001-1c00-8181-e800-030c-182b-b2a8-e89d.cable.dynamic.v6.ziggo.nl. [2001:1c00:8181:e800:30c:182b:b2a8:e89d]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-c4d0e140f93sm70343466b.6.2026.11.04.05.21.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 04 Nov 2026 05:21:04 -0800 (PST) From: Adam Duskett To: openembedded-core@lists.openembedded.org Cc: Adam Duskett Subject: [PATCH v12 3/4] dnf: Upgrade to 5.4.6.0 Date: Wed, 4 Nov 2026 14:20:55 +0100 Message-ID: <20261104132057.607953-3-adam.duskett@amarulasolutions.com> X-Mailer: git-send-email 2.56.0 In-Reply-To: <20261104132057.607953-1-adam.duskett@amarulasolutions.com> References: <20261104132057.607953-1-adam.duskett@amarulasolutions.com> MIME-Version: 1.0 List-Id: X-Webhook-Received: from 45-33-107-173.ip.linodeusercontent.com [45.33.107.173] by lin-tor-korg-lkml-alma10-1 with HTTPS for ; Wed, 04 Nov 2026 13:21:12 -0000 X-Groupsio-URL: https://lists.openembedded.org/g/openembedded-core/message/249378 Completely rewritten in C++, there are several changes needed to facilitate moving from DNF4 to DNF5. Below are some significant items to note: - Added a negative lookahead filter for the following warning if RPM_SIGN_PACKAGES != '1': "Warning: skipped OpenPGP checks" This warning is hard-coded and piped to stderr if gpg checks are disabled. However, most users do not sign their RPM packages and use dnf to simply construct the rootfs. - The "-v/--verbose" cli option is removed. As such, remove the argument everywhere it was called.[1] - the rpmverbosity cli option is replaced with --setopt=rpmverbosity - Change gpgcheck to pkg_gpgcheck as this is what the documentation recommends.[2] - --nogpgcheck is now --no-gpgchecks - --setopt=protect_running_kernel=False has to be set or else every dnf transaction complains that /boot/vmlinuz-${kernel_version} does not exist in /var/log/dnf5.log. There is an open issue on github[3] to enable the currently not-yet implemented `autocheck_running_kernel option`, but it has been open for quite some time and the protect_running_kernel option supresses the message. - Move --skip-broken to after the install argument as the global --skip-broken argument is removed. - /var/cache/dnf is replaced with /var/cache/libdnf5 - Add `features += 'PACKAGECONFIG:append:pn-rpm = " sequoia"\n'` `features += 'PACKAGECONFIG:append:pn-librepo = " sequoia"\n'` to test_testimage_dnf as librepo currently does not work with gpgme. - Change `if line.startswith("Error in POSTIN scriptlet in rpm package"):` to `if "Error in %post scriptlet:" in line:` as dnf prints `>>>` charachters and the error string has changed. While DNF5 has many config options, unfortunately, the majority of them depends on sdbus-c++, which is not included in OE-core. However, the package is included in meta-openembedded, so it's best to include the PACKAGECONFIG options in the recipe and leave them off by default. 1: https://github.com/rpm-software-management/dnf5/issues/464 2: https://dnf5.readthedocs.io/en/latest/dnf5.conf.5.html 3: https://github.com/rpm-software-management/dnf5/issues/1255 Signed-off-by: Adam Duskett --- v10 -> v11: added 0006-rename-stdout-stderr-members.patch to fix musl builds v11 -> v12: Fixed more broken tests due to different DNF5 messages compared to DNF4 .../lib/oeqa/runtime/cases/dnf_runtime.py | 6 +- meta/conf/distro/include/maintainers.inc | 2 +- meta/lib/oe/package_manager/rpm/__init__.py | 31 +-- meta/lib/oe/package_manager/rpm/rootfs.py | 3 + meta/lib/oeqa/runtime/cases/dnf.py | 16 +- meta/lib/oeqa/selftest/cases/buildoptions.py | 4 +- meta/lib/oeqa/selftest/cases/runtime_test.py | 5 + ...tly-install-tmpfiles.d-configuration.patch | 18 -- ...ode-etc-and-systemd-unit-directories.patch | 26 --- ...-hardcode-the-systemd-unit-directory.patch | 29 +++ .../0001-dnf-write-the-log-lock-to-root.patch | 29 --- .../0001-lock.py-fix-Exception-handling.patch | 62 ------ ...et-python-path-for-completion_helper.patch | 21 -- .../dnf/0002-cmake-set-CMP0190-to-OLD.patch | 51 +++++ ...0003-Do-not-hardcode-system_cachedir.patch | 36 +++ ...004-add-support-for-gcc-12-and-below.patch | 135 ++++++++++++ ...Do-not-prepend-installroot-to-logdir.patch | 28 --- ...rm-arch-mapping-issues-for-qemuarmv5.patch | 59 +++++ .../0006-rename-stdout-stderr-members.patch | 205 ++++++++++++++++++ ...PYTHON_INSTALL_DIR-by-running-python.patch | 24 -- .../0030-Run-python-scripts-using-env.patch | 34 --- meta/recipes-devtools/dnf/dnf_4.24.0.bb | 96 -------- meta/recipes-devtools/dnf/dnf_5.4.6.0.bb | 181 ++++++++++++++++ 23 files changed, 736 insertions(+), 365 deletions(-) delete mode 100644 meta/recipes-devtools/dnf/dnf/0001-Corretly-install-tmpfiles.d-configuration.patch delete mode 100644 meta/recipes-devtools/dnf/dnf/0001-Do-not-hardcode-etc-and-systemd-unit-directories.patch create mode 100644 meta/recipes-devtools/dnf/dnf/0001-Do-not-hardcode-the-systemd-unit-directory.patch delete mode 100644 meta/recipes-devtools/dnf/dnf/0001-dnf-write-the-log-lock-to-root.patch delete mode 100644 meta/recipes-devtools/dnf/dnf/0001-lock.py-fix-Exception-handling.patch delete mode 100644 meta/recipes-devtools/dnf/dnf/0001-set-python-path-for-completion_helper.patch create mode 100644 meta/recipes-devtools/dnf/dnf/0002-cmake-set-CMP0190-to-OLD.patch create mode 100644 meta/recipes-devtools/dnf/dnf/0003-Do-not-hardcode-system_cachedir.patch create mode 100644 meta/recipes-devtools/dnf/dnf/0004-add-support-for-gcc-12-and-below.patch delete mode 100644 meta/recipes-devtools/dnf/dnf/0005-Do-not-prepend-installroot-to-logdir.patch create mode 100644 meta/recipes-devtools/dnf/dnf/0005-libdnf-fix-arm-arch-mapping-issues-for-qemuarmv5.patch create mode 100644 meta/recipes-devtools/dnf/dnf/0006-rename-stdout-stderr-members.patch delete mode 100644 meta/recipes-devtools/dnf/dnf/0029-Do-not-set-PYTHON_INSTALL_DIR-by-running-python.patch delete mode 100644 meta/recipes-devtools/dnf/dnf/0030-Run-python-scripts-using-env.patch delete mode 100644 meta/recipes-devtools/dnf/dnf_4.24.0.bb create mode 100644 meta/recipes-devtools/dnf/dnf_5.4.6.0.bb diff --git a/meta-selftest/lib/oeqa/runtime/cases/dnf_runtime.py b/meta-selftest/lib/oeqa/runtime/cases/dnf_runtime.py index d2f0f88f7d..27158b5193 100644 --- a/meta-selftest/lib/oeqa/runtime/cases/dnf_runtime.py +++ b/meta-selftest/lib/oeqa/runtime/cases/dnf_runtime.py @@ -41,11 +41,11 @@ class DnfSelftest(DnfTest): import re # Use '-y' for non-interactive mode: automatically import the feed signing key - output_makecache = self.dnf('-vy makecache') + output_makecache = self.dnf('-y makecache') self.assertTrue(re.match(r".*Failed to synchronize cache", output_makecache, re.DOTALL) is None, msg = "dnf makecache failed to synchronize repo: %s" %(output_makecache)) self.assertTrue(re.match(r".*Metadata cache created", output_makecache, re.DOTALL) is not None, msg = "dnf makecache failed: %s" %(output_makecache)) - output_repoinfo = self.dnf('-v repoinfo') - matchobj = re.match(r".*Repo-pkgs\s*:\s*(?P[0-9]+)", output_repoinfo, re.DOTALL) + output_repoinfo = self.dnf('repoinfo') + matchobj = re.match(r".*Total packages\s*:\s*(?P[0-9]+)", output_repoinfo, re.DOTALL) self.assertTrue(matchobj is not None, msg = "Could not find the amount of packages in dnf repoinfo output: %s" %(output_repoinfo)) self.assertTrue(int(matchobj.group('n_pkgs')) > 0, msg = "Amount of remote packages is not more than zero: %s\n" %(output_repoinfo)) diff --git a/meta/conf/distro/include/maintainers.inc b/meta/conf/distro/include/maintainers.inc index 9c7ab70bd0..4ad835fca4 100644 --- a/meta/conf/distro/include/maintainers.inc +++ b/meta/conf/distro/include/maintainers.inc @@ -157,7 +157,7 @@ RECIPE_MAINTAINER:pn-diffutils = "Chen Qi " RECIPE_MAINTAINER:pn-distcc = "Hongxu Jia " RECIPE_MAINTAINER:pn-distcc-config = "Yi Zhao " RECIPE_MAINTAINER:pn-dmidecode = "Unassigned " -RECIPE_MAINTAINER:pn-dnf = "Unassigned " +RECIPE_MAINTAINER:pn-dnf = "Adam Duskett " RECIPE_MAINTAINER:pn-docbook-xml-dtd4 = "Kanksha Paturi " RECIPE_MAINTAINER:pn-docbook-xsl-stylesheets = "Kanksha Paturi " RECIPE_MAINTAINER:pn-dos2unix = "Khem Raj " diff --git a/meta/lib/oe/package_manager/rpm/__init__.py b/meta/lib/oe/package_manager/rpm/__init__.py index ccb4316bd0..8c9099613c 100644 --- a/meta/lib/oe/package_manager/rpm/__init__.py +++ b/meta/lib/oe/package_manager/rpm/__init__.py @@ -163,7 +163,7 @@ class RpmPM(PackageManager): gpg_opts += 'gpgkey=file://%s/pki/packagefeed-gpg/PACKAGEFEED-GPG-KEY-%s-%s\n' % (self.d.getVar('sysconfdir'), self.d.getVar('DISTRO'), self.d.getVar('DISTRO_CODENAME')) if self.d.getVar('RPM_SIGN_PACKAGES') != '1': - gpg_opts += 'gpgcheck=0\n' + gpg_opts += 'pkg_gpgcheck=0\n' bb.utils.mkdirhier(oe.path.join(self.target_rootfs, "etc", "yum.repos.d")) remote_uris = self.construct_uris(feed_uris.split(), feed_base_paths.split()) @@ -200,11 +200,11 @@ class RpmPM(PackageManager): package_exclude = self.d.getVar('PACKAGE_EXCLUDE') exclude_pkgs = (bad_recommendations.split() if bad_recommendations else []) + (package_exclude.split() if package_exclude else []) - output = self._invoke_dnf((["--skip-broken"] if attempt_only else []) + - (["-x", ",".join(exclude_pkgs)] if len(exclude_pkgs) > 0 else []) + + output = self._invoke_dnf((["-x", ",".join(exclude_pkgs)] if len(exclude_pkgs) > 0 else []) + (["--setopt=install_weak_deps=False"] if (hard_depends_only or self.d.getVar('NO_RECOMMENDATIONS') == "1") else []) + - (["--nogpgcheck"] if self.d.getVar('RPM_SIGN_PACKAGES') != '1' else ["--setopt=gpgcheck=True"]) + + (["--no-gpgchecks"] if self.d.getVar('RPM_SIGN_PACKAGES') != '1' else ["--setopt=pkg_gpgcheck=True"]) + ["install"] + + (["--skip-broken"] if attempt_only else []) + pkgs) failed_scriptlets_pkgnames = collections.OrderedDict() @@ -212,8 +212,9 @@ class RpmPM(PackageManager): if line.startswith("Error: Systemctl"): bb.error(line) - if line.startswith("Error in POSTIN scriptlet in rpm package"): - failed_scriptlets_pkgnames[line.split()[-1]] = True + if "Error in %post scriptlet:" in line: + pkgname = line.split()[-1].rsplit("-", 2)[0] + failed_scriptlets_pkgnames[pkgname] = True if len(failed_scriptlets_pkgnames) > 0: failed_postinsts_abort(list(failed_scriptlets_pkgnames.keys()), self.d.expand("${T}/log.do_${BB_CURRENTTASK}")) @@ -313,16 +314,21 @@ class RpmPM(PackageManager): def _invoke_dnf(self, dnf_args, fatal = True, print_output = True ): os.environ['RPM_ETCCONFIGDIR'] = self.target_rootfs + # Set XDG_CACHE_HOME to avoid dnf attempting to install oe-repo system cache to a /tmp/ directory on the host. + os.environ['XDG_CACHE_HOME'] = oe.path.join(os.path.join(self.target_rootfs, "var/cache/libdnf5")) + dnf_cmd = bb.utils.which(os.getenv('PATH'), "dnf") - standard_dnf_args = ["-v", "--rpmverbosity=info", "-y", - "-c", oe.path.join(self.target_rootfs, "etc/dnf/dnf.conf"), + standard_dnf_args = ["-y", + "--config", os.path.join(self.d.getVar('STAGING_DIR_NATIVE'), "etc/dnf/dnf.conf"), + "--setopt=rpmverbosity=info", "--setopt=reposdir=%s" %(oe.path.join(self.target_rootfs, "etc/yum.repos.d")), + "--setopt=pluginconfpath=%s" %(os.path.join(self.d.getVar('STAGING_DIR_NATIVE'), "etc/dnf/dnf.conf")), "--installroot=%s" % (self.target_rootfs), "--setopt=logdir=%s" % (self.d.getVar('T')), "--setopt=optional_metadata_types=filelists", ] if hasattr(self, "rpm_repo_dir"): - standard_dnf_args.append("--repofrompath=oe-repo,%s" % (self.rpm_repo_dir)) + standard_dnf_args.append("--repofrompath=oe-repo,file://%s" % (self.rpm_repo_dir)) cmd = [dnf_cmd] + standard_dnf_args + dnf_args bb.note('Running %s' % ' '.join(cmd)) try: @@ -335,9 +341,9 @@ class RpmPM(PackageManager): e_output = e.output.decode("utf-8") # RPM 6 fails the entire transaction when a %post scriptlet # fails, causing dnf to exit non-zero. Let install_pkgs handle - # scriptlet failures via its existing "Error in POSTIN scriptlet" + # scriptlet failures via its existing "Error in %post scriptlet:" # scanning rather than treating this as a fatal dnf invocation error. - if "Error in POSTIN scriptlet in rpm package" in e_output: + if "Error in %post scriptlet:" in e_output: bb.note(e_output) return e_output extra_info = "" @@ -406,8 +412,7 @@ class RpmPM(PackageManager): pkg_name = output.splitlines()[-1] if not pkg_name.endswith(".rpm"): bb.fatal("dnf could not find package %s in repository: %s" %(pkg, output)) - # Strip file: prefix - pkg_path = pkg_name[5:] + pkg_path = pkg_name.removeprefix("file://") tar_cmd = bb.utils.which(os.getenv("PATH"), "tar") rpm2archive_cmd = bb.utils.which(os.getenv("PATH"), "rpm2archive") diff --git a/meta/lib/oe/package_manager/rpm/rootfs.py b/meta/lib/oe/package_manager/rpm/rootfs.py index 698685c067..8d54b5ab48 100644 --- a/meta/lib/oe/package_manager/rpm/rootfs.py +++ b/meta/lib/oe/package_manager/rpm/rootfs.py @@ -17,6 +17,9 @@ class PkgRootfs(Rootfs): r'|exit 1\b|ERROR: |Error: |Error |ERROR '\ r'|Failed |Failed: |Failed$|Failed\(\d+\):)' + if self.d.getVar('RPM_SIGN_PACKAGES') != '1': + self.warn_check_regex = r'^(?!.*Warning: skipped OpenPGP checks)(warn|Warn|WARNING:)' + self.manifest = PkgManifest(d, manifest_dir) self.pm = RpmPM(d, diff --git a/meta/lib/oeqa/runtime/cases/dnf.py b/meta/lib/oeqa/runtime/cases/dnf.py index 3ccb18ce83..1becc8d8a0 100644 --- a/meta/lib/oeqa/runtime/cases/dnf.py +++ b/meta/lib/oeqa/runtime/cases/dnf.py @@ -17,7 +17,7 @@ from oeqa.runtime.decorator.package import OEHasPackage class DnfTest(OERuntimeTestCase): def dnf(self, command, expected = 0): - command = 'dnf %s' % command + command = 'dnf --setopt=protect_running_kernel=False %s' % command status, output = self.target.run(command, 1500) message = os.linesep.join([command, output]) self.assertEqual(status, expected, message) @@ -48,7 +48,7 @@ class DnfBasicTest(DnfTest): @OETestDepends(['dnf.DnfBasicTest.test_dnf_help']) def test_dnf_history(self): - self.dnf('history') + self.dnf('history list') class DnfRepoTest(DnfTest): @@ -68,7 +68,7 @@ class DnfRepoTest(DnfTest): deploy_url = 'http://%s:%s/' %(self.target.server_ip, self.repo_server.port) cmdlinerepoopts = ["--repofrompath=oe-testimage-repo-%s,%s%s" %(arch, deploy_url, arch) for arch in pkgarchs] - output = self.dnf(" ".join(cmdlinerepoopts) + " --nogpgcheck " + command) + output = self.dnf(" ".join(cmdlinerepoopts) + " --no-gpgchecks " + command) return output @OETestDepends(['dnf.DnfBasicTest.test_dnf_help']) @@ -96,7 +96,7 @@ class DnfRepoTest(DnfTest): def test_dnf_install_from_disk(self): self.dnf_with_repo('remove -y dnf-test-dep') self.dnf_with_repo('install -y --downloadonly dnf-test-dep') - status, output = self.target.run('find /var/cache/dnf -name dnf-test-dep*rpm') + status, output = self.target.run('find /var/cache/libdnf5 -name dnf-test-dep*rpm') self.assertEqual(status, 0, output) self.dnf_with_repo('install -y %s' % output) @@ -134,8 +134,8 @@ class DnfRepoTest(DnfTest): self.target.run('cp -r /etc/dnf %s/etc' % rootpath, 1500) self.target.run('cp /bin/sh %s/bin' % rootpath, 1500) self.target.run('mount -o bind /dev %s/dev/' % rootpath, 1500) - self.dnf_with_repo('install --installroot=%s -v -y --rpmverbosity=debug busybox' % rootpath) - status, output = self.target.run('test -e %s/var/cache/dnf' % rootpath, 1500) + self.dnf_with_repo('install --installroot=%s -y busybox' % rootpath) + status, output = self.target.run('test -e %s/var/cache/libdnf5' % rootpath, 1500) self.assertEqual(0, status, output) status, output = self.target.run('test -e %s/bin/busybox' % rootpath, 1500) self.assertEqual(0, status, output) @@ -158,8 +158,8 @@ class DnfRepoTest(DnfTest): self.target.run('cp -r /etc/dnf %s/etc' % rootpath) self.target.run('cp /bin/busybox %s/bin/sh' % rootpath) self.target.run('mount -o bind /dev %s/dev/' % rootpath) - self.dnf_with_repo('install --installroot=%s -v -y --rpmverbosity=debug busybox' % rootpath) - status, output = self.target.run('test -e %s/var/cache/dnf' % rootpath) + self.dnf_with_repo('install --installroot=%s -y busybox' % rootpath) + status, output = self.target.run('test -e %s/var/cache/libdnf5' % rootpath) self.assertEqual(0, status, output) status, output = self.target.run('test -e %s/bin/busybox' % rootpath) self.assertEqual(0, status, output) diff --git a/meta/lib/oeqa/selftest/cases/buildoptions.py b/meta/lib/oeqa/selftest/cases/buildoptions.py index 59145df0fd..92d8595591 100644 --- a/meta/lib/oeqa/selftest/cases/buildoptions.py +++ b/meta/lib/oeqa/selftest/cases/buildoptions.py @@ -27,12 +27,12 @@ class ImageOptionsTests(OESelftestTestCase): bitbake("core-image-minimal") log_data_file = os.path.join(get_bb_var("WORKDIR", "core-image-minimal"), "temp/log.do_rootfs") log_data_created = ftools.read_file(log_data_file) - incremental_created = re.search(r"Installing\s*:\s*packagegroup-core-ssh-openssh", log_data_created) + incremental_created = re.search(r"^Installing:\n(?: .*\n)*? packagegroup-core-ssh-openssh\s", log_data_created, re.M) self.remove_config('IMAGE_FEATURES += "ssh-server-openssh"') self.assertTrue(incremental_created, msg = "Match failed in:\n%s" % log_data_created) bitbake("core-image-minimal") log_data_removed = ftools.read_file(log_data_file) - incremental_removed = re.search(r"Erasing\s*:\s*packagegroup-core-ssh-openssh", log_data_removed) + incremental_removed = re.search(r"^Removing:\n(?: .*\n)*? packagegroup-core-ssh-openssh\s", log_data_removed, re.M) self.assertTrue(incremental_removed, msg = "Match failed in:\n%s" % log_data_removed) def test_ccache_tool(self): diff --git a/meta/lib/oeqa/selftest/cases/runtime_test.py b/meta/lib/oeqa/selftest/cases/runtime_test.py index b82c7c7294..658253d296 100644 --- a/meta/lib/oeqa/selftest/cases/runtime_test.py +++ b/meta/lib/oeqa/selftest/cases/runtime_test.py @@ -209,6 +209,11 @@ QB_FSINFO = "tar.zst:rootfs-dbg" features += 'EXTRA_IMAGE_FEATURES += "package-management"\n' features += 'PACKAGE_CLASSES = "package_rpm"\n' + # librepo and rpm require sequoia + # https://github.com/rpm-software-management/dnf5/issues/2539 + features += 'PACKAGECONFIG:append:pn-rpm = " sequoia"\n' + features += 'PACKAGECONFIG:append:pn-librepo = " sequoia"\n' + bitbake('gnupg-native -c addto_recipe_sysroot') # Enable package feed signing diff --git a/meta/recipes-devtools/dnf/dnf/0001-Corretly-install-tmpfiles.d-configuration.patch b/meta/recipes-devtools/dnf/dnf/0001-Corretly-install-tmpfiles.d-configuration.patch deleted file mode 100644 index fd942228b9..0000000000 --- a/meta/recipes-devtools/dnf/dnf/0001-Corretly-install-tmpfiles.d-configuration.patch +++ /dev/null @@ -1,18 +0,0 @@ -From f70eb308c837f2c944e23bb680a501a605004d65 Mon Sep 17 00:00:00 2001 -From: Alexander Kanavin -Date: Thu, 26 Jan 2017 16:36:20 +0200 -Subject: [PATCH] Corretly install tmpfiles.d configuration - -Upstream-Status: Inappropriate [oe-core specific] -Signed-off-by: Alexander Kanavin ---- - etc/tmpfiles.d/CMakeLists.txt | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/etc/tmpfiles.d/CMakeLists.txt b/etc/tmpfiles.d/CMakeLists.txt -index f69c773e..3eb6d0e8 100644 ---- a/etc/tmpfiles.d/CMakeLists.txt -+++ b/etc/tmpfiles.d/CMakeLists.txt -@@ -1 +1 @@ --INSTALL (FILES dnf.conf DESTINATION /usr/lib/tmpfiles.d/) -+INSTALL (FILES dnf.conf DESTINATION ${SYSCONFDIR}/tmpfiles.d/) diff --git a/meta/recipes-devtools/dnf/dnf/0001-Do-not-hardcode-etc-and-systemd-unit-directories.patch b/meta/recipes-devtools/dnf/dnf/0001-Do-not-hardcode-etc-and-systemd-unit-directories.patch deleted file mode 100644 index 9d978cdc5f..0000000000 --- a/meta/recipes-devtools/dnf/dnf/0001-Do-not-hardcode-etc-and-systemd-unit-directories.patch +++ /dev/null @@ -1,26 +0,0 @@ -From c2b2b91b58f4531d4baf0a01f5d868d71e577a84 Mon Sep 17 00:00:00 2001 -From: Alexander Kanavin -Date: Thu, 26 Jan 2017 16:25:47 +0200 -Subject: [PATCH] Do not hardcode /etc and systemd unit directories - -Upstream-Status: Inappropriate [oe-core specific] -Signed-off-by: Alexander Kanavin ---- - CMakeLists.txt | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/CMakeLists.txt b/CMakeLists.txt -index e71e9517..8fcb2069 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -3,8 +3,8 @@ PROJECT (dnf NONE) - - INCLUDE (${CMAKE_SOURCE_DIR}/VERSION.cmake) - --SET( SYSCONFDIR /etc) --SET( SYSTEMD_DIR /usr/lib/systemd/system) -+SET( SYSCONFDIR ${CMAKE_INSTALL_SYSCONFDIR}) -+SET( SYSTEMD_DIR $ENV{systemd_system_unitdir}) - - IF (NOT PYTHON_DESIRED) - FIND_PACKAGE (PythonInterp REQUIRED) diff --git a/meta/recipes-devtools/dnf/dnf/0001-Do-not-hardcode-the-systemd-unit-directory.patch b/meta/recipes-devtools/dnf/dnf/0001-Do-not-hardcode-the-systemd-unit-directory.patch new file mode 100644 index 0000000000..e79cab1b44 --- /dev/null +++ b/meta/recipes-devtools/dnf/dnf/0001-Do-not-hardcode-the-systemd-unit-directory.patch @@ -0,0 +1,29 @@ +From c07c29e50327a132f330287cd4e0ff428d140c96 Mon Sep 17 00:00:00 2001 +From: Adam Duskett +Date: Thu, 15 Oct 2026 11:54:09 +0200 +Subject: [PATCH] Do not hardcode the systemd unit directory + +Upstream-Status: Inappropriate [oe-core specific] + +Rebased for 5.4.6.0 +Signed-off-by: Adam Duskett +--- + CMakeLists.txt | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 50ec5f7..2583772 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -7,7 +7,7 @@ project(dnf5 LANGUAGES CXX C VERSION ${VERSION_PRIME}.${VERSION_MAJOR}.${VERSION + cmake_policy(VERSION ${CMAKE_VERSION}) + + list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") +-set(SYSTEMD_DIR "/usr/lib/systemd/system" CACHE PATH "Directory for systemd unit files") ++set(SYSTEMD_DIR $ENV{systemd_system_unitdir} CACHE PATH "Directory for systemd unit files") + set(TMPFILES_DIR "/usr/lib/tmpfiles.d" CACHE PATH "Directory for systemd tmpfiles.d files") + + message("Building ${PROJECT_NAME} version ${PROJECT_VERSION}") +-- +2.56.0 + diff --git a/meta/recipes-devtools/dnf/dnf/0001-dnf-write-the-log-lock-to-root.patch b/meta/recipes-devtools/dnf/dnf/0001-dnf-write-the-log-lock-to-root.patch deleted file mode 100644 index 18f9a30949..0000000000 --- a/meta/recipes-devtools/dnf/dnf/0001-dnf-write-the-log-lock-to-root.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 049e2832284ab883e185d9020c881518a68e6c38 Mon Sep 17 00:00:00 2001 -From: Alexander Kanavin -Date: Tue, 28 Apr 2020 15:55:00 +0200 -Subject: [PATCH] dnf: write the log lock to root - -Writing it to /var/log appears to be racing with installation -of base-files, and if lock is created first, base-files -will refuse to install (due to the target directory -already existing, and base-files creating it as a symlink). - -Upstream-Status: Inappropriate [oe-core specific] -Signed-off-by: Alexander Kanavin ---- - dnf/logging.py | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/dnf/logging.py b/dnf/logging.py -index ef0b25f3..94610af6 100644 ---- a/dnf/logging.py -+++ b/dnf/logging.py -@@ -118,7 +118,7 @@ class MultiprocessRotatingFileHandler(logging.handlers.RotatingFileHandler): - def __init__(self, filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=False): - super(MultiprocessRotatingFileHandler, self).__init__( - filename, mode, maxBytes, backupCount, encoding, delay) -- self.rotate_lock = dnf.lock.build_log_lock("/var/log/", True) -+ self.rotate_lock = dnf.lock.build_log_lock("/", True) - - def emit(self, record): - while True: diff --git a/meta/recipes-devtools/dnf/dnf/0001-lock.py-fix-Exception-handling.patch b/meta/recipes-devtools/dnf/dnf/0001-lock.py-fix-Exception-handling.patch deleted file mode 100644 index 6bffe9af0a..0000000000 --- a/meta/recipes-devtools/dnf/dnf/0001-lock.py-fix-Exception-handling.patch +++ /dev/null @@ -1,62 +0,0 @@ -From 3881757eabfde2ff54400ab127b106ab085d83f0 Mon Sep 17 00:00:00 2001 -From: Changqing Li -Date: Wed, 13 Mar 2024 11:22:05 +0800 -Subject: [PATCH] lock.py: fix Exception handling - -Before, when logdir is not writable, _try_lock will raise an Exception -like "Permission denied: '/var/log/log_lock.pid'", and in this case, -_unlock_thread will not be called and the variable count will not be -handled, it maybe cause log_lock.pid not be deleted in case like [1]. - -For [1], it is an cross compile case, when dnf install some packages to -rootfs, seems like some threads don't do chroot like work, some threads -do chroot like work. so for the threads don't do chroot, "Permission denied" -Exception happend, for the threads that do chroot, log_lock.pid will be -created under installroot/var/log/log_lock.pid, since variable count not -handled correct before, log_lock.pid may not be deleted correctly. - -So fixed like this, if _try_lock raise Exception, _unlock_thread first, -then raise the Exception. - -[1] https://github.com/rpm-software-management/dnf/issues/1963 - -Upstream-Status: Submitted [ https://github.com/rpm-software-management/dnf/pull/2065 ] - -Signed-off-by: Changqing Li ---- - dnf/lock.py | 12 ++++++++++-- - 1 file changed, 10 insertions(+), 2 deletions(-) - -diff --git a/dnf/lock.py b/dnf/lock.py -index 6817aac9..5718062a 100644 ---- a/dnf/lock.py -+++ b/dnf/lock.py -@@ -128,7 +128,11 @@ class ProcessLock(object): - self._lock_thread() - prev_pid = -1 - my_pid = os.getpid() -- pid = self._try_lock(my_pid) -+ try: -+ pid = self._try_lock(my_pid) -+ except Exception: -+ self._unlock_thread() -+ raise - while pid != my_pid: - if pid != -1: - if not self.blocking: -@@ -140,7 +144,11 @@ class ProcessLock(object): - logger.info(msg) - prev_pid = pid - time.sleep(1) -- pid = self._try_lock(my_pid) -+ try: -+ pid = self._try_lock(my_pid) -+ except Exception: -+ self._unlock_thread() -+ raise - - def __exit__(self, *exc_args): - if self.count == 1: --- -2.25.1 - diff --git a/meta/recipes-devtools/dnf/dnf/0001-set-python-path-for-completion_helper.patch b/meta/recipes-devtools/dnf/dnf/0001-set-python-path-for-completion_helper.patch deleted file mode 100644 index fcd970a7ae..0000000000 --- a/meta/recipes-devtools/dnf/dnf/0001-set-python-path-for-completion_helper.patch +++ /dev/null @@ -1,21 +0,0 @@ -From fa32c7dcabaa3c00d3620a3266e49629365c0cbe Mon Sep 17 00:00:00 2001 -From: Jeremy Puhlman -Date: Wed, 11 Mar 2020 22:10:02 +0000 -Subject: [PATCH] set python path for completion_helper - -Upstream-Status: Inappropriate [oe-core specific] -Signed-off-by: Jeremy Puhlman ---- - dnf/cli/completion_helper.py.in | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/dnf/cli/completion_helper.py.in b/dnf/cli/completion_helper.py.in -index 0da0f2a2..9330d15b 100644 ---- a/dnf/cli/completion_helper.py.in -+++ b/dnf/cli/completion_helper.py.in -@@ -1,4 +1,4 @@ --#!@PYTHON_EXECUTABLE@ -+#!/usr/bin/env python3 - # - # This file is part of dnf. - # diff --git a/meta/recipes-devtools/dnf/dnf/0002-cmake-set-CMP0190-to-OLD.patch b/meta/recipes-devtools/dnf/dnf/0002-cmake-set-CMP0190-to-OLD.patch new file mode 100644 index 0000000000..1e8ccbf889 --- /dev/null +++ b/meta/recipes-devtools/dnf/dnf/0002-cmake-set-CMP0190-to-OLD.patch @@ -0,0 +1,51 @@ +From 86755bbc9a6596f58f0437823de0ef8a6209e4ab Mon Sep 17 00:00:00 2001 +From: Adam Duskett +Date: Thu, 15 Oct 2026 11:54:37 +0200 +Subject: [PATCH] cmake: set CMP0190 to OLD + +Starting with CMake 4.1, cross-compiling python3 requires setting +-DCMAKE_CROSSCOMPILING_EMULATOR which can be done by inheriting +cmake-qemu. However, this leads to the following error: +Interpreter: Cannot run the interpreter ".../python3-native/python3" + +This is due to the target sysroot python3 binary not being installed +because it can't be executed. + +Set CMP0190 to old to force the old behavior. + +https://cmake.org/cmake/help/latest/policy/CMP0190.html + +Upstream-Status: Inappropriate [oe-core specific] +Signed-off-by: Adam Duskett +--- + bindings/python3/CMakeLists.txt | 1 + + libdnf5-plugins/python_plugins_loader/CMakeLists.txt | 1 + + 2 files changed, 2 insertions(+) + +diff --git a/bindings/python3/CMakeLists.txt b/bindings/python3/CMakeLists.txt +index cb93269..aa961d0 100644 +--- a/bindings/python3/CMakeLists.txt ++++ b/bindings/python3/CMakeLists.txt +@@ -6,6 +6,7 @@ endif() + message("Building bindings for python3") + + ++cmake_policy(SET CMP0190 OLD) + find_package(Python3 REQUIRED COMPONENTS Interpreter Development) + include_directories(${Python3_INCLUDE_DIRS}) + +diff --git a/libdnf5-plugins/python_plugins_loader/CMakeLists.txt b/libdnf5-plugins/python_plugins_loader/CMakeLists.txt +index 9ee2ffb..b8f908a 100644 +--- a/libdnf5-plugins/python_plugins_loader/CMakeLists.txt ++++ b/libdnf5-plugins/python_plugins_loader/CMakeLists.txt +@@ -6,6 +6,7 @@ if(NOT WITH_PYTHON_PLUGINS_LOADER) + return() + endif() + ++cmake_policy(SET CMP0190 OLD) + find_package(Python3 REQUIRED COMPONENTS Interpreter Development) + find_package(SWIG REQUIRED) + include_directories(${Python3_INCLUDE_DIRS}) +-- +2.56.0 + diff --git a/meta/recipes-devtools/dnf/dnf/0003-Do-not-hardcode-system_cachedir.patch b/meta/recipes-devtools/dnf/dnf/0003-Do-not-hardcode-system_cachedir.patch new file mode 100644 index 0000000000..0055b2f72e --- /dev/null +++ b/meta/recipes-devtools/dnf/dnf/0003-Do-not-hardcode-system_cachedir.patch @@ -0,0 +1,36 @@ +From 921f6357dcba131d11366ac11249e1a9b2649cd8 Mon Sep 17 00:00:00 2001 +From: Adam Duskett +Date: Thu, 15 Oct 2026 11:55:10 +0200 +Subject: [PATCH] Do not hardcode system_cachedir + +Because dnf is ran in a fakeroot environment, the UID of the +"user" is 0, and the hardcoded paths to the host system are +attempted, leading to the following error: + +[log_check] DEBUG: Failed to expire repository cache in path "/var/cache/libdnf5/ + +Remove the check for geteuid() == 0 and rely only on the +user cache dir. + +Upstream-Status: Inappropriate [oe-core specific] +Signed-off-by: Adam Duskett +--- + libdnf5/conf/config_main.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/libdnf5/conf/config_main.cpp b/libdnf5/conf/config_main.cpp +index 2d808ec..a169af4 100644 +--- a/libdnf5/conf/config_main.cpp ++++ b/libdnf5/conf/config_main.cpp +@@ -244,7 +244,7 @@ class ConfigMain::Impl { + // Repo main config + + OptionNumber retries{10}; +- OptionPath cachedir{geteuid() == 0 ? SYSTEM_CACHEDIR : libdnf5::xdg::get_user_cache_dir() / "libdnf5"}; ++ OptionPath cachedir{libdnf5::xdg::get_user_cache_dir() / "libdnf5"}; + OptionBool fastestmirror{false}; + OptionStringAppendList excludeenvs{std::vector{}}; + OptionStringAppendList excludegroups{std::vector{}}; +-- +2.56.0 + diff --git a/meta/recipes-devtools/dnf/dnf/0004-add-support-for-gcc-12-and-below.patch b/meta/recipes-devtools/dnf/dnf/0004-add-support-for-gcc-12-and-below.patch new file mode 100644 index 0000000000..1ef49e307a --- /dev/null +++ b/meta/recipes-devtools/dnf/dnf/0004-add-support-for-gcc-12-and-below.patch @@ -0,0 +1,135 @@ +From 2305a8fcd6aec81676c684cb06b9d4a676af3bd3 Mon Sep 17 00:00:00 2001 +From: Adam Duskett +Date: Thu, 15 Oct 2026 11:58:24 +0200 +Subject: [PATCH] add support for gcc 12 and below + + - Add missing headers for gcc <= 12 + - Add support for libfmt if the format header is not found + - Add an ifdef to support compilers without std::chrono::parse + +Commit 1e8ced2293ed62bc7774ef5a2d1aeb48e29e2236 introduced using +std::chrono::parse which wasn't available until gcc 14.1. This change causes +build failures when cross-compiling on older, but still supported platforms +like Debian 12. + +Note: This patch should be removed once the minimum GCC version +for Yocto is >= 14.1. + +Upstream-Status: Inappropriate [oe-core specific] +Signed-off-by: Adam Duskett +--- + libdnf5-cli/session.cpp | 12 ++++++++++++ + libdnf5/CMakeLists.txt | 9 +++++++++ + libdnf5/base/goal_elements.cpp | 2 +- + libdnf5/conf/config_main.cpp | 8 ++++++++ + libdnf5/logger/memory_buffer_logger.cpp | 1 + + 5 files changed, 31 insertions(+), 1 deletion(-) + +diff --git a/libdnf5-cli/session.cpp b/libdnf5-cli/session.cpp +index b2fa196..c5fc02f 100644 +--- a/libdnf5-cli/session.cpp ++++ b/libdnf5-cli/session.cpp +@@ -22,6 +22,7 @@ + #include + + #include ++#include + #include + #include + #include +@@ -254,7 +255,18 @@ DateOption::DateOption( + new libdnf5::OptionNumber(0, [](const std::string & value) { + std::istringstream ss(value); + std::chrono::sys_seconds tp; ++#if defined(__cpp_lib_chrono) && __cpp_lib_chrono >= 201907L + ss >> std::chrono::parse("%F", tp); ++#else ++ std::tm tm{}; ++ ss >> std::noskipws >> std::get_time(&tm, "%Y-%m-%d"); ++ const auto ymd = std::chrono::year{tm.tm_year + 1900} / (tm.tm_mon + 1) / tm.tm_mday; ++ if (ymd.ok()) { ++ tp = std::chrono::sys_days{ymd}; ++ } else { ++ ss.setstate(std::ios_base::failbit); ++ } ++#endif + if (ss.fail()) { + throw libdnf5::cli::ArgumentParserError( + M_("Invalid date passed: \"{}\". Dates in \"YYYY-MM-DD\" format are expected"), value); +diff --git a/libdnf5/CMakeLists.txt b/libdnf5/CMakeLists.txt +index 359e39e..315a83b 100644 +--- a/libdnf5/CMakeLists.txt ++++ b/libdnf5/CMakeLists.txt +@@ -11,6 +11,9 @@ if (NOT WITH_MODULEMD) + list(REMOVE_ITEM LIBDNF5_SOURCES ${LIBDNF5_SOURCES_MODULES}) + endif() + ++include(CheckIncludeFileCXX) ++check_include_file_cxx("format" CXX_FORMAT_SUPPORT) ++ + # gather all pkg-config requires and write them to a .pc file later + list(APPEND LIBDNF5_PC_REQUIRES) + list(APPEND LIBDNF5_PC_REQUIRES_PRIVATE) +@@ -49,6 +52,12 @@ set_target_properties(libdnf5 PROPERTIES SOVERSION ${DNF_SO_VERSION}) + # required to have dlopen symbol + target_link_libraries(libdnf5 PUBLIC ${CMAKE_DL_LIBS}) + ++if (NOT CXX_FORMAT_SUPPORT) ++ find_package(fmt REQUIRED) ++ target_link_libraries(libdnf5_obj PRIVATE fmt::fmt) ++ target_compile_definitions(libdnf5_obj PUBLIC USE_FMTLIB) ++endif() ++ + # required by clang + target_link_libraries(libdnf5 PUBLIC stdc++) + +diff --git a/libdnf5/base/goal_elements.cpp b/libdnf5/base/goal_elements.cpp +index e5d4a4b..757a6f2 100644 +--- a/libdnf5/base/goal_elements.cpp ++++ b/libdnf5/base/goal_elements.cpp +@@ -17,7 +17,7 @@ + // You should have received a copy of the GNU Lesser General Public License + // along with libdnf. If not, see . + +- ++#include + #include "libdnf5/base/goal_elements.hpp" + + #include "libdnf5/common/exception.hpp" +diff --git a/libdnf5/conf/config_main.cpp b/libdnf5/conf/config_main.cpp +index a169af4..8f0c8fe 100644 +--- a/libdnf5/conf/config_main.cpp ++++ b/libdnf5/conf/config_main.cpp +@@ -37,9 +37,17 @@ + #include + #include + #include ++#include + #include + #include + ++#ifdef USE_FMTLIB ++#include ++namespace std { ++ using fmt::format; ++} ++#endif ++ + namespace libdnf5 { + + /// @brief Converts a friendly bandwidth option to bytes +diff --git a/libdnf5/logger/memory_buffer_logger.cpp b/libdnf5/logger/memory_buffer_logger.cpp +index 85bf707..89307e9 100644 +--- a/libdnf5/logger/memory_buffer_logger.cpp ++++ b/libdnf5/logger/memory_buffer_logger.cpp +@@ -20,6 +20,7 @@ + #include "libdnf5/logger/memory_buffer_logger.hpp" + + #include ++#include + + namespace libdnf5 { + +-- +2.56.0 + diff --git a/meta/recipes-devtools/dnf/dnf/0005-Do-not-prepend-installroot-to-logdir.patch b/meta/recipes-devtools/dnf/dnf/0005-Do-not-prepend-installroot-to-logdir.patch deleted file mode 100644 index a1c58d6563..0000000000 --- a/meta/recipes-devtools/dnf/dnf/0005-Do-not-prepend-installroot-to-logdir.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 0e7fc4a8523aad616493e6ad33c509e1e530d852 Mon Sep 17 00:00:00 2001 -From: Alexander Kanavin -Date: Wed, 11 Jan 2017 15:10:13 +0200 -Subject: [PATCH] Do not prepend installroot to logdir. - -This would otherwise write the logs into rootfs/var/log -(whereas we want them in $T), -and will break installation of base-files rpm. - -Upstream-Status: Inappropriate [oe-core specific] -Signed-off-by: Alexander Kanavin ---- - dnf/cli/cli.py | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/dnf/cli/cli.py b/dnf/cli/cli.py -index d3844df3..ac080f79 100644 ---- a/dnf/cli/cli.py -+++ b/dnf/cli/cli.py -@@ -954,7 +954,7 @@ class Cli(object): - logger.warning(_("Unable to detect release version (use '--releasever' to specify " - "release version)")) - -- for opt in ('cachedir', 'logdir', 'persistdir'): -+ for opt in ('cachedir', 'persistdir'): - conf.prepend_installroot(opt) - - self.base._logging._setup_from_dnf_conf(conf) diff --git a/meta/recipes-devtools/dnf/dnf/0005-libdnf-fix-arm-arch-mapping-issues-for-qemuarmv5.patch b/meta/recipes-devtools/dnf/dnf/0005-libdnf-fix-arm-arch-mapping-issues-for-qemuarmv5.patch new file mode 100644 index 0000000000..4fed5ff2a1 --- /dev/null +++ b/meta/recipes-devtools/dnf/dnf/0005-libdnf-fix-arm-arch-mapping-issues-for-qemuarmv5.patch @@ -0,0 +1,59 @@ +From 8580e30c9692548d7e3da88e03c08d985402fae2 Mon Sep 17 00:00:00 2001 +From: Adam Duskett +Date: Thu, 15 Oct 2026 11:58:49 +0200 +Subject: [PATCH] libdnf: fix arm arch mapping issues for qemuarmv5 + +We change the way rpm architectures work, we make the machine name the default +machine specific package architecture. + +This arm mapping code can work or in the case of qemuarmv5, it doesn't as it +creates armv5hl which doesn't exist and causes errrors. We can simply remove +it, we don't need it. + +Upstream-Status: Inappropriate [oe-core specific] +Signed-off-by: Richard Purdie + +Rebased for 5.4.6.0 +Signed-off-by: Adam Duskett +--- + libdnf5/utils/system.cpp | 24 ------------------------ + 1 file changed, 24 deletions(-) + +diff --git a/libdnf5/utils/system.cpp b/libdnf5/utils/system.cpp +index ecdc57e..35d8801 100644 +--- a/libdnf5/utils/system.cpp ++++ b/libdnf5/utils/system.cpp +@@ -52,30 +52,6 @@ std::string detect_arch() { + throw RuntimeError(M_("Failed to execute uname()")); + } + +- if (!strncmp(un.machine, "armv", 4)) { +- /* un.machine is armvXE, where X is version number and E is +- * endianness (b or l); we need to add modifiers such as +- * h (hardfloat), n (neon). Neon is a requirement of armv8 so +- * as far as rpm is concerned armv8l is the equivalent of armv7hnl +- * (or 7hnb) so we don't explicitly add 'n' for 8+ as it's expected. */ +- char endian = un.machine[strlen(un.machine) - 1]; +- char * modifier = un.machine + 5; +- while (isdigit(*modifier)) /* keep armv7, armv8, armv9, armv10, armv100, ... */ +- modifier++; +- if (getauxval(AT_HWCAP) & HWCAP_ARM_VFP) +- *modifier++ = 'h'; +- if ((atoi(un.machine + 4) == 7) && (getauxval(AT_HWCAP) & HWCAP_ARM_NEON)) +- *modifier++ = 'n'; +- *modifier++ = endian; +- *modifier = 0; +- } +-#ifdef __MIPSEL__ +- // support for little endian MIPS +- if (!strcmp(un.machine, "mips")) +- strcpy(un.machine, "mipsel"); +- else if (!strcmp(un.machine, "mips64")) +- strcpy(un.machine, "mips64el"); +-#endif + return un.machine; + } + +-- +2.56.0 + diff --git a/meta/recipes-devtools/dnf/dnf/0006-rename-stdout-stderr-members.patch b/meta/recipes-devtools/dnf/dnf/0006-rename-stdout-stderr-members.patch new file mode 100644 index 0000000000..68d1f33df3 --- /dev/null +++ b/meta/recipes-devtools/dnf/dnf/0006-rename-stdout-stderr-members.patch @@ -0,0 +1,205 @@ +From 42a4a73832913ce018cdc0147805ae324abb47a0 Mon Sep 17 00:00:00 2001 +From: Adam Duskett +Date: Tue, 3 Nov 2026 12:33:12 +0100 +Subject: [PATCH] libdnf5: subprocess: rename stdout/stderr members of + CompletedProcess + +The C standard allows stdin, stdout and stderr to be defined as macros, which MUSL does: +``` + #define stdout (stdout) + #define stderr (stderr) +``` + +This breaks the build when cross-compiling on systems that use MUSL instead +of glibc with the following error: + libdnf5/utils/bootc.cpp:44:74: error: expected unqualified-id before '(' token + +Rename the members to stdout_data and stderr_data to fix building against +musl. + +Upstream-Status: Submitted [https://github.com/rpm-software-management/dnf5/pull/3024] +Signed-off-by: Adam Duskett +--- + libdnf5/utils/bootc.cpp | 11 +++--- + libdnf5/utils/subprocess.cpp | 4 +-- + libdnf5/utils/subprocess.hpp | 4 +-- + test/libdnf5/utils/test_subprocess.cpp | 50 +++++++++++++------------- + 4 files changed, 36 insertions(+), 33 deletions(-) + +diff --git a/libdnf5/utils/bootc.cpp b/libdnf5/utils/bootc.cpp +index 0027e02887..305114f30b 100644 +--- a/libdnf5/utils/bootc.cpp ++++ b/libdnf5/utils/bootc.cpp +@@ -41,7 +41,8 @@ std::unique_ptr get_bootc_status() { + // Check whether command failed (non-zero exit code) + if (result.returncode != 0) { + // Command ran but failed; show stderr to user +- std::string stderr_content(reinterpret_cast(result.stderr.data()), result.stderr.size()); ++ std::string stderr_content( ++ reinterpret_cast(result.stderr_data.data()), result.stderr_data.size()); + if (!stderr_content.empty()) { + throw libdnf5::RuntimeError(M_("Error checking bootc status: {}"), stderr_content); + } else { +@@ -50,7 +51,7 @@ std::unique_ptr get_bootc_status() { + } + } + +- std::string stdout_content(reinterpret_cast(result.stdout.data()), result.stdout.size()); ++ std::string stdout_content(reinterpret_cast(result.stdout_data.data()), result.stdout_data.size()); + std::unique_ptr root( + json_tokener_parse(stdout_content.c_str()), json_object_put); + +@@ -120,7 +121,8 @@ void make_usr_writable() { + // Set up transient overlay + const auto & result = subprocess::run("bootc", {"bootc", "usr-overlay", "--read-only"}); + if (result.returncode != 0) { +- std::string stderr_content(reinterpret_cast(result.stderr.data()), result.stderr.size()); ++ std::string stderr_content( ++ reinterpret_cast(result.stderr_data.data()), result.stderr_data.size()); + if (!stderr_content.empty()) { + throw libdnf5::RuntimeError(M_("Error running `bootc usr-overlay --read-only`: {}"), stderr_content); + } else { +@@ -139,7 +141,8 @@ void make_usr_writable() { + const auto & result = subprocess::run("mount", {"mount", "--options-source=disable", "-o", "remount,rw", "/usr"}); + + if (result.returncode != 0) { +- std::string stderr_content(reinterpret_cast(result.stderr.data()), result.stderr.size()); ++ std::string stderr_content( ++ reinterpret_cast(result.stderr_data.data()), result.stderr_data.size()); + throw libdnf5::RuntimeError(M_("Failed to remount /usr as read-write: {}"), stderr_content); + } + } +diff --git a/libdnf5/utils/subprocess.cpp b/libdnf5/utils/subprocess.cpp +index 33299e0fec..3175d804f2 100644 +--- a/libdnf5/utils/subprocess.cpp ++++ b/libdnf5/utils/subprocess.cpp +@@ -259,8 +259,8 @@ CompletedProcess run(const std::string & command, const std::vector + + return CompletedProcess{ + .returncode = returncode, +- .stdout = stdout_bytes, +- .stderr = stderr_bytes, ++ .stdout_data = stdout_bytes, ++ .stderr_data = stderr_bytes, + }; + } + +diff --git a/libdnf5/utils/subprocess.hpp b/libdnf5/utils/subprocess.hpp +index 7a5066ea30..73f3934bc4 100644 +--- a/libdnf5/utils/subprocess.hpp ++++ b/libdnf5/utils/subprocess.hpp +@@ -11,8 +11,8 @@ namespace libdnf5::utils::subprocess { + + struct CompletedProcess { + int returncode; +- std::vector stdout; +- std::vector stderr; ++ std::vector stdout_data; ++ std::vector stderr_data; + }; + + /// @brief Run a command in a child process and wait for it to complete. +diff --git a/test/libdnf5/utils/test_subprocess.cpp b/test/libdnf5/utils/test_subprocess.cpp +index 20fdb7c52c..55084a2193 100644 +--- a/test/libdnf5/utils/test_subprocess.cpp ++++ b/test/libdnf5/utils/test_subprocess.cpp +@@ -34,8 +34,8 @@ void UtilsSubprocessTest::test_stdout_capture() { + libdnf5::utils::subprocess::run("/usr/bin/env", {"/usr/bin/env", "sh", "-c", "echo 'Hello, World!'"}); + + CPPUNIT_ASSERT_EQUAL(0, result.returncode); +- CPPUNIT_ASSERT_EQUAL(std::string("Hello, World!\n"), bytes_to_string(result.stdout)); +- CPPUNIT_ASSERT_EQUAL(std::string(""), bytes_to_string(result.stderr)); ++ CPPUNIT_ASSERT_EQUAL(std::string("Hello, World!\n"), bytes_to_string(result.stdout_data)); ++ CPPUNIT_ASSERT_EQUAL(std::string(""), bytes_to_string(result.stderr_data)); + } + + +@@ -45,8 +45,8 @@ void UtilsSubprocessTest::test_stderr_capture() { + libdnf5::utils::subprocess::run("/usr/bin/env", {"/usr/bin/env", "sh", "-c", "echo 'Error message' >&2"}); + + CPPUNIT_ASSERT_EQUAL(0, result.returncode); +- CPPUNIT_ASSERT_EQUAL(std::string(""), bytes_to_string(result.stdout)); +- CPPUNIT_ASSERT_EQUAL(std::string("Error message\n"), bytes_to_string(result.stderr)); ++ CPPUNIT_ASSERT_EQUAL(std::string(""), bytes_to_string(result.stdout_data)); ++ CPPUNIT_ASSERT_EQUAL(std::string("Error message\n"), bytes_to_string(result.stderr_data)); + } + + +@@ -56,8 +56,8 @@ void UtilsSubprocessTest::test_stdout_and_stderr_capture() { + "/usr/bin/env", {"/usr/bin/env", "sh", "-c", "echo 'stdout line'; echo 'stderr line' >&2"}); + + CPPUNIT_ASSERT_EQUAL(0, result.returncode); +- CPPUNIT_ASSERT_EQUAL(std::string("stdout line\n"), bytes_to_string(result.stdout)); +- CPPUNIT_ASSERT_EQUAL(std::string("stderr line\n"), bytes_to_string(result.stderr)); ++ CPPUNIT_ASSERT_EQUAL(std::string("stdout line\n"), bytes_to_string(result.stdout_data)); ++ CPPUNIT_ASSERT_EQUAL(std::string("stderr line\n"), bytes_to_string(result.stderr_data)); + } + + +@@ -66,8 +66,8 @@ void UtilsSubprocessTest::test_exit_code_success() { + const auto result = libdnf5::utils::subprocess::run("/usr/bin/env", {"/usr/bin/env", "sh", "-c", "exit 0"}); + + CPPUNIT_ASSERT_EQUAL(0, result.returncode); +- CPPUNIT_ASSERT_EQUAL(std::string(""), bytes_to_string(result.stdout)); +- CPPUNIT_ASSERT_EQUAL(std::string(""), bytes_to_string(result.stderr)); ++ CPPUNIT_ASSERT_EQUAL(std::string(""), bytes_to_string(result.stdout_data)); ++ CPPUNIT_ASSERT_EQUAL(std::string(""), bytes_to_string(result.stderr_data)); + } + + +@@ -97,17 +97,17 @@ void UtilsSubprocessTest::test_binary_data() { + CPPUNIT_ASSERT_EQUAL(0, result.returncode); + + // Verify stdout contains the expected binary data +- CPPUNIT_ASSERT_EQUAL(static_cast(5), result.stdout.size()); +- CPPUNIT_ASSERT_EQUAL(static_cast(0x00), result.stdout[0]); +- CPPUNIT_ASSERT_EQUAL(static_cast(0x01), result.stdout[1]); +- CPPUNIT_ASSERT_EQUAL(static_cast(0x02), result.stdout[2]); +- CPPUNIT_ASSERT_EQUAL(static_cast(0xff), result.stdout[3]); +- CPPUNIT_ASSERT_EQUAL(static_cast(0xfe), result.stdout[4]); ++ CPPUNIT_ASSERT_EQUAL(static_cast(5), result.stdout_data.size()); ++ CPPUNIT_ASSERT_EQUAL(static_cast(0x00), result.stdout_data[0]); ++ CPPUNIT_ASSERT_EQUAL(static_cast(0x01), result.stdout_data[1]); ++ CPPUNIT_ASSERT_EQUAL(static_cast(0x02), result.stdout_data[2]); ++ CPPUNIT_ASSERT_EQUAL(static_cast(0xff), result.stdout_data[3]); ++ CPPUNIT_ASSERT_EQUAL(static_cast(0xfe), result.stdout_data[4]); + + // Verify stderr contains the expected binary data +- CPPUNIT_ASSERT_EQUAL(static_cast(2), result.stderr.size()); +- CPPUNIT_ASSERT_EQUAL(static_cast(0x03), result.stderr[0]); +- CPPUNIT_ASSERT_EQUAL(static_cast(0x04), result.stderr[1]); ++ CPPUNIT_ASSERT_EQUAL(static_cast(2), result.stderr_data.size()); ++ CPPUNIT_ASSERT_EQUAL(static_cast(0x03), result.stderr_data[0]); ++ CPPUNIT_ASSERT_EQUAL(static_cast(0x04), result.stderr_data[1]); + } + + +@@ -131,20 +131,20 @@ done + const auto result = libdnf5::utils::subprocess::run("/usr/bin/env", {"/usr/bin/env", "sh", "-c", script}); + + // The expected size is: 1000 × 100 bytes = 100,000 bytes per stream +- CPPUNIT_ASSERT_EQUAL(static_cast(100000), result.stdout.size()); +- CPPUNIT_ASSERT_EQUAL(static_cast(100000), result.stderr.size()); ++ CPPUNIT_ASSERT_EQUAL(static_cast(100000), result.stdout_data.size()); ++ CPPUNIT_ASSERT_EQUAL(static_cast(100000), result.stderr_data.size()); + + // Verify the command succeeded (didn't deadlock or error) + CPPUNIT_ASSERT_EQUAL(0, result.returncode); + + // Verify the data is correct (should be all a's on stdout, b's on stderr) + // Check first few bytes (only if we have data) +- if (result.stdout.size() > 0) { +- CPPUNIT_ASSERT_EQUAL(static_cast('a'), result.stdout[0]); +- CPPUNIT_ASSERT_EQUAL(static_cast('a'), result.stdout[100]); ++ if (result.stdout_data.size() > 0) { ++ CPPUNIT_ASSERT_EQUAL(static_cast('a'), result.stdout_data[0]); ++ CPPUNIT_ASSERT_EQUAL(static_cast('a'), result.stdout_data[100]); + } +- if (result.stderr.size() > 0) { +- CPPUNIT_ASSERT_EQUAL(static_cast('b'), result.stderr[0]); +- CPPUNIT_ASSERT_EQUAL(static_cast('b'), result.stderr[100]); ++ if (result.stderr_data.size() > 0) { ++ CPPUNIT_ASSERT_EQUAL(static_cast('b'), result.stderr_data[0]); ++ CPPUNIT_ASSERT_EQUAL(static_cast('b'), result.stderr_data[100]); + } + } diff --git a/meta/recipes-devtools/dnf/dnf/0029-Do-not-set-PYTHON_INSTALL_DIR-by-running-python.patch b/meta/recipes-devtools/dnf/dnf/0029-Do-not-set-PYTHON_INSTALL_DIR-by-running-python.patch deleted file mode 100644 index 64ea7874d3..0000000000 --- a/meta/recipes-devtools/dnf/dnf/0029-Do-not-set-PYTHON_INSTALL_DIR-by-running-python.patch +++ /dev/null @@ -1,24 +0,0 @@ -From d5b154ea69afdcd862299a0b7f255f6ece3686c6 Mon Sep 17 00:00:00 2001 -From: Alexander Kanavin -Date: Fri, 30 Dec 2016 18:29:07 +0200 -Subject: [PATCH] Do not set PYTHON_INSTALL_DIR by running python - -Upstream-Status: Inappropriate [oe-core specific] -Signed-off-by: Alexander Kanavin ---- - CMakeLists.txt | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/CMakeLists.txt b/CMakeLists.txt -index 9e2e9e9e..2056089d 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -19,7 +19,7 @@ ELSE () - MESSAGE (FATAL_ERROR "Invalid PYTHON_DESIRED value: " ${PYTHON_DESIRED}) - ENDIF() - --EXECUTE_PROCESS(COMMAND ${PYTHON_EXECUTABLE} -c "from sys import stdout; from sysconfig import get_path; stdout.write(get_path('purelib'))" OUTPUT_VARIABLE PYTHON_INSTALL_DIR) -+#EXECUTE_PROCESS(COMMAND ${PYTHON_EXECUTABLE} -c "from sys import stdout; from sysconfig import get_path; stdout.write(get_path('purelib'))" OUTPUT_VARIABLE PYTHON_INSTALL_DIR) - MESSAGE(STATUS "Python install dir is ${PYTHON_INSTALL_DIR}") - - ADD_SUBDIRECTORY (dnf) diff --git a/meta/recipes-devtools/dnf/dnf/0030-Run-python-scripts-using-env.patch b/meta/recipes-devtools/dnf/dnf/0030-Run-python-scripts-using-env.patch deleted file mode 100644 index eb46113f3a..0000000000 --- a/meta/recipes-devtools/dnf/dnf/0030-Run-python-scripts-using-env.patch +++ /dev/null @@ -1,34 +0,0 @@ -From d3556767b84f3687743fdad0a88af0739d736ea9 Mon Sep 17 00:00:00 2001 -From: Alexander Kanavin -Date: Fri, 30 Dec 2016 18:29:37 +0200 -Subject: [PATCH] Run python scripts using env - -Otherwise the build tools hardcode the python path into them. - -Upstream-Status: Inappropriate [oe-core specific] -Signed-off-by: Alexander Kanavin ---- - bin/dnf-automatic.in | 2 +- - bin/dnf.in | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -diff --git a/bin/dnf-automatic.in b/bin/dnf-automatic.in -index 17e35a05..28827e38 100755 ---- a/bin/dnf-automatic.in -+++ b/bin/dnf-automatic.in -@@ -1,4 +1,4 @@ --#!@PYTHON_EXECUTABLE@ -+#!/usr/bin/env python3 - # dnf-automatic executable. - # - # Copyright (C) 2014-2016 Red Hat, Inc. -diff --git a/bin/dnf.in b/bin/dnf.in -index 55ceb3f2..e38973c7 100755 ---- a/bin/dnf.in -+++ b/bin/dnf.in -@@ -1,4 +1,4 @@ --#!@PYTHON_EXECUTABLE@ -+#!/usr/bin/env python3 - # The dnf executable script. - # - # Copyright (C) 2012-2016 Red Hat, Inc. diff --git a/meta/recipes-devtools/dnf/dnf_4.24.0.bb b/meta/recipes-devtools/dnf/dnf_4.24.0.bb deleted file mode 100644 index 31bbb4032b..0000000000 --- a/meta/recipes-devtools/dnf/dnf_4.24.0.bb +++ /dev/null @@ -1,96 +0,0 @@ -SUMMARY = "Package manager forked from Yum, using libsolv as a dependency resolver" -DESCRIPTION = "Software package manager that installs, updates, and removes \ -packages on RPM-based Linux distributions. It automatically computes \ -dependencies and determines the actions required to install packages." -HOMEPAGE = "https://github.com/rpm-software-management/dnf" -LICENSE = "GPL-2.0-only" -LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263 \ - file://PACKAGE-LICENSING;md5=4a0548e303dbc77f067335b4d688e745 \ - " - -SRC_URI = "git://github.com/rpm-software-management/dnf.git;branch=master;protocol=https;tag=${PV} \ - file://0001-Corretly-install-tmpfiles.d-configuration.patch \ - file://0001-Do-not-hardcode-etc-and-systemd-unit-directories.patch \ - file://0005-Do-not-prepend-installroot-to-logdir.patch \ - file://0029-Do-not-set-PYTHON_INSTALL_DIR-by-running-python.patch \ - file://0030-Run-python-scripts-using-env.patch \ - file://0001-set-python-path-for-completion_helper.patch \ - file://0001-lock.py-fix-Exception-handling.patch \ - " - -SRC_URI:append:class-native = " file://0001-dnf-write-the-log-lock-to-root.patch" - -SRCREV = "e47634fbe3565d0580e89ec21adb7c1b308642ce" -UPSTREAM_CHECK_GITTAGREGEX = "(?P\d+(\.\d+)+)" - -inherit cmake gettext bash-completion setuptools3-base systemd - -DEPENDS += "libdnf librepo libcomps" - -# manpages generation requires http://www.sphinx-doc.org/ -EXTRA_OECMAKE = " -DWITH_MAN=0 -DPYTHON_INSTALL_DIR=${PYTHON_SITEPACKAGES_DIR} -DPYTHON_DESIRED=3" - -BBCLASSEXTEND = "native nativesdk" - -RDEPENDS:${PN} += " \ - python3-core \ - python3-codecs \ - python3-ctypes \ - python3-netclient \ - python3-email \ - python3-threading \ - python3-logging \ - python3-fcntl \ - librepo \ - python3-shell \ - libcomps \ - libdnf \ - python3-sqlite3 \ - python3-compression \ - python3-rpm \ - python3-json \ - python3-curses \ - python3-misc \ - " - -RDEPENDS:${PN}:class-native = "" - -RRECOMMENDS:${PN}:class-target += "gnupg" - -# Create a symlink called 'dnf' as 'make install' does not do it, but -# .spec file in dnf source tree does (and then Fedora and dnf documentation -# says that dnf binary is plain 'dnf'). -do_install:append() { - ln -rs ${D}/${bindir}/dnf-3 ${D}/${bindir}/dnf - ln -rs ${D}/${bindir}/dnf-automatic-3 ${D}/${bindir}/dnf-automatic -} - -# Direct dnf-native to read rpm configuration from our sysroot, not the one it was compiled in -do_install:append:class-native() { - create_wrapper ${D}/${bindir}/dnf \ - SEQUOIA_CRYPTO_POLICY=${STAGING_DATADIR_NATIVE}/crypto-policies/back-ends/rpm-sequoia.config \ - RPM_CONFIGDIR=${STAGING_LIBDIR_NATIVE}/rpm \ - RPM_NO_CHROOT_FOR_SCRIPTS=1 -} - -do_install:append:class-nativesdk() { - create_wrapper ${D}/${bindir}/dnf \ - RPM_CONFIGDIR=${SDKPATHNATIVE}${libdir_nativesdk}/rpm \ - RPM_NO_CHROOT_FOR_SCRIPTS=1 -} - -SYSTEMD_SERVICE:${PN} = "dnf-makecache.service dnf-makecache.timer \ - dnf-automatic.service dnf-automatic.timer \ - dnf-automatic-download.service dnf-automatic-download.timer \ - dnf-automatic-install.service dnf-automatic-install.timer \ - dnf-automatic-notifyonly.service dnf-automatic-notifyonly.timer \ -" -SYSTEMD_AUTO_ENABLE ?= "disable" - -SKIP_RECIPE[dnf] ?= "${@bb.utils.contains('PACKAGE_CLASSES', 'package_rpm', '', 'does not build without package_rpm in PACKAGE_CLASSES due disabled rpm support in libsolv', d)}" - -# Packages for testing purposes -PACKAGES += "${PN}-test-main ${PN}-test-dep" -ALLOW_EMPTY:${PN}-test-main = "1" -ALLOW_EMPTY:${PN}-test-dep = "1" -RRECOMMENDS:${PN}-test-main = "${PN}-test-dep" diff --git a/meta/recipes-devtools/dnf/dnf_5.4.6.0.bb b/meta/recipes-devtools/dnf/dnf_5.4.6.0.bb new file mode 100644 index 0000000000..46ac6c209e --- /dev/null +++ b/meta/recipes-devtools/dnf/dnf_5.4.6.0.bb @@ -0,0 +1,181 @@ +SUMMARY = "DNF package manager rewritten in C++, using libsolv as a dependency resolver" +DESCRIPTION = "\ + DNF5 is a command-line package manager that automates the process of \ + installing, upgrading, configuring, and removing computer programs in a \ + consistent manner. It supports RPM packages, modulemd modules, and comps \ + groups and environments. \ +" +HOMEPAGE = "https://github.com/rpm-software-management/dnf5" +BUGTRACKER = "https://github.com/rpm-software-management/dnf5/issues" +CVE_PRODUCT = "rpm:dnf5 rpm-software-management:dnf5" +SECTION = "base" + +LICENSE = "LGPL-2.1-or-later AND GPL-2.0-or-later" +LIC_FILES_CHKSUM = "\ + file://COPYING.md;md5=9733192df318d0f806fd668b92ba0ba6 \ + file://gpl-2.0.txt;md5=570a9b3749dd0463a1778803b12a6dce \ + file://lgpl-2.1.txt;md5=4bf661c1e3793e55c8d1051bc5e0ae21 \ +" + +DEPENDS = "\ + fmt \ + glib-2.0 \ + json-c \ + libmodulemd \ + librepo \ + libsolv \ + libtoml11 \ + libxml2 \ + sqlite3 \ + util-linux \ +" + +SRC_URI = "\ + git://github.com/rpm-software-management/dnf5.git;protocol=https;branch=main;tag=${PV} \ + file://0002-cmake-set-CMP0190-to-OLD.patch \ + file://0003-Do-not-hardcode-system_cachedir.patch \ + file://0004-add-support-for-gcc-12-and-below.patch \ + file://0005-libdnf-fix-arm-arch-mapping-issues-for-qemuarmv5.patch \ + file://0006-rename-stdout-stderr-members.patch \ +" +SRC_URI:append:class-native = " file://0001-Do-not-hardcode-the-systemd-unit-directory.patch" +SRCREV = "1b2de4bdc2f25a6de2884fb2cf81f80a8ce2a567" + +inherit bash-completion cmake gettext pkgconfig siteinfo systemd +inherit_defer ${@bb.utils.contains('PACKAGECONFIG', 'python3', 'python3targetconfig', '', d)} + +PACKAGECONFIG[acl] = "-DWITH_ACL=ON,-DWITH_ACL=OFF,acl" +PACKAGECONFIG[dnfdaemon-client] = "-DWITH_DNF5DAEMON_CLIENT=ON,-DWITH_DNF5DAEMON_CLIENT=OFF,sdbus-c++" +PACKAGECONFIG[dnfdaemon-server] = "-DWITH_DNF5DAEMON_SERVER=ON,-DWITH_DNF5DAEMON_SERVER=OFF,sdbus-c++" +PACKAGECONFIG[plugins] = "-DWITH_DNF5_PLUGINS=ON,-DWITH_DNF5_PLUGINS=OFF,curl sdbus-c++ zlib" +PACKAGECONFIG[plugin-actions] = "-DWITH_PLUGIN_ACTIONS=ON,-DWITH_PLUGIN_ACTIONS=OFF" +PACKAGECONFIG[plugin-appstream] = "-DWITH_PLUGIN_APPSTREAM=ON,-DWITH_PLUGIN_APPSTREAM=OFF,appstream" +PACKAGECONFIG[plugin-expired-pgp-keys] = "-DWITH_PLUGIN_EXPIRED_PGP_KEYS=ON,-DWITH_PLUGIN_EXPIRED_PGP_KEYS=OFF,gnupg" +PACKAGECONFIG[plugin-local] = "-DWITH_PLUGIN_LOCAL=ON,-DWITH_PLUGIN_LOCAL=OFF" + +# sdbus-c++ and journalctl integration. +PACKAGECONFIG[systemd] = "-DWITH_SYSTEMD=ON -DWITH_PLUGIN_SYSTEMD_INHIBIT=ON,-DWITH_SYSTEMD=OFF -DWITH_PLUGIN_SYSTEMD_INHIBIT=OFF,sdbus-c++" + +# build options - bindings +PACKAGECONFIG[python3] = "-DWITH_PYTHON3=ON,-DWITH_PYTHON3=OFF,python3 swig-native" + +# No sdbus-c++-native package. +PACKAGECONFIG:remove:class-native = "\ + dnfdaemon-client \ + dnfdaemon-server \ + plugins \ + plugin-manifest \ + systemd \ +" + +PACKAGE_BEFORE_PN += "\ + ${PN}-dnfdaemon-server \ + ${PN}-plugins \ + ${PN}-python3 \ + ${PN}-systemd \ +" + +# manpages generation requires http://www.sphinx-doc.org/ +EXTRA_OECMAKE:append = " \ + -DENABLE_SOLV_FOCUSNEW=ON \ + -DWITH_DNF5_OBSOLETES_DNF=OFF \ + -DWITH_DNF5=ON \ + -DWITH_GO=OFF \ + -DWITH_HTML=OFF \ + -DWITH_LIBDNF5_CLI=ON \ + -DWITH_MAN=OFF \ + -DWITH_PERL5=OFF \ + -DWITH_PLUGIN_RHSM=OFF \ + -DWITH_RUBY=OFF \ + -DWITH_TESTS=OFF \ + -DWITH_PLUGIN_MANIFEST=OFF \ +" + +# No sdbus-c++-native package exists so remove all options that depend on it. +EXTRA_OECMAKE:append:class-native = " \ + -DWITH_DNF5DAEMON_CLIENT=OFF \ + -DWITH_DNF5DAEMON_SERVER=OFF \ + -DWITH_DNF5_PLUGINS=OFF \ + -DWITH_PLUGIN_MANIFEST=OFF \ + -DWITH_SYSTEMD=OFF \ +" + +# Create a symlink called 'dnf' as 'make install' does not do it, but +# .spec file in dnf source tree does (and then Fedora and dnf documentation +# says that dnf binary is plain 'dnf'). +do_install:append() { + ln -rs ${D}/${bindir}/dnf5 ${D}/${bindir}/dnf + install -d ${D}${sysconfdir}/dnf + + # Breaks dnf because the builddep plugin is provided in the + # dnf-plugins-core package which is not available in oe-core. + rm -f ${D}${datadir}/dnf5/aliases.d/compatibility-plugins.conf +} + +# Direct dnf-native to read rpm configuration from our sysroot, not the one it was compiled in +do_install:append:class-native() { + create_wrapper ${D}/${bindir}/dnf \ + SEQUOIA_CRYPTO_POLICY=${STAGING_DATADIR_NATIVE}/crypto-policies/back-ends/rpm-sequoia.config \ + RPM_CONFIGDIR=${STAGING_LIBDIR_NATIVE}/rpm \ + RPM_NO_CHROOT_FOR_SCRIPTS=1 +} + +do_install:append:class-nativesdk() { + create_wrapper ${D}/${bindir}/dnf \ + RPM_CONFIGDIR=${SDKPATHNATIVE}${libdir_nativesdk}/rpm \ + RPM_NO_CHROOT_FOR_SCRIPTS=1 +} + +# Packages for testing purposes +PACKAGES += "${PN}-test-main ${PN}-test-dep" + +FILES:${PN} += "\ + ${bindir}/dnf* \ + ${datadir}/dbus-1/system-services/org.rpm.dnf.v0.service \ + ${datadir}/dnf5 \ + ${datadir}/polkit-1/actions/org.rpm.dnf* \ + ${datadir}/polkit-1/rules.d/org.rpm.dnf* \ + ${datadir}/zsh/site-functions/_dnf5 \ + ${libdir}/dnf5 \ + ${libdir}/libdnf5* \ + ${sysconfdir}/dnf \ +" + +FILES:${PN}-bash-completion += "\ + ${datadir}/bash-completion/completions/dnf5 \ +" + +FILES:${PN}-dnfdaemon-server += "\ + ${systemd_system_unitdir}/dnf5daemon-server.service \ + ${datadir}/dbus-1/interfaces/org.rpm.dnf* \ + ${datadir}/dbus-1/system.d/org.rpm.dnf* \ +" + +FILES:${PN}-plugins += "\ + ${systemd_system_unitdir}/dnf-automatic.service \ + ${systemd_system_unitdir}/dnf-automatic.timer \ + ${systemd_system_unitdir}/dnf5-automatic.service \ + ${systemd_system_unitdir}/dnf5-automatic.timer \ +" + +FILES:${PN}-python3 += "\ + ${libdir}/${PYTHON_DIR}/site-packages/libdnf* \ +" + +FILES:${PN}-systemd += "\ + ${systemd_system_unitdir}/dnf5-makecache.service \ + ${systemd_system_unitdir}/dnf5-makecache.timer \ + ${systemd_system_unitdir}/dnf5-offline-transaction-cleanup.service \ + ${systemd_system_unitdir}/dnf5-offline-transaction.service \ +" + +SYSTEMD_AUTO_ENABLE ?= "disable" + +RRECOMMENDS:${PN}:append:class-target = " bash-completion gnupg" +RRECOMMENDS:${PN}-test-main = "${PN}-test-dep" +ALLOW_EMPTY:${PN}-test-main = "1" +ALLOW_EMPTY:${PN}-test-dep = "1" + +SKIP_RECIPE[dnf] ?= "${@bb.utils.contains('PACKAGE_CLASSES', 'package_rpm', '', 'does not build without package_rpm in PACKAGE_CLASSES due to disabled rpm support in libsolv', d)}" + +BBCLASSEXTEND = "native nativesdk" From patchwork Wed Nov 4 13:20:56 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adam Duskett X-Patchwork-Id: 102912 Received: from mail-ej1-f53.google.com (mail-ej1-f53.google.com [209.85.218.53]) by mx.groups.io with SMTP id smtpd.msgproc01-g2.8911.1793798470168233777 for ; Wed, 04 Nov 2026 05:21:10 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@amarulasolutions.com header.s=google header.b=SAGKuTE0; spf=pass (domain: amarulasolutions.com, ip: 209.85.218.53, mailfrom: adam.duskett@amarulasolutions.com) Received: by mail-ej1-f53.google.com with SMTP id a640c23a62f3a-c33700b6435so14616866b.1 for ; Wed, 04 Nov 2026 05:21:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amarulasolutions.com; s=google; t=1793798468; x=1794403268; darn=lists.openembedded.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=hYHoby9liGXzMBQ5LF7E5pXsE7/XfhBAGPz2a0RhFcQ=; b=SAGKuTE0PJy6FoAvjCbbEXPlqpRPELTWuEVkZZqMJ9wCRp0arVuHXhdhk01FWDmg4r V7OJNKfb+N4Gn/XvlUspFmJvSSlWFNmS9zvynFzM6bES1TnuG7iEuN9th900n2TolaZo ADxVoPP/nsdb7v80cwGqLR02ADv60XI8tLho8= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1793798468; x=1794403268; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=hYHoby9liGXzMBQ5LF7E5pXsE7/XfhBAGPz2a0RhFcQ=; b=KCTrjJtWjhWtuWu9z7z9f7eFgyuDL7KMbmIZiUPg5ooEBJMV7MnEYNHuw4gSmDqpGK 8o5tF4ncdkBFM9kVmSxrBKcBQcsVwTxRmHsJW8neEasNlb35Xm7t4X9JfTGkv6aecDEk 3AEhe1py0HvMPgrAIux9F6fUYJe/ySZ3q3RC5gQrVLLEN9uoyxymfO+a5c1ZPIseSYli cWvXT0DaZ8bT7KjekA393RSBcUlClOZCzrX0vuwWAZkYNdeyt8pJC/9KZT+cqvC2bVmB 5RVmqeAWHKdqEDyihwMnDxoMDwcn/nUBbwSBFvodDyoRNIMo2mjL38q4uxuRZi89Gf4x kbfQ== X-Gm-Message-State: APuU4Z8Ra9mH5ZE0MGnK99YKXvBrPMKwOTqq878kKnKQTB+JZ2UcAjmL xe9pLT6Ic+VPHqVlEJvZGdErMpwWms36GneV1K5Oa7mUVjV4SYVxmUbCZ7Hw8bCXCcbaZ74QYwi jrrYBJJw= X-Gm-Gg: AYBFou2hyvOW2ZTCn8Sbmhfdz/uCHxnyb5EUSFSZa8CU8SEKy7LzgsSmoOwZ9rwqh+O nyA9AsOULAMLaf6tyJ9FWeUU+KPRK/2KBU3AtmKz/wKovB3GIkd9Ty4f0+ANoZ1W4WZAQDat6o0 0jWHzOsfw+mRPe4r00AhE1LkF9kupV7nZ0txez76/pUkGfpPa0mnEs8oUZlVHf/1LYttiWPr3KD fFmB8FfL3Oc6QcJEXknDrBVlTjx3HBTZkF8Cv6+w4VOyzqU0SS5Pu1KyoYPN7iIBGkvI15gAi+/ Vzze0E4LwxQUN2XMB6K5kbemORZCqDZbbeUzmNCnQ72xAqnAAx0iP0kswdcWNE4O1ReXSCzBGha o9UPQW3JFsIfpbDbDkfNj/yYDOZFom7KDTjky4uwNTeucjDoMm0lJkuJ5nNWBGSZXZdJbPXa5rS BKOeBWNLIMrBslry4fD1/emxVwKmHPWhjwjP8NUdhIYlUdr9PN79SWzaneNJ4gRthWDHkRzdg8D IIsKJpvxGPxguEwcyGtWJ9PrD7EC/ZEki5n8StcEQXL+VPSZr0eUdl4XLuzgatPfCe+jqsGhY80 D89HPp0EjZshrXyTPYp4j8NpnGyicB7OhpMS6pAapZRhHBu+sy8MPVH7eeDx7bxdYG/x+cYWc+F 6oQwMBb/suRKaZZFQJCECePvss9kysDMozkrvUItlEhvDr3dpX/Hxv8lAFEfBzPq5Ar9Ctrqx81 Sv2Ypv1fPjh55QJ2QOnRAGnSXM88m3WKUp X-Received: by 2002:a17:907:ba01:b0:c25:3ec4:9e43 with SMTP id a640c23a62f3a-c4ca74025e9mr1787856466b.0.1793798468184; Wed, 04 Nov 2026 05:21:08 -0800 (PST) Return-Path: Received: from adam-linux.tail032493.ts.net (2001-1c00-8181-e800-030c-182b-b2a8-e89d.cable.dynamic.v6.ziggo.nl. [2001:1c00:8181:e800:30c:182b:b2a8:e89d]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-c4d0e140f93sm70343466b.6.2026.11.04.05.21.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 04 Nov 2026 05:21:06 -0800 (PST) From: Adam Duskett To: openembedded-core@lists.openembedded.org Cc: Adam Duskett Subject: [PATCH v12 4/4] libdnf: remove recipe Date: Wed, 4 Nov 2026 14:20:56 +0100 Message-ID: <20261104132057.607953-4-adam.duskett@amarulasolutions.com> X-Mailer: git-send-email 2.56.0 In-Reply-To: <20261104132057.607953-1-adam.duskett@amarulasolutions.com> References: <20261104132057.607953-1-adam.duskett@amarulasolutions.com> MIME-Version: 1.0 List-Id: X-Webhook-Received: from 45-33-107-173.ip.linodeusercontent.com [45.33.107.173] by lin-tor-korg-lkml-alma10-1 with HTTPS for ; Wed, 04 Nov 2026 13:21:13 -0000 X-Groupsio-URL: https://lists.openembedded.org/g/openembedded-core/message/249379 libdnf is now included in the dnf5 source tree. Signed-off-by: Adam Duskett --- meta/conf/distro/include/maintainers.inc | 1 - ...or-both-libsolv-and-libsolvext-libdn.patch | 26 ---------- ...FNM_EXTMATCH-if-not-already-like-und.patch | 36 ------------- .../0001-drop-FindPythonInstDir.cmake.patch | 39 --------------- ...-utils.cpp-fix-compilation-with-musl.patch | 48 ------------------ ...ables-with-pkg-config-cmake-s-own-mo.patch | 27 ---------- .../libdnf/libdnf/armarch.patch | 50 ------------------- meta/recipes-devtools/libdnf/libdnf_0.76.0.bb | 33 ------------ 8 files changed, 260 deletions(-) delete mode 100644 meta/recipes-devtools/libdnf/libdnf/0001-Get-parameters-for-both-libsolv-and-libsolvext-libdn.patch delete mode 100644 meta/recipes-devtools/libdnf/libdnf/0001-dnf-repo-Define-FNM_EXTMATCH-if-not-already-like-und.patch delete mode 100644 meta/recipes-devtools/libdnf/libdnf/0001-drop-FindPythonInstDir.cmake.patch delete mode 100644 meta/recipes-devtools/libdnf/libdnf/0001-utils-utils.cpp-fix-compilation-with-musl.patch delete mode 100644 meta/recipes-devtools/libdnf/libdnf/0004-Set-libsolv-variables-with-pkg-config-cmake-s-own-mo.patch delete mode 100644 meta/recipes-devtools/libdnf/libdnf/armarch.patch delete mode 100644 meta/recipes-devtools/libdnf/libdnf_0.76.0.bb diff --git a/meta/conf/distro/include/maintainers.inc b/meta/conf/distro/include/maintainers.inc index 4ad835fca4..10763a6b14 100644 --- a/meta/conf/distro/include/maintainers.inc +++ b/meta/conf/distro/include/maintainers.inc @@ -332,7 +332,6 @@ RECIPE_MAINTAINER:pn-libconvert-asn1-perl = "Tim Orling -Date: Tue, 7 Feb 2017 12:16:03 +0200 -Subject: [PATCH] Get parameters for both libsolv and libsolvext (libdnf is - - using both) - -Upstream-Status: Submitted [https://github.com/rpm-software-management/libdnf/pull/312] -Signed-off-by: Alexander Kanavin ---- - CMakeLists.txt | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/CMakeLists.txt b/CMakeLists.txt -index 6c866111..c56b6bab 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -58,7 +58,7 @@ endif() - - - # build dependencies --PKG_CHECK_MODULES (LIBSOLV REQUIRED libsolv) -+PKG_CHECK_MODULES (LIBSOLV REQUIRED libsolv libsolvext) - set(LIBSOLV_LIBRARY ${LIBSOLV_LIBRARIES}) - - diff --git a/meta/recipes-devtools/libdnf/libdnf/0001-dnf-repo-Define-FNM_EXTMATCH-if-not-already-like-und.patch b/meta/recipes-devtools/libdnf/libdnf/0001-dnf-repo-Define-FNM_EXTMATCH-if-not-already-like-und.patch deleted file mode 100644 index 2b64176317..0000000000 --- a/meta/recipes-devtools/libdnf/libdnf/0001-dnf-repo-Define-FNM_EXTMATCH-if-not-already-like-und.patch +++ /dev/null @@ -1,36 +0,0 @@ -From 09c7188880ca62248e7c1e8e907df66545bbc3df Mon Sep 17 00:00:00 2001 -From: Wang Mingyu -Date: Sun, 16 Nov 2025 23:29:18 +0000 -Subject: [PATCH] dnf-repo: Define FNM_EXTMATCH if not already (like under - musl). - -With musl, FNM_EXTMATCH is not defined: -dnf-repo.cpp -| dnf-repo.cpp: In function 'void dnf_repo_conf_load_overrides(DnfRepo*, const char*)': -| dnf-repo.cpp:971:50: error: 'FNM_EXTMATCH' was not declared in this scope; did you mean 'FNM_NOMATCH'? -| 971 | if (fnmatch(repo_id_pattern, repoId, FNM_EXTMATCH) != 0) { -| | ^~~~~~~~~~~~ -| | FNM_NOMATCH - -Upstream-Status: Submitted [https://github.com/rpm-software-management/libdnf/pull/1737/commits/47ed831c1fdb32519f2d66fee91bc47f9521d1d4] - -Signed-off-by: Wang Mingyu ---- - libdnf/dnf-repo.cpp | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/libdnf/dnf-repo.cpp b/libdnf/dnf-repo.cpp -index 21d23e0c..dd91b816 100644 ---- a/libdnf/dnf-repo.cpp -+++ b/libdnf/dnf-repo.cpp -@@ -69,6 +69,10 @@ - #include - #include - -+#if !defined(FNM_EXTMATCH) -+#define FNM_EXTMATCH 0 -+#endif -+ - typedef struct - { - DnfRepoEnabled enabled; diff --git a/meta/recipes-devtools/libdnf/libdnf/0001-drop-FindPythonInstDir.cmake.patch b/meta/recipes-devtools/libdnf/libdnf/0001-drop-FindPythonInstDir.cmake.patch deleted file mode 100644 index d3a7583eac..0000000000 --- a/meta/recipes-devtools/libdnf/libdnf/0001-drop-FindPythonInstDir.cmake.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 178a1358aac59f0b06184bd60a32fcfebbff9aba Mon Sep 17 00:00:00 2001 -From: Hongxu Jia -Date: Tue, 1 Jun 2021 10:23:59 +0800 -Subject: [PATCH] drop FindPythonInstDir.cmake - -Since commit [1] applied, PYTHON_INSTALL_DIR is not right -on nativesdk build -... -|Building for python3 -|-- Python install dir is -|tmp-glibc/work/x86_64-nativesdk-wrlinuxsdk-linux/nativesdk-libdnf/0.63.0-r0/ -recipe-sysroot-native/usr/lib/python3.9/site-packages -... - -Yocto manually set PYTHON_INSTALL_DIR from recipe, it is not -necessary to call FindPythonInstDir.cmake which will override -Yocto setting - -[1] https://github.com/rpm-software-management/libdnf/commit/f1cffbfb9f338da827e233c2d8ac3a25a6a59a69 - -Upstream-Status: Inappropriate [Yocto specific] - -Signed-off-by: Hongxu Jia ---- - cmake/modules/FindPythonInstDir.cmake | 7 +------ - 1 file changed, 1 insertion(+), 6 deletions(-) - -diff --git a/cmake/modules/FindPythonInstDir.cmake b/cmake/modules/FindPythonInstDir.cmake -index ed098ded..8b137891 100644 ---- a/cmake/modules/FindPythonInstDir.cmake -+++ b/cmake/modules/FindPythonInstDir.cmake -@@ -1,6 +1 @@ --EXECUTE_PROCESS(COMMAND ${PYTHON_EXECUTABLE} -c " --from sys import stdout --from sysconfig import get_path --path=get_path(name='platlib', vars={'platbase':'${CMAKE_INSTALL_PREFIX}'}) --stdout.write(path)" --OUTPUT_VARIABLE PYTHON_INSTALL_DIR) -+ diff --git a/meta/recipes-devtools/libdnf/libdnf/0001-utils-utils.cpp-fix-compilation-with-musl.patch b/meta/recipes-devtools/libdnf/libdnf/0001-utils-utils.cpp-fix-compilation-with-musl.patch deleted file mode 100644 index 0a6744db9a..0000000000 --- a/meta/recipes-devtools/libdnf/libdnf/0001-utils-utils.cpp-fix-compilation-with-musl.patch +++ /dev/null @@ -1,48 +0,0 @@ -From 899a524ff896d7c400e3b48f8c19feac695a7875 Mon Sep 17 00:00:00 2001 -From: Wang Mingyu -Date: Mon, 17 Nov 2025 00:05:14 +0000 -Subject: [PATCH] utils/utils.cpp: fix compilation with musl - -The basename() function requires the libgen.h header when -compiling with musl-libc, otherwise it complains: -error: 'basename' was not declared in this scope; did you mean 'g_basename'? -Also, musl's basename requires char* instead of const char* argument: -error: invalid conversion from 'const char*' to 'char*' [-fpermissive] - -Upstream-Status: Submitted [https://github.com/rpm-software-management/libdnf/pull/1737/commits/8720d5eeb0d348686d4c5f2ccb5a6c73d66eeff5] - -Signed-off-by: Wang Mingyu ---- - libdnf/utils/utils.cpp | 5 +++-- - 1 file changed, 3 insertions(+), 2 deletions(-) - -diff --git a/libdnf/utils/utils.cpp b/libdnf/utils/utils.cpp -index f5d200b8..40866360 100644 ---- a/libdnf/utils/utils.cpp -+++ b/libdnf/utils/utils.cpp -@@ -9,6 +9,7 @@ - #include - #include - #include -+#include - #include - #include - -@@ -311,7 +312,7 @@ std::vector createSortedFileList( - auto * path_fname = basename(path); - bool found{false}; - for (const auto & path_in_list : paths) { -- if (strcmp(path_fname, basename(path_in_list.c_str())) == 0) { -+ if (strcmp(path_fname, basename((char*)path_in_list.c_str())) == 0) { - found = true; - break; - } -@@ -325,7 +326,7 @@ std::vector createSortedFileList( - - // sort all drop-in configuration files alphabetically by their names - std::sort(paths.begin(), paths.end(), [](const std::string & p1, const std::string & p2) { -- return strcmp(basename(p1.c_str()), basename(p2.c_str())) < 0; -+ return strcmp(basename((char*)p1.c_str()), basename((char*)p2.c_str())) < 0; - }); - - return paths; diff --git a/meta/recipes-devtools/libdnf/libdnf/0004-Set-libsolv-variables-with-pkg-config-cmake-s-own-mo.patch b/meta/recipes-devtools/libdnf/libdnf/0004-Set-libsolv-variables-with-pkg-config-cmake-s-own-mo.patch deleted file mode 100644 index ff4db81d98..0000000000 --- a/meta/recipes-devtools/libdnf/libdnf/0004-Set-libsolv-variables-with-pkg-config-cmake-s-own-mo.patch +++ /dev/null @@ -1,27 +0,0 @@ -From 514b377d6c37ede0db0e3947f2870b22c1f8cf4c Mon Sep 17 00:00:00 2001 -From: Alexander Kanavin -Date: Fri, 30 Dec 2016 18:24:50 +0200 -Subject: [PATCH] Set libsolv variables with pkg-config (cmake's own module - - doesn't work properly). - -Upstream-Status: Submitted [https://github.com/rpm-software-management/libdnf/pull/312] -Signed-off-by: Alexander Kanavin ---- - CMakeLists.txt | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/CMakeLists.txt b/CMakeLists.txt -index 63e69888..6c866111 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -58,7 +58,8 @@ endif() - - - # build dependencies --find_package(LibSolv 0.7.21 REQUIRED COMPONENTS ext) -+PKG_CHECK_MODULES (LIBSOLV REQUIRED libsolv) -+set(LIBSOLV_LIBRARY ${LIBSOLV_LIBRARIES}) - - - # build dependencies via pkg-config diff --git a/meta/recipes-devtools/libdnf/libdnf/armarch.patch b/meta/recipes-devtools/libdnf/libdnf/armarch.patch deleted file mode 100644 index 9080024bf5..0000000000 --- a/meta/recipes-devtools/libdnf/libdnf/armarch.patch +++ /dev/null @@ -1,50 +0,0 @@ -From ec69d285812fc442ee04fe37144e7de4fecd24f1 Mon Sep 17 00:00:00 2001 -From: Richard Purdie -Date: Thu, 9 Nov 2023 10:29:31 +0000 -Subject: [PATCH] libdnf: Fix arm arch mapping issues for qemuarmv5 - -We change the way rpm architectures work, we make the machine name the default machine -specific package architecture. - -This arm mapping code can work or in the case of qemuarmv5, it doesn't as it creates -armv5hl which doesn't exist and causes errrors. We can simply remove it, we don't need it. - -Upstream-Status: Inappropriate [Relies on OE rpm config] ---- - libdnf/hy-util.cpp | 23 ----------------------- - 1 file changed, 23 deletions(-) - -diff --git a/libdnf/hy-util.cpp b/libdnf/hy-util.cpp -index 82f24edd..43cdea69 100644 ---- a/libdnf/hy-util.cpp -+++ b/libdnf/hy-util.cpp -@@ -117,29 +117,6 @@ hy_detect_arch(char **arch) - if (uname(&un) < 0) - return DNF_ERROR_FAILED; - -- if (!strncmp(un.machine, "armv", 4)) { -- /* un.machine is armvXE, where X is version number and E is -- * endianness (b or l); we need to add modifiers such as -- * h (hardfloat), n (neon). Neon is a requirement of armv8 so -- * as far as rpm is concerned armv8l is the equivilent of armv7hnl -- * (or 7hnb) so we don't explicitly add 'n' for 8+ as it's expected. */ -- char endian = un.machine[strlen(un.machine)-1]; -- char *modifier = un.machine + 5; -- while(isdigit(*modifier)) /* keep armv7, armv8, armv9, armv10, armv100, ... */ -- modifier++; -- if (getauxval(AT_HWCAP) & HWCAP_ARM_VFP) -- *modifier++ = 'h'; -- if ((atoi(un.machine+4) == 7) && (getauxval(AT_HWCAP) & HWCAP_ARM_NEON)) -- *modifier++ = 'n'; -- *modifier++ = endian; -- *modifier = 0; -- } --#ifdef __MIPSEL__ -- if (!strcmp(un.machine, "mips")) -- strcpy(un.machine, "mipsel"); -- else if (!strcmp(un.machine, "mips64")) -- strcpy(un.machine, "mips64el"); --#endif - #if defined(__e2k__) - if (__builtin_cpu_is("elbrus-v4") || __builtin_cpu_is("elbrus-8c") || __builtin_cpu_is("elbrus-1c+")) - strcpy(un.machine, "e2kv4"); diff --git a/meta/recipes-devtools/libdnf/libdnf_0.76.0.bb b/meta/recipes-devtools/libdnf/libdnf_0.76.0.bb deleted file mode 100644 index e8a2dca4d8..0000000000 --- a/meta/recipes-devtools/libdnf/libdnf_0.76.0.bb +++ /dev/null @@ -1,33 +0,0 @@ -SUMMARY = "Library providing simplified C and Python API to libsolv" -HOMEPAGE = "https://github.com/rpm-software-management/libdnf" -DESCRIPTION = "This library provides a high level package-manager. It's core library of dnf, PackageKit and rpm-ostree. It's replacement for deprecated hawkey library which it contains inside and uses librepo under the hood." -LICENSE = "LGPL-2.1-or-later" -LIC_FILES_CHKSUM = "file://COPYING;md5=4bf661c1e3793e55c8d1051bc5e0ae21" - -SRC_URI = "git://github.com/rpm-software-management/libdnf;branch=dnf-4-master;protocol=https;tag=${PV} \ - file://0004-Set-libsolv-variables-with-pkg-config-cmake-s-own-mo.patch \ - file://0001-Get-parameters-for-both-libsolv-and-libsolvext-libdn.patch \ - file://0001-drop-FindPythonInstDir.cmake.patch \ - file://armarch.patch \ - file://0001-dnf-repo-Define-FNM_EXTMATCH-if-not-already-like-und.patch \ - file://0001-utils-utils.cpp-fix-compilation-with-musl.patch \ - " - -SRCREV = "56370b044f6efdfd14240e3dccac62b833dbe027" -UPSTREAM_CHECK_GITTAGREGEX = "(?P(?!4\.90)\d+(\.\d+)+)" - -DEPENDS = "glib-2.0 libsolv librepo rpm libmodulemd json-c swig-native util-linux" - -inherit cmake pkgconfig setuptools3-base gettext - -COMPATIBLE_HOST_libc-musl = 'null' - -EXTRA_OECMAKE = " -DPYTHON_INSTALL_DIR=${PYTHON_SITEPACKAGES_DIR} -DPYTHON_DESIRED=3 \ - -DWITH_GTKDOC=OFF -DWITH_MAN=OFF -DWITH_HTML=OFF \ - -DWITH_TESTS=OFF \ - -DWITH_ZCHUNK=OFF \ - " - -BBCLASSEXTEND = "native nativesdk" - -SKIP_RECIPE[libdnf] ?= "${@bb.utils.contains('PACKAGE_CLASSES', 'package_rpm', '', 'Does not build without package_rpm in PACKAGE_CLASSES due disabled rpm support in libsolv', d)}"