Add tix-list-packages(8).

This commit is contained in:
Jonas 'Sortie' Termansen 2024-11-29 23:17:32 +01:00
parent 1444f907c6
commit 163f2fa3df
8 changed files with 258 additions and 126 deletions

View file

@ -340,13 +340,13 @@ endif
.PHONY: available-ports
available-ports:
@for port in $$(build-aux/list-packages.sh PACKAGES); do \
@for port in $$(tix-list-packages --ports="$(SORTIX_PORTS_DIR)" $${PACKAGES-all!!}); do \
build-aux/upgrade-port.sh ports/$$port/$$port.port available; \
done
.PHONY: upgrade-ports
upgrade-ports:
@for port in $$(build-aux/list-packages.sh PACKAGES); do \
@for port in $$(tix-list-packages --ports="$(SORTIX_PORTS_DIR)" $${PACKAGES-all!!}); do \
build-aux/upgrade-port.sh ports/$$port/$$port.port upgrade; \
done

View file

@ -92,7 +92,7 @@ if [ "$OPERATION" = build ]; then
fi
fi
PACKAGES="$("$(dirname -- "$0")"/list-packages.sh PACKAGES)"
PACKAGES=$(tix-list-packages --ports="$SORTIX_PORTS_DIR" ${PACKAGES-all!!})
# Simply stop if there is no packages available.
if [ -z "$PACKAGES" ]; then
@ -102,26 +102,8 @@ fi
# Decide the order the packages are built in according to their dependencies.
if [ "$OPERATION" = build ]; then
PACKAGES="$(echo "$PACKAGES" | tr ' ' '\n' | sort -R)"
DEPENDENCY_MAKEFILE=$(mktemp)
(for PACKAGE in $PACKAGES; do
DEPENDENCIES="$(PACKAGES="$PACKAGES" \
"$(dirname -- "$0")"/list-packages.sh \
--dependencies $PACKAGE)"
echo "$PACKAGE: $(echo "$DEPENDENCIES" | tr '\n' ' ')"
echo " @echo $PACKAGE"
done;
printf ".PHONY:"
for PACKAGE in $PACKAGES; do
printf " $PACKAGE"
done;
echo) > "$DEPENDENCY_MAKEFILE"
BUILD_LIST=$(unset MAKE;
unset MFLAGS;
unset MAKEFLAGS;
make -Bs -f "$DEPENDENCY_MAKEFILE" $PACKAGES)
rm -f "$DEPENDENCY_MAKEFILE"
PACKAGES="$BUILD_LIST"
PACKAGES=$(tix-list-packages --ports="$SORTIX_PORTS_DIR" \
--build-order $PACKAGES)
fi
unset CACHE_PACKAGE

View file

@ -24,7 +24,7 @@ fi
SORTIX_PORTS_DIR=$(make_dir_path_absolute "$SORTIX_PORTS_DIR")
# Clean all the packages.
for PACKAGE in $("$(dirname -- "$0")"/list-packages.sh 'all!'); do
for PACKAGE in $(tix-list-packages --ports="$SORTIX_PORTS_DIR" 'all!!'); do
if [ "$1" = distclean ]; then
DEVELOPMENT=$(tix-vars -d false $SORTIX_PORTS_DIR/$PACKAGE/$PACKAGE.port \
DEVELOPMENT)

View file

@ -8,6 +8,9 @@ if [ -z "$HOST" ]; then
elif [ -z "$SORTIX_REPOSITORY_DIR" ]; then
echo "$0: error: You need to set \$SORTIX_REPOSITORY_DIR" >&2
exit 1
elif [ -z "$SORTIX_PORTS_DIR" ]; then
echo "$0: error: You need to set \$SORTIX_PORTS_DIR" >&2
exit 1
fi
if ! [ -d "$SORTIX_REPOSITORY_DIR" ]; then
@ -18,7 +21,7 @@ if ! [ -d "$SORTIX_REPOSITORY_DIR" ]; then
exit 0
fi
PACKAGES="$("$(dirname -- "$0")"/list-packages.sh PACKAGES)"
PACKAGES=$(tix-list-packages --ports="$SORTIX_PORTS_DIR" ${PACKAGES-all!!})
mkdir -p "$1"

View file

@ -1,101 +0,0 @@
#!/bin/sh
set -e
if [ -z "$SORTIX_PORTS_DIR" ]; then
SORTIX_PORTS_DIR="$(dirname -- "$0")/../ports"
fi
RUNTIME_DEPS=RUNTIME_DEPS
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 $RUNTIME_DEPS
fi
)}
# TODO: This algorithm scales extremely poorly.
get_package_dependencies_recursive() {(
for dependency in $(get_package_dependencies_raw $1); do
want=false
if [ "$dependency" = '*' ]; then
get_all_packages | grep -Ev '^all$'
continue
fi
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 '^[^!]*')
echo "$package"
if [ -n "$recursion" ]; then
get_package_dependencies_recursive "$package" "$recursion"
fi
)}
if [ "$1" = "--dependencies" ]; then
shift
RUNTIME_DEPS=
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

View file

@ -30,6 +30,7 @@ tix-eradicate-libtool-la \
tix-iso-add \
tix-iso-bootconfig \
tix-iso-liveconfig \
tix-list-packages \
tix-port \
tix-repository \
@ -41,6 +42,7 @@ tix-execpatch.8 \
tix-iso-add.8 \
tix-iso-bootconfig.8 \
tix-iso-liveconfig.8 \
tix-list-packages.8 \
tix-port.8 \
tix-repository.8 \
tix-rmdiff.8 \

179
tix/tix-list-packages Executable file
View file

@ -0,0 +1,179 @@
#!/bin/sh
# Copyright (c) 2022, 2024 Jonas 'Sortie' Termansen.
#
# Permission to use, copy, modify, and distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#
# tix-list-packages
# List packages per their port(5) dependencies.
set -e
unset all_packages
build_order=false
dependencies=false
ports_directory=
operand=1
dashdash=
previous_option=
for argument do
if [ -n "$previous_option" ]; then
eval $previous_option=\$argument
previous_option=
shift
continue
fi
case $argument in
*=?*) parameter=$(expr "X$argument" : '[^=]*=\(.*\)' || true) ;;
*=) parameter= ;;
*) parameter=yes ;;
esac
case $dashdash$argument in
--) dashdash=yes ;;
--all-packages=*) all_packages=$parameter ;;
--all-packages) all_packages=ports_directory ;;
--build-order) build_order=true ;;
--dependencies) dependencies=true ;;
--ports=*) ports_directory=$parameter ;;
--ports) previous_option=ports_directory ;;
-*) echo "$0: unrecognized option $argument" >&2
exit 1 ;;
*) break ;;
esac
shift
done
if [ -z "$ports_directory" ]; then
echo "$0: error: No --ports option was specified" >&2
exit 1
fi
RUNTIME_DEPS=RUNTIME_DEPS
tmpdir=$(mktemp -dt tix-list-packages.XXXXXX)
trap 'rm -rf -- "$tmpdir"' EXIT HUP INT QUIT TERM
get_all_packages() {(
for package in $(ls "$ports_directory"); do
if [ -f "$ports_directory/$package/$package.port" ]; then
echo $package
fi
done
)}
get_package_dependencies_raw() {(
if [ -f "$ports_directory/$1/$1.port" ]; then
tix-vars -d '' "$ports_directory/$1/$1.port" BUILD_LIBRARIES $RUNTIME_DEPS
fi
)}
list_dependencies() {(
package="$1"
for dependency in $(get_package_dependencies_raw "$package"); do
if [ "$dependency" != "${dependency%\?}" ]; then
dependency="${dependency%\?}"
for candidate in $all_packages; do
if [ "$candidate" = "$dependency" ]; then
echo "$dependency"
break
fi
done
else
echo "$dependency"
fi
done
)}
get_package_dependencies_recursive() {(
if [ -e "$tmpdir/$1.visited" ]; then exit; fi
touch "$tmpdir/$1.visited"
for dependency in $(get_package_dependencies_raw $1); do
want=false
if [ "$dependency" = '*' ]; then
get_all_packages | grep -Ev '^all$'
continue
fi
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 "$ports_directory/$dependency/$dependency.port" ]; then
echo "$dependency"
get_package_dependencies_recursive "$dependency" "$2"
fi
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 '^[^!]*')
echo "$package"
if [ -n "$recursion" ]; then
get_package_dependencies_recursive "$package" "$recursion"
fi
)}
if $dependencies; then
all_packages=${all_packages-all!!}
all_packages=$(for package in $all_packages; do
list_package "$package"
done | LC_ALL=C sort -u)
RUNTIME_DEPS=
for package; do
list_dependencies "$package"
done | sort -u
exit
fi
packages=$(for package; do
list_package "$package"
done | LC_ALL=C sort -u)
if $build_order; then
all_packages=$packages
RUNTIME_DEPS=
(for package in $packages; do
echo "$package: $(list_dependencies "$package" | tr '\n' ' ')"
echo " @echo $package"
done;
printf ".PHONY:"
for package in $packages; do
printf " $package"
done;
echo) > "$tmpdir/Makefile"
packages=$(unset MAKE;
unset MFLAGS;
unset MAKEFLAGS;
make -Bs -f "$tmpdir/Makefile" $packages)
fi
for package in $packages; do
echo "$package"
done

67
tix/tix-list-packages.8 Normal file
View file

@ -0,0 +1,67 @@
.Dd November 30, 2024
.Dt TIX-LIST-PACKAGES 8
.Os
.Sh NAME
.Nm tix-list-packages
.Nd list packages per their port(5) dependencies
.Sh SYNOPSIS
.Nm
.Fl \-ports Ns = Ns Ar directory
.Op Fl \-all-packages Ns = Ns Ar package-list
.Op Fl \-build-order
.Op Fl \-dependencies
.Ar packages ...
.Sh DESCRIPTION
.Nm
lists the named
.Ar packages
in sorted order using the
.Xr port 5
files in the
.Fl \-ports
directory.
The
.Sq "!"
package suffix includes its recursive mandatory build time and runtime
dependencies.
The
.Sq !!
package suffix includes all its recursive mandatory and optional build time and
runtime dependencies.
.Pp
The options are as follows:
.Bl -tag -width "12345678"
.It Fl \-all-packages Ns = Ns Ar package-list
The full set of ports for the purpose of
.Fl \-dependencies
is the space separated
.Ar package-list
expanded normally.
Dependencies are only used if they exist in this list, defaulting to
.Sy all!! .
.It Fl \-build-order
Order the packages in their build order respecting the
.Sy BUILD_LIBRARIES
variable in
.Xr port 5 ,
such that the packages can be built correctly in this order.
.It Fl \-dependencies
Output the direct dependencies of the
.Ar packages .
.It Fl \-ports Ns = Ns Ar directory
Locate the ports in this
.Ar directory
where every port has a subdirectory named after it containing its
.Xr port 5
file.
.El
.Sh EXIT STATUS
.Nm
will exit 0 on success and non-zero otherwise.
.Sh SEE ALSO
.Xr port 5 ,
.Xr porting 7 ,
.Xr tix-port 8
.Sh HISTORY
.Nm
originally appeared in Sortix 1.1.