about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--README2
-rwxr-xr-xxpcdeps65
-rw-r--r--xtools.14
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