#!/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 pkgname="$(xbps-uhelper getpkgname "$pkgname")" # We search for Requires.private: because even they are required # for usage with --cflags for rpkg in $( xbps-query \ --repository=hostdir/binpkgs/"$branch" \ --cat="$file" "$pkgname" \ | grep -E "Requires:|Requires.private" \ | cut -d: -f2 \ | sed 's/,/ /g' ) ; do printf "%s\\n" "$rpkg" >> "$tempdir/$1.pc" done done } grab_local() { if [ "$(xdistdir)" != "$(pwd -P)" ]; then return 0 fi branch=$(git symbolic-ref -q --short HEAD 2>/dev/null) for pkg in hostdir/binpkgs/$branch/*.xbps ; do [ "$pkg" = "hostdir/binpkgs/$branch/*.xbps" ] && continue pkg="${pkg##*/}" pkg="$(echo "$pkg" | sed 's|-musl||g')" pcfile="$( xbps-query -i \ --repository=hostdir/binpkgs/"$branch" \ -f "$(xbps-uhelper getpkgname "$pkg")" \ | grep "/$1.pc" )" if [ -n "$pcfile" ] ; then printf "%s %s\\n" "$pkg" "$pcfile" touch "$tempdir/$1.pc" fi done | create_pcfile "$1" } grab_requires() { for pkg; do xlocate "usr/\(lib\|share\)/pkgconfig/$pkg.pc" 2>/dev/null | { grep . || { echo "xpcdeps: No pkg-config file for $pkg found." >&2 ; exit 1; } } | create_pcfile "$pkg" done } get_package_from_requires() { while read -r pkg ; do xlocate "usr/\(lib\|share\)/pkgconfig/$pkg.pc" 2>/dev/null | { grep . || { printf -- "UNKNOWN PKG PLEASE FIX -> %s\\n" "$pkg" >&2 ; return; } } | while read -r pkgname file ; do file="${file##*/}" printf "%s -> %s\\n" "${pkgname%-*}" "${file%*.pc}" done done } sanitize_pcfile() { # remove special symbols ( < > = { } $ ) # remove version numbers # remove all duplicates sed -i -e '/[${<=>}]/d' \ -e '/[a-zA-Z]/!d' "$1" sort -u "$1" } for arg; do grab_local "$arg" [ -f "$tempdir/$arg.pc" ] || grab_requires "$arg" if [ -f "$tempdir/$arg.pc" ]; then sanitize_pcfile "$tempdir/$arg.pc" | get_package_from_requires fi done