diff --git a/doc/PKGBUILD.5.asciidoc b/doc/PKGBUILD.5.asciidoc index 9e2c36fa..1cd31f73 100644 --- a/doc/PKGBUILD.5.asciidoc +++ b/doc/PKGBUILD.5.asciidoc @@ -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 ------------------- diff --git a/scripts/libmakepkg/lint_pkgbuild/meson.build b/scripts/libmakepkg/lint_pkgbuild/meson.build index 6050df2f..a0bc2f31 100644 --- a/scripts/libmakepkg/lint_pkgbuild/meson.build +++ b/scripts/libmakepkg/lint_pkgbuild/meson.build @@ -25,6 +25,7 @@ sources = [ 'source.sh.in', 'util.sh.in', 'variable.sh.in', + 'xdata.sh.in', ] foreach src : sources diff --git a/scripts/libmakepkg/lint_pkgbuild/xdata.sh.in b/scripts/libmakepkg/lint_pkgbuild/xdata.sh.in new file mode 100644 index 00000000..1ab77ad7 --- /dev/null +++ b/scripts/libmakepkg/lint_pkgbuild/xdata.sh.in @@ -0,0 +1,58 @@ +#!/bin/bash +# +# xdata.sh - Check the 'xdata' array conforms to requirements. +# +# Copyright (c) 2014-2025 Pacman Development Team +# +# 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 . +# + +[[ -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 +} diff --git a/scripts/libmakepkg/util/schema.sh.in b/scripts/libmakepkg/util/schema.sh.in index 27c0c19b..6707af0e 100644 --- a/scripts/libmakepkg/util/schema.sh.in +++ b/scripts/libmakepkg/util/schema.sh.in @@ -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 diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in index dbb24da3..820d068f 100644 --- a/scripts/makepkg.sh.in +++ b/scripts/makepkg.sh.in @@ -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"