sortix-mirror/build-aux/list-packages.sh

109 lines
2.4 KiB
Bash
Executable File

#!/bin/sh
set -e
if [ -z "$SORTIX_PORTS_DIR" ]; then
SORTIX_PORTS_DIR="$(dirname -- "$0")/../ports"
fi
# Load the ports sets.
. "$(dirname -- "$0")/ports.conf"
get_all_packages() {(
for package in $(ls "$SORTIX_PORTS_DIR"); do
if [ -f "$SORTIX_PORTS_DIR/$package/$package.port" ]; then
echo $package
fi
done
)}
get_package_dependencies_raw() {(
if [ -f "$SORTIX_PORTS_DIR/$1/$1.port" ]; then
tix-vars -d '' "$SORTIX_PORTS_DIR/$1/$1.port" BUILD_LIBRARIES
elif [ "$1" = "all" ]; then
get_all_packages
else
for set in $sets; do
if [ $set = $1 ]; then
echo $(eval echo \$set_$set)
fi
done
fi
)}
# TODO: This algorithm scales extremely poorly.
get_package_dependencies_recursive() {(
for dependency in $(get_package_dependencies_raw $1); do
want=false
if [ "$2" = "!!" ]; then
want=true
else
case "$dependency" in
*"?") ;;
*) want=true ;;
esac
fi
if $want; then
dependency=$(echo "$dependency" | tr -d '?')
# Optional dependencies might not exist yet.
if [ -f "$SORTIX_PORTS_DIR/$dependency/$dependency.port" ]; then
echo "$dependency"
get_package_dependencies_recursive "$dependency" "$2"
fi
fi
done
)}
list_dependencies() {(
package="$1"
for dependency in $(get_package_dependencies_raw "$package"); do
if [ "$dependency" != "${dependency%\?}" ]; then
dependency="${dependency%\?}"
for candidate in $PACKAGES; do
if [ "$candidate" = "$dependency" ]; then
echo "$dependency"
break
fi
done
else
echo "$dependency"
fi
done
)}
list_package() {(
package="$1"
# Fast path for listing all packages.
if [ "$package" = "all!" -o "$package" = "all!!" ]; then
get_all_packages
exit
fi
recursion=$(echo "$package" | grep -Eo '!*$')
package=$(echo "$package" | grep -Eo '^[^!]*')
# TODO: Better way of detecting if a port is a set.
if [ -f "$SORTIX_PORTS_DIR/$package/$package.port" ]; then
echo "$package"
fi
if [ -n "$recursion" ]; then
get_package_dependencies_recursive "$package" "$recursion"
fi
)}
if [ "$1" = "--dependencies" ]; then
shift
PACKAGES=$("$0" PACKAGES)
for package; do
list_dependencies "$package"
done | sort -u
exit
fi
for package; do
if [ "$package" = PACKAGES ]; then
for package in ${PACKAGES-all!}; do
list_package "$package"
done
else
list_package "$1"
fi
done | sort -u