Add tix-list-packages(8).
This commit is contained in:
parent
1444f907c6
commit
163f2fa3df
8 changed files with 258 additions and 126 deletions
4
Makefile
4
Makefile
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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"
|
||||
|
||||
|
|
|
@ -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
|
|
@ -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
179
tix/tix-list-packages
Executable 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
67
tix/tix-list-packages.8
Normal 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.
|
Loading…
Add table
Reference in a new issue