diff options
-rw-r--r-- | README | 2 | ||||
-rwxr-xr-x | xpcdeps | 65 | ||||
-rw-r--r-- | xtools.1 | 4 |
3 files changed, 71 insertions, 0 deletions
diff --git a/README b/README index 7cc4345..b0ab8ba 100644 --- a/README +++ b/README @@ -110,6 +110,8 @@ COMMANDS xuname – display system info relevant for debugging Void + xpcdeps pcfile ... - finds package matching the Requires: section of pkg-config files + DESCRIPTION Tools working on the void-packages tree use xdistdir to find it, check that its output is reasonable first. diff --git a/xpcdeps b/xpcdeps new file mode 100755 index 0000000..a594d01 --- /dev/null +++ b/xpcdeps @@ -0,0 +1,65 @@ +#!/bin/sh +# xpcdeps pcfile ... - finds package matching the Requires: section of pkg-config files +cleanup() { + [ -n "$tempdir" ] && + [ -d "$tempdir" ] && + rm -rf -- "$tempdir" +} +trap cleanup EXIT INT TERM + +tempdir="$(mktemp -d)" + +# This takes 1 argument which is the name of the file to write to and reads +# lines from stdin in the form of '$pkgname $file' +create_pcfile() { + branch=$(git symbolic-ref -q --short HEAD 2>/dev/null) + while read -r pkgname file ; do + for rpkg in $( xbps-query --repository=hostdir/binpkgs/"$branch" --cat="$file" "$pkgname" | grep Requires: | cut -d: -f2 ) ; do + # This makes the iterator ignore over the version specifier available for pkg-config + # >=, <=, >, <, =, and also ignore versions by ignoring everything that doesn't have + # a letter + [ -z "${rpkg##*[<=>]*}" ] && continue + [ -z "${rpkg##*[a-zA-Z]*}" ] || continue + printf "%s\\n" "$rpkg" >> "$tempdir/$1.pc" + done + done +} + +grab_local() { + branch=$(git symbolic-ref -q --short HEAD 2>/dev/null) + for pkg in hostdir/binpkgs/$branch/* ; do + pkg="${pkg##*/}" + pcfile="$(xbps-query -i --repository=hostdir/binpkgs/"$branch" -f "${pkg%-*}" | grep "$1.pc")" + if [ -n "$pcfile" ] ; then + printf "%s %s\\n" "${pkg%-*}" "$pcfile" + touch "$tempdir/$1.pc" + fi + done | create_pcfile "$1" + + # Check if the file doesn't exist, we can't check if it empty because emptyness + # means the Requires: is defined but is empty + [ -f "$tempdir/$1.pc" ] || return 1 +} + +grab_requires() { + for pkg; do + xlocate "usr/\(lib\|share\)/pkgconfig/$pkg.pc" | + { grep . || { echo "xpcdeps: No pkg-config file for $pkg found." 1>&2 ; exit 1; } } | + create_pcfile "$pkg" + done +} + +get_package_from_requires() { + while read -r pkg ; do + xlocate "usr/\(lib\|share\)/pkgconfig/$pkg.pc" | + { grep . || { printf -- "UNKNOWN PKG PLEASE FIX -> %s\\n" "$pkg" 1>&2 ; return; } } | + while read -r pkgname file ; do + file="${file##*/}" + printf "%s -> %s\\n" "${pkgname%-*}" "${file%*.pc}" + done + done +} + +for arg; do + grab_local "$arg" || grab_requires "$arg" && [ -f "$tempdir/$arg.pc" ] && get_package_from_requires < "$tempdir/$arg.pc" +done diff --git a/xtools.1 b/xtools.1 index 1dcd8c9..ac0c2ca 100644 --- a/xtools.1 +++ b/xtools.1 @@ -229,6 +229,10 @@ only print main package .Pp .Nm xuname .Nd display system info relevant for debugging Void +.Pp +.Nm xpcdeps +.Ar pcfile ... +.Nd finds package matching the Requires: section of pkg-config files .Sh DESCRIPTION Tools working on the void-packages tree use .Nm xdistdir |