makepkg: provide a field for tracking generic metadata

The xdata field is an array of key=value entries that allow a packager to
include arbitrary metadata in the generated .PKGINFO.

Fixes #241.

Signed-off-by: Dominik Peteler <archlinux+gitlab@with-h.at>
This commit is contained in:
Dominik 2025-05-26 06:09:02 +00:00 committed by Allan McRae
parent af54cd4ee1
commit 9fca328caf
5 changed files with 70 additions and 2 deletions

View file

@ -313,6 +313,15 @@ underscore and the architecture name e.g., 'replaces_x86_64=()'.
Enable building packages using link time optimization. Adds '-flto'
to both CFLAGS and CXXFLAGS.
*xdata (array)*::
This array allows you to add additional metadata to the package.
This data is neither used by pacman nor by makepkg;
It has purely informational purpose, or may be interpreted by third-party tools.
+
All entries in that array must have the form 'key=value', where
'key' is an arbitrary non-empty string and 'value' must not contain an equal sign.
Furthermore, the key ``pkgtype'' is reserved for the makepkg program.
Packaging Functions
-------------------

View file

@ -25,6 +25,7 @@ sources = [
'source.sh.in',
'util.sh.in',
'variable.sh.in',
'xdata.sh.in',
]
foreach src : sources

View file

@ -0,0 +1,58 @@
#!/bin/bash
#
# xdata.sh - Check the 'xdata' array conforms to requirements.
#
# Copyright (c) 2014-2025 Pacman Development Team <pacman-dev@lists.archlinux.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
[[ -n "$LIBMAKEPKG_LINT_PKGBUILD_XDATA_SH" ]] && return
LIBMAKEPKG_LINT_PKGBUILD_XDATA_SH=1
MAKEPKG_LIBRARY=${MAKEPKG_LIBRARY:-'@libmakepkgdir@'}
source "$MAKEPKG_LIBRARY/util/message.sh"
source "$MAKEPKG_LIBRARY/util/pkgbuild.sh"
lint_pkgbuild_functions+=('lint_xdata')
lint_xdata() {
local xdata_list entry key value ret=0
get_pkgbuild_all_split_attributes xdata xdata_list
for entry in "${xdata_list[@]}"; do
key="${entry%%=*}"
value="${entry##*=}"
if [[ "${entry}" == "${key}=${value}" ]]; then
# Entries must contain exactly one equal sign.
error "$(gettext "%s array: Entries must contain exactly one equal sign, e.g. key=value.")" "xdata"
ret=1
elif [[ "${key}" == '' ]]; then
# Do not allow keys without values.
error "$(gettext "%s array: The key part of an entry must not be empty.")" "xdata"
ret=1
elif [[ "${key}" == "pkgtype" ]]; then
# The key "pkgtype" is reserved for makepkg.
error "$(gettext "%s array: The key 'pkgtype' is reserved for makepkg.")" "xdata"
ret=1
fi
done
return $ret
}

View file

@ -30,7 +30,7 @@ known_hash_algos=({ck,md5,sha{1,224,256,384,512},b2})
pkgbuild_schema_arrays=(arch backup checkdepends conflicts depends groups
license makedepends noextract optdepends options
provides replaces source validpgpkeys
provides replaces source validpgpkeys xdata
"${known_hash_algos[@]/%/sums}")
pkgbuild_schema_strings=(changelog epoch install pkgbase pkgdesc pkgrel pkgver

View file

@ -493,7 +493,7 @@ write_pkginfo() {
write_kv_pair "pkgname" "$pkgname"
write_kv_pair "pkgbase" "$pkgbase"
write_kv_pair "xdata" "pkgtype=$pkgtype"
write_kv_pair "xdata" "pkgtype=$pkgtype" "${xdata[@]}"
local fullver=$(get_full_version)
write_kv_pair "pkgver" "$fullver"