From patchwork Fri Nov 6 13:03:21 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adam Duskett X-Patchwork-Id: 103260 Received: from mail-ej1-f50.google.com (mail-ej1-f50.google.com [209.85.218.50]) by mx.groups.io with SMTP id smtpd.msgproc01-g2.5387.1793970210529353506 for ; Fri, 06 Nov 2026 05:03:31 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@amarulasolutions.com header.s=google header.b=DhijA2KF; spf=pass (domain: amarulasolutions.com, ip: 209.85.218.50, mailfrom: adam.duskett@amarulasolutions.com) Received: by mail-ej1-f50.google.com with SMTP id a640c23a62f3a-c41d20c016fso3705566b.2 for ; Fri, 06 Nov 2026 05:03:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amarulasolutions.com; s=google; t=1793970209; x=1794575009; 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=DhijA2KFVSENI7DNyya5yZtfKyz0n+m6S89evKVTJTqhRC7SOsi5PfAgmo0RPfiIgA 6CCFN2VZfludFLLA9Aejs0H5OF6jqEwZ1izkqMhKYWqErJLwteVPRm9Tb7K14AH8zlaB BHH0TihEOE/hZZ/GzrQ6dbsCulOlxv7RdQV3Q= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1793970209; x=1794575009; 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=i+USa9+aKc+DdGPZVU/Qi+cNMZWjZ6eXsz+mob+KVivnswjcyW+xnYZRlZDPdkRMgj x1o8nWnV2LtcgYMpWZzoeMFQIul6Jb9nGd6ONb1eBQ7PVyklVO6F//puFU+kCEjDD6CE z1Yo+a3fDnXovRH1zLo2UUfn41PFH/dsm/Hz0qyY8nP76vbGp8nSoHyefwopvvvUa8oV wRh8lUVzjqUsuDXZnKpqvs8WrVnxkhsMbxGbtswQYLjzhmHas3JPgbPmWcDVOldPtERY EnMrxuxwCo36K0joInexFaOf1ss0CGV117sw1sjlNxE5rwYqyqe50/C+en677t1vI2jW AkPw== X-Gm-Message-State: APuU4Z/kxdj8Lfue1aFBKUCjjBCNRX0FlOpVWhf1gP11vTIwjAC/oOGh Q8WUswoisQqWzP+iH/Q0q1SxPAVrjabZQvx+p8ibllFV7czlRqY8rT6pnqDMw2HCZ8iHOJMf1Z2 ftddoKWbxkw== X-Gm-Gg: AYBFou1uiC7xD7fzbLrI96nYqyPCYodR+4qH9k+GY4xlNwn/bF7lQaq+iSEz6vNyJTs ML5WiIuwdQtOd5hVPDg33KTWaFUqojvHV8T5RpG/FKI2HIchKTMu31cCIE6wLG0XTEz3CSLny/B uCI8hxoz8LArxL40R89t1G4M5qacI2Hspz4ZVV6RFY/PQm8zv8QTSGZChyu0mhzzCe9mQb3D6Qq nWlXCLArh3GjPRfpxxOCUUQvWLOF5HPeOoW7XlDZMqDhss4FE6YkgaLVlw9cXwBync1+u3/TjtF HdHZrrp4EBlJPSuNxKD+muKuxZBs/pc6qN3NeAs+TBkL6JMBqweeTqIYMfMJjPn1hEUHy9O+ZRo 1uIzdDW4xZ3SL9S47S2BrR10Dp4WMZxdhNIb9YASpT47xkARVMOjSbqVExfwBY91/nkuNpyFBzv SagO9a6Ded7KsHNpxyx6imMfup7oE1oVZifQ8LJTef0p6vkCBmMTqLIlELQVALc6uUqGSi45PjS RM8jOoin+hYPdzEk1/DWlGxY1QGHiBIw92v6p2xytZygzODwBD7xC16HFLRtwUhTC/a4F3Q/WAP 7LZYqKCm34GLTa7o4ukyBY3Y9E9By2bH9v2vTCkHxFPHjpIvDbLYIm2lp8OrIzYH231ecoEH1NR Vn5UsiACr8gCrzTXbvGigfi17Icq+ZYm6QhFcX29X4VKXfT3frjxYgO0MdoQ5xU9Lqqzdr/4D60 sbVi+A6VQRDZnCu+LP5nyGf6XjnafSzJU0j643cqrdEqYgJUBFWX475dd8vhxJBzLmfXC0o2YRT n+mz9QmTONRFac= X-Received: by 2002:a17:907:29cf:b0:c34:db91:aa1e with SMTP id a640c23a62f3a-c4d34cbe4c6mr218526066b.4.1793970208528; Fri, 06 Nov 2026 05:03:28 -0800 (PST) Return-Path: Received: from adam-linux.arnhem.chello.nl (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-c4d354ac3f3sm81222566b.7.2026.11.06.05.03.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 06 Nov 2026 05:03:26 -0800 (PST) From: Adam Duskett To: openembedded-core@lists.openembedded.org Cc: Adam Duskett Subject: [PATCH v13 1/4] libtoml1: fix building tests with gcc 16 Date: Fri, 6 Nov 2026 14:03:21 +0100 Message-ID: <20261106130325.2154855-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 ; Fri, 06 Nov 2026 13:03:36 -0000 X-Groupsio-URL: https://lists.openembedded.org/g/openembedded-core/message/249644 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 Fri Nov 6 13:03:22 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adam Duskett X-Patchwork-Id: 103261 Received: from mail-ej1-f43.google.com (mail-ej1-f43.google.com [209.85.218.43]) by mx.groups.io with SMTP id smtpd.msgproc02-g2.5524.1793970214836675723 for ; Fri, 06 Nov 2026 05:03:35 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@amarulasolutions.com header.s=google header.b=UzFhDf1b; spf=pass (domain: amarulasolutions.com, ip: 209.85.218.43, mailfrom: adam.duskett@amarulasolutions.com) Received: by mail-ej1-f43.google.com with SMTP id a640c23a62f3a-c347be93d54so6504666b.2 for ; Fri, 06 Nov 2026 05:03:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amarulasolutions.com; s=google; t=1793970213; x=1794575013; 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=UzFhDf1bejQWctVM0aAffMGYhFQULDSOGTZSnlwxaY95MA3CQahMxHcDE900U2o767 JHKYpfGkV5B4w1+3pcAjRxuYP62nsTDcdn5h/ZmvsNSmDn7V9V+Psx1rdmPpr9c1mrIz 8MiMLlky+uJfuG1w1ZzMRH7PcQcMG1e1CTmqo= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1793970213; x=1794575013; 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=PjjanMizVn/zwiTXFPzjCWt4BOzs4u3wv2GNbsiI3NBkTurvQLlR0orxiEdeWfG/jB K2gXk8qHjbW/QZOFnCovJx2nfqzfxsMmOh+zVqve5oAC28hNkFxUF3QzZ6I4wJlWUiZj 8xdo/Qb+y0Pk6Kx8MtyN6UMxzVBdotiKs5ruzozDo3zRlB9Y76HfGW/Dyw7HcbbCVmi5 wR3OF5prajJjlp1oYjZ2s36Li+jWlQX6U2qMtrT6n5rAFq2I09tAwlb5INAj8/26faCv wtT7yn6El39jS2JXrl9xLLDVRGW7xfmpFa8Tdu/VjC1Kyl0nkRJbjdbYqM+NoqSawohu H00A== X-Gm-Message-State: APuU4Z/B5dEJs3JqV0X1gK5j6kQDS9/W47+KYQ3yhhSieeYUWdqDDD0K T3HMhMg6HjJd8ghDM9LII9Glwfwka5H849B3iKTfNCv8D/5EuhZdBrR0V2gzSBO0d3q5y3TM7qb WU4jNn6uBVw== X-Gm-Gg: AYBFou2/vPb9tvPRwPXOmldXFXzUYZ7B1nanN1zRJX8AbAbJ2cOMH2S1U8qfKlhSxeC qi1MZUcGRgv3TX+ps3Owx688cRw/y3N5gM29Ca3v+IfVPFd5auFpVeicgN79gBkDSAkEWiWgRYK nsg4jct2yw7r9coBw3md9mgSBzgxcJo5XkxXd/sGdliPX2KXtvdMxvGAcgwctfBjsBYShgxk6q4 k6BIcrjg0H+TL4/mvJ+Udj5t8CzzdNWYufzcbZPkUNu+2Sld4ZYv4BvV9SzNHgEgEJG0wcAV8qD 4G6wQiBRVaup0AnffhnYEHaqvBhte8pUEfRCeg2MgRJZ3g6L5wqScqFqjuJ7uQDnlSNHgcxGxor AVjZxvmQuHR7mVxlknbozQAD93TIqDd+lrMHRRc3WqJjj0Uogb52V4VrMi4yDpIjwv8Uf0j82x0 jnIV8ntHjTnsjGKk1rz7msLUqnFNiEZIXwk1xoKpkDOwyPdr091UPG/bfkmvpMxRLHblI3uMGvp MwicxWnltv5x0Ec7uwiVU1D8CwSgQNUmifPIF1DYQpCYMlu0oUS+/oCynulpVrUjsiQ8vrj8AO/ NKP8SEmhvk4ERvaFJn9/qovnJLyInGpEK5+6bO/LCGINv9JQKbVdwyF8dsjpeyY4rRF6KATkAZI 3UqZa51hihcVNGCW0icLVp2V8/tNZiC0hYufHSQFmopTrFz/AZfMwVqJB28HOucEgnMxYzu/m1u mREGiEVRiBX5edCNrJyMt5Gc2unB3LzQZQoknlUZcNwNRQn5OJ9zA37fAa5tXpzQBUXOy2zpeVn 9Z232w1aYTJ1TQL67sCjDPbAA27RR6wnf8q X-Received: by 2002:a17:906:f50:b0:c46:ae89:cd3c with SMTP id a640c23a62f3a-c4d3466c88bmr239461566b.1.1793970212959; Fri, 06 Nov 2026 05:03:32 -0800 (PST) Return-Path: Received: from adam-linux.arnhem.chello.nl (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-c4d354ac3f3sm81222566b.7.2026.11.06.05.03.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 06 Nov 2026 05:03:28 -0800 (PST) From: Adam Duskett To: openembedded-core@lists.openembedded.org Cc: Adam Duskett Subject: [PATCH v13 2/4] rpm: add 0017-critically-fail-if-post-install-fails.patch Date: Fri, 6 Nov 2026 14:03:22 +0100 Message-ID: <20261106130325.2154855-2-adam.duskett@amarulasolutions.com> X-Mailer: git-send-email 2.56.0 In-Reply-To: <20261106130325.2154855-1-adam.duskett@amarulasolutions.com> References: <20261106130325.2154855-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 ; Fri, 06 Nov 2026 13:03:36 -0000 X-Groupsio-URL: https://lists.openembedded.org/g/openembedded-core/message/249645 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 Fri Nov 6 13:03:23 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Adam Duskett X-Patchwork-Id: 103262 Received: from mail-ej1-f43.google.com (mail-ej1-f43.google.com [209.85.218.43]) by mx.groups.io with SMTP id smtpd.msgproc01-g2.5391.1793970219055961740 for ; Fri, 06 Nov 2026 05:03:39 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@amarulasolutions.com header.s=google header.b=Aucjmexx; spf=pass (domain: amarulasolutions.com, ip: 209.85.218.43, mailfrom: adam.duskett@amarulasolutions.com) Received: by mail-ej1-f43.google.com with SMTP id a640c23a62f3a-c408e21e8acso4875666b.3 for ; Fri, 06 Nov 2026 05:03:38 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amarulasolutions.com; s=google; t=1793970217; x=1794575017; 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=bw7gkgA4uxyPqw8EgqrGx9eBnWMllSYqDiSHLfWvvA8=; b=AucjmexxCujPdeRvjc5BAsPXGjsGyd3W5LX6v7SyyJgsjm3mqD9zJjwC/lDQSEZeP6 A5rOAf5KP8swPXlXJJf7FvS2yk6Y8qmWsv+7VhUAWTiJYzmjjR1dJ5aaH77w6FwhNtvE aWcgw5r6isVBc/sDzQoxffKF71aSHFPlUSIjQ= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1793970217; x=1794575017; 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=bw7gkgA4uxyPqw8EgqrGx9eBnWMllSYqDiSHLfWvvA8=; b=X9Q1loZKCYHrxrmSdLgdXnAnYVzRDlqBtycLNybZh3h3jnxGMzxj5TE3RB4caw/HcH a3b9/dWY3UnnLiDqF+DsCXqVrPg07YB3Bu0wzWzxVcQKmyb6Se/0++xnYM5+Z/mZrmrl GGC/n8pyH0v01TeSQdQe4BWAhKss/p19FZFNt+Zb+DD/RQ/F7OKzK0/k/eg1WIKExhKs IU7t+nu0ka0YkTw1e8Skef98woF1SKHoQn3N7mruBliY+KfHX6pe4C1FqTYOFE8xOAMK V8i0C3YViwOOdYwdsMWuC77YmeJAw7fid6bFG7T/23koCveCha5Y9IpN3RGrbFKHvqvd XXSQ== X-Gm-Message-State: APuU4Z/PkV8lsNHEZk4e+oZVM2ZA6PwgQhTstpAPfmMN64Swk0ctMe9w etvb/RWu7hdMvmn/bXZeDaCJMPp4+d1Lrme6yFK76tyKSgWZ8YDCEmcfaGX5nNB3cVAQDifP7GV Ltp94/n/HeA== X-Gm-Gg: AYBFou1Ymf3EWqcKz7Ofr2qiSM5JpKBYyzg+P+6pH2LqmFzThSKXvk6+ELBGcftW4LJ xI1Jb6mUCbskHfUFS89Rw6mIrA98uNiD5UsgO7O3hE3TbzGrwzwPiLBMcpgsDE37BE5Vv8Fw7HA YF5VayjZUH5qwt1QKji0wSKW+Fo6i/sx8AGd2xIv33A8YscBhNHIY4t9wHTH83QgbVzzBcen+bv uDeJR9AXKTbA1lT7T6j393gmgd1KnwLz8wGKWNRwXNlIeqnpOQJeOYLa8KWTJDhQp2awJ5zDXTZ 06elg1kIeJUW4XGm84GqNI0wwk6J3wRicwC389l/dc6/i/aefGyjxT52voU0HFyG5vS+oPEuuYw fPElPmFp1OcvcoRGAJriCX1zpmNh83Gr2YmIYTjEFVBnb+uf8ejJYB8TdlYoNO/YXsfp74V51S6 D2zQoy5UzHVus0jTqBoNfmtJsq/SQ0MeV13Dgm+nG4pJE+DRnNt6mxm3uGmXKAmATjbiWbjWzf0 o98tb3B5E+zGjYUNQAyLC8Zz0p3KVf70+EKr2XL1DQHQHU1u5OWfOXbgGeGC0lvAG/IQ7/4LIoB YeZa09m0gNVPGj4JjbyyVL9ZWLRYzMHo0PsxlTcwhh7vkdFPHMb1e0FypeXD2pJrHkDkqzPglMT UJOMLR1lvc130H6dApuOEzl290lEMrnVKFVlZozDGsSgCYFyc0bgGj/mWg+s/+TRXdXuQpRc0+m b5uyYhnzDKuFi2QH4mR1Nx3hXp6XhgNz6Zr6kgCtbFZROgEqM0tn3BLuKQ6e5U7E2vfofS8gp+c mzZO1ZJKYvhK20= X-Received: by 2002:a17:906:d284:b0:c29:4634:5c8f with SMTP id a640c23a62f3a-c4d34c9995bmr193979966b.0.1793970216619; Fri, 06 Nov 2026 05:03:36 -0800 (PST) Return-Path: Received: from adam-linux.arnhem.chello.nl (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-c4d354ac3f3sm81222566b.7.2026.11.06.05.03.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 06 Nov 2026 05:03:34 -0800 (PST) From: Adam Duskett To: openembedded-core@lists.openembedded.org Cc: Adam Duskett Subject: [PATCH v13 3/4] dnf: Upgrade to 5.4.7.0 Date: Fri, 6 Nov 2026 14:03:23 +0100 Message-ID: <20261106130325.2154855-3-adam.duskett@amarulasolutions.com> X-Mailer: git-send-email 2.56.0 In-Reply-To: <20261106130325.2154855-1-adam.duskett@amarulasolutions.com> References: <20261106130325.2154855-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 ; Fri, 06 Nov 2026 13:03:46 -0000 X-Groupsio-URL: https://lists.openembedded.org/g/openembedded-core/message/249646 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, and dnf5 keeps its state in /usr/lib/sysimage/libdnf5. Add both to packaging_data_dirs, otherwise images without package-management keep them, and the transaction history leaks TMPDIR paths. - Pass the local repository to --repofrompath as a file:// URL. dnf5 only reports package locations for URL baseurls, so with a bare path "repoquery --location" prints nothing. - 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. dnf5 also reports the full name-epoch:version-release.arch, so strip it down to the package name. - Update test_incremental_image_generation for the "Installing:" and "Removing:" transaction tables that dnf5 prints. 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 v12 -> v13: Add dnf5 directories to self.packaging_data_dirs to prevent stale directories to show up in fitimages which causes bitbake failures. .../lib/oeqa/runtime/cases/dnf_runtime.py | 6 +- meta/conf/distro/include/maintainers.inc | 2 +- meta/lib/oe/package_manager/rpm/__init__.py | 35 +-- 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 ++++++++++++++++++ ...f5-offline-fix-build-without-systemd.patch | 35 +++ ...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.7.0.bb | 183 ++++++++++++++++ 24 files changed, 776 insertions(+), 366 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 create mode 100644 meta/recipes-devtools/dnf/dnf/0007-dnf5-offline-fix-build-without-systemd.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.7.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 ec7a93562e..cb2bb9be55 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..3460a6bb35 100644 --- a/meta/lib/oe/package_manager/rpm/__init__.py +++ b/meta/lib/oe/package_manager/rpm/__init__.py @@ -83,7 +83,8 @@ class RpmPM(PackageManager): self.saved_packaging_data = self.d.expand('${T}/saved_packaging_data/%s' % self.task_name) if not os.path.exists(self.d.expand('${T}/saved_packaging_data')): bb.utils.mkdirhier(self.d.expand('${T}/saved_packaging_data')) - self.packaging_data_dirs = ['etc/rpm', 'etc/rpmrc', 'etc/dnf', 'var/lib/rpm', 'var/lib/dnf', 'var/cache/dnf'] + self.packaging_data_dirs = ['etc/rpm', 'etc/rpmrc', 'etc/dnf', 'var/lib/rpm', 'var/lib/dnf', 'var/cache/dnf', + 'usr/lib/sysimage/libdnf5', 'var/cache/libdnf5'] self.solution_manifest = self.d.expand('${T}/saved/%s_solution' % self.task_name) if not os.path.exists(self.d.expand('${T}/saved')): @@ -163,7 +164,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 +201,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 +213,10 @@ 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: + # dnf reports name-epoch:version-release.arch, keep only the name + 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 +316,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 +343,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 +414,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..4360139a26 --- /dev/null +++ b/meta/recipes-devtools/dnf/dnf/0001-Do-not-hardcode-the-systemd-unit-directory.patch @@ -0,0 +1,29 @@ +From fd24b56096d436da4ffe5e560ac3aa34000a4d2e 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.7.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 9bc01ee..6fbc338 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") + set(AUTO_IMPORT_KEYS_DIRS "/usr/share/pki/rpm-gpg:/etc/pki/rpm-gpg" CACHE STRING + "Colon-separated list of directories of OpenPGP keys trusted by auto_import_local_keys") +-- +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/0007-dnf5-offline-fix-build-without-systemd.patch b/meta/recipes-devtools/dnf/dnf/0007-dnf5-offline-fix-build-without-systemd.patch new file mode 100644 index 0000000000..dba69d4bd9 --- /dev/null +++ b/meta/recipes-devtools/dnf/dnf/0007-dnf5-offline-fix-build-without-systemd.patch @@ -0,0 +1,35 @@ +From 81405407f84d87ebec7c3f9eeeaafaa148e9f462 Mon Sep 17 00:00:00 2001 +From: Adam Duskett +Date: Fri, 6 Nov 2026 13:29:35 +0100 +Subject: [PATCH] dnf5: offline: fix build without systemd + +The plymouth argument of reboot() is only used when dnf5 is built with +systemd support. Without it, the argument is unused and the build fails: + + dnf5/commands/offline/offline.cpp:277:53: error: unused parameter + 'plymouth' [-Werror=unused-parameter] + +Mark the argument as [[maybe_unused]]. + +Upstream-Status: Submitted [https://github.com/rpm-software-management/dnf5/pull/3030] +Signed-off-by: Adam Duskett +--- + dnf5/commands/offline/offline.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/dnf5/commands/offline/offline.cpp b/dnf5/commands/offline/offline.cpp +index 74123e2..f95ecdc 100644 +--- a/dnf5/commands/offline/offline.cpp ++++ b/dnf5/commands/offline/offline.cpp +@@ -274,7 +274,7 @@ void invalidate_if_not_valid(libdnf5::offline::OfflineTransactionState & state, + } + } + +-void reboot(bool poweroff = false, PlymouthOutput * plymouth = nullptr) { ++void reboot(bool poweroff = false, [[maybe_unused]] PlymouthOutput * plymouth = nullptr) { + if (std::getenv("DNF_SYSTEM_UPGRADE_NO_REBOOT")) { + if (poweroff) { + std::cerr << "DNF_SYSTEM_UPGRADE_NO_REBOOT is set, not powering off." << std::endl; +-- +2.56.0 + 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.7.0.bb b/meta/recipes-devtools/dnf/dnf_5.4.7.0.bb new file mode 100644 index 0000000000..d07b5e1f9f --- /dev/null +++ b/meta/recipes-devtools/dnf/dnf_5.4.7.0.bb @@ -0,0 +1,183 @@ +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 LGPL-2.0-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.0.txt;md5=920be02b2cababb5f05b0b3a69d27263 \ + 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 \ + file://0007-dnf5-offline-fix-build-without-systemd.patch \ +" +SRC_URI:append:class-native = " file://0001-Do-not-hardcode-the-systemd-unit-directory.patch" +SRCREV = "a42787112973edb4e5ba237d4fca6f878ac5f4c1" + +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_CONTAINER=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 Fri Nov 6 13:03:24 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adam Duskett X-Patchwork-Id: 103263 Received: from mail-ed1-f50.google.com (mail-ed1-f50.google.com [209.85.208.50]) by mx.groups.io with SMTP id smtpd.msgproc02-g2.5528.1793970222131147173 for ; Fri, 06 Nov 2026 05:03:42 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@amarulasolutions.com header.s=google header.b=PkBDPwb/; spf=pass (domain: amarulasolutions.com, ip: 209.85.208.50, mailfrom: adam.duskett@amarulasolutions.com) Received: by mail-ed1-f50.google.com with SMTP id 4fb4d7f45d1cf-6b58c577e9dso100678a12.0 for ; Fri, 06 Nov 2026 05:03:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amarulasolutions.com; s=google; t=1793970220; x=1794575020; 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=8KDFFE6LCTdKk8kS3/6UdL2t6iKPCL/8nUwX+ITHcHw=; b=PkBDPwb/ZBNmTG9jgthVKeN/pbeXRXLLEsPgFX+wZAjPJogozvqspLexnH7bECaJVE mpnIJDDVzRFU9iFqj7Ir5655MDxEmI1rlr+kSnEKDzwmEDmlPc4AfopCEN+PQmKICFNZ ncwhuCBU2+ZQXYsTem7bF3nFwWupy7aXD91F4= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1793970220; x=1794575020; 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=8KDFFE6LCTdKk8kS3/6UdL2t6iKPCL/8nUwX+ITHcHw=; b=IQUb+hrkd/XDoROU8Q6t4z2mIyJgjCRimxmQLByku0LweRL20k0/60vBX+A0lpZOfr XsXC/D1uoX95a7Gk54dgBokExtrjAi7gAJwdS8UB5+WNAW0hpvO7Fz5n4lhoj3ZltAXv lNnLPORx0sQGZSTH5eb2qArrdgHfVIU5/xgz//Y8W84L4Sh0FLt6aPdC1ugbsX5U5hkO tFGvylKaTLYPnCM0c/NP9I1oTGsmaDF7Wo1IRYoQ1JTgo2UtddMsypKVM6/bcSosaKxC U4kPHpPXaN19N8cJOFisCaiyKdkMbWSI2qbJ+WKYu+xtpfnZbV3OZgk7YdLRc5Fljge2 6LnQ== X-Gm-Message-State: APuU4Z9EgbP1P6qZcyKoRuLr/64ooqhr0FzeF+PVHjAq9RIiH55ceUKK 7mm38+CR7LkkYQI/tvy1zctwTW0LivkXGc7IhbAqxeOTjXzizNO9Gw3k/7J6PUox8Ao/aTu7bh9 6wgIO6DQ39Q== X-Gm-Gg: AYBFou2SWourtoTCf3rfPNCgXSSNO+x2+CK6tymd41wdPNC91yYX1W3zt92ebzrJ2Ii k9uXFyFEH/QnbBQoumfHAZ5G9kVEdRbCXvhWbozPz2wS2nM5Z4eUIg5e0/KdRwlJWAF4N4aXup6 dwbpM4SL3JE5tRWkzWv1xpcym5Y66hDG8HYwI+vT2KpV5nPPxl3bhsyTo/mECiwMYzoAuoI4ThU QJ3UG2EBdgE2NJdSr/DVkU/uw52/F1B+srLkOo38kQkJijvQYqz1uk5Wt9+Jancn43C+IzsrLFt PmnQvMNDshcPY85O9WiLFhsUe0jZgiYBs4qemnLecrxgjeC3t4kczQSQIqwEbeSHSUvueubu1e+ TFqV9+BJbT3enVjqlZSyGu6spAto1/+Q0mAZI6j3d6SBLB854qEXDKq6l6MXnwZWUyp7M6wu4CW Q/6G20cCz+UVS2ffYlg0rChoOxAJP575Qm97yqJfwzSDy4uL3G6FJ1VmkfnwOsrGCsp7LH/JJZl IGT2XtvViP2FuXEL5hI/TldAyJfheDWp3SKIMEoHJW5Yw5/uPDXcWZEv6WIFqBmluEWtGCnywwk G6PoLN0w+52X2Ow0Ere3sakFepXnJSUdLeqhBeAT+1rTziRXegChPp+wjI/twP7FTbweKmtzt7q 7ACAbXfGkdydhNN1EDaqG7O9PAFV8AuWo4OkmjxZAnMNbdoV85DDGZdlbveK1vnAUeeU5FgL2aK Rym5YKln6XMoKyslhtNP5amMXJQ+OspbK/kmW60LwHaJJQ5pXIEpHpGzCh6cfHc7whliJqhrDlw +z1b0F4OpJgY7I= X-Received: by 2002:a17:907:da04:b0:c3f:98d4:dfda with SMTP id a640c23a62f3a-c4d352cc4efmr279171466b.3.1793970220078; Fri, 06 Nov 2026 05:03:40 -0800 (PST) Return-Path: Received: from adam-linux.arnhem.chello.nl (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-c4d354ac3f3sm81222566b.7.2026.11.06.05.03.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 06 Nov 2026 05:03:37 -0800 (PST) From: Adam Duskett To: openembedded-core@lists.openembedded.org Cc: Adam Duskett Subject: [PATCH v13 4/4] libdnf: remove recipe Date: Fri, 6 Nov 2026 14:03:24 +0100 Message-ID: <20261106130325.2154855-4-adam.duskett@amarulasolutions.com> X-Mailer: git-send-email 2.56.0 In-Reply-To: <20261106130325.2154855-1-adam.duskett@amarulasolutions.com> References: <20261106130325.2154855-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 ; Fri, 06 Nov 2026 13:03:46 -0000 X-Groupsio-URL: https://lists.openembedded.org/g/openembedded-core/message/249647 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 cb2bb9be55..8bc20ac4fe 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)}"