#!/usr/bin/env bash
# Handle options of the src/bin/sage script that pertain to SAGE_ROOT or sage-the-distribution.
usage() {
echo
#### 1.......................26..................................................78
#### |.....................--.|...................................................|
echo "Sage-the-distribution options:"
echo " --optional -- list all optional packages that can be installed"
echo " --experimental -- list all experimental packages that can be installed"
echo " --info [packages] -- print the description (SPKG.rst) of the given packages"
echo " and some additional information"
echo " -i [packages] -- install the given Sage packages"
}
usage_advanced() {
echo
#### 1.......................26..................................................78
#### |.....................--.|...................................................|
echo "Building the Sage library:"
echo
echo " -b -- build Sage library -- do this if you have"
echo " modified any source code files in SAGE_ROOT/src/sage/"
echo " -ba -- same as -b, but rebuild *all* Cython"
echo " code."
echo " -br -- build and run Sage"
echo
echo " -bt [...] -- build Sage and test; same options as -t"
echo " -btp <N> [...] -- build Sage and test in parallel; same options as -tp"
echo " -btnew [...] -- build Sage and test modified files, as in -t --new"
echo
echo " -bn [...], --build-and-notebook [...]"
echo " -- build the Sage library (as by running \"sage -b\")"
echo " and then start the notebook"
echo
echo "Package handling:"
echo
echo " --package [args] -- call the package manager with given arguments."
echo " Run without arguments for help."
echo " --experimental -- list all experimental packages that can be installed"
echo " -i [opts] [pkgs] -- install the given Sage packages. Options:"
echo " -c -- run the packages' test suites,"
echo " overriding the settings of"
echo " SAGE_CHECK and SAGE_CHECK_PACKAGES"
echo " -d -- only download, do not install packages"
echo " -f -- force build: install the packages even"
echo " if they are already installed"
echo " -s -- do not delete the temporary build directories"
echo " after a successful build"
echo " -y -- reply yes to prompts about experimental"
echo " and old-style packages; warning: there"
echo " is no guarantee that these packages will"
echo " build correctly; use at your own risk"
echo " -n -- reply no to prompts about experimental"
echo " and old-style packages"
echo " -f [opts] [pkgs] -- shortcut for -i -f: force build of the given Sage"
echo " packages"
echo " -p [opts] [packages]-- install the given Sage packages, without dependency"
echo " checking. Options are the same as for the -i command."
echo " --optional -- list all optional packages that can be installed"
echo " --standard -- list all standard packages that can be installed"
echo " --installed -- list all installed packages"
echo
#### 1.......................26..................................................78
#### |.....................--.|...................................................|
echo "Making Sage distributions:"
echo
echo " --sdist -- build a source distribution of Sage"
echo
echo "Building the documentation:"
echo
echo " --docbuild [lang/]<document> <html|pdf|...> -- Build the Sage documentation"
echo
echo "Other developer tools:"
echo
echo " --root -- print the Sage root directory"
echo " --git-branch -- print the current git branch"
echo " --buildsh [...] -- run a shell with Sage environment variables"
echo " as they are set while building Sage and its packages"
echo
#### 1.......................26..................................................78
#### |.....................--.|...................................................|
}
if [ "$1" = '-h' -o "$1" = '-?' -o "$1" = '-help' -o "$1" = '--help' ]; then
usage
exit 0
fi
if [ "$1" = "-advanced" -o "$1" = "--advanced" ]; then
usage_advanced
exit 0
fi
#####################################################################
# Package handling
#####################################################################
if [ "$1" = '-package' -o "$1" = "--package" ]; then
shift
exec sage-package "$@"
fi
if [ "$1" = '-optional' -o "$1" = "--optional" ]; then
shift
exec sage-list-packages optional $@
fi
if [ "$1" = '-experimental' -o "$1" = "--experimental" ]; then
shift
exec sage-list-packages experimental $@
fi
if [ "$1" = '-standard' -o "$1" = "--standard" ]; then
shift
exec sage-list-packages standard $@
fi
if [ "$1" = '-p' ]; then
# If there are no further arguments, display usage help
if [ $# -eq 1 ]; then
set -- --info
else
# Delegate to option handling of -i below
set -- -i "$@"
fi
fi
if [ "$1" = '-f' ]; then
# -f is an alias for -i -f
set -- -i "$@"
fi
if [ "$1" = '-i' ]; then
shift
if [ -z "$MAKE" ]; then
MAKE="make"
fi
set -e
cd "$SAGE_ROOT"
# Parse options
PACKAGES="" # Packages to install
INSTALL_OPTIONS="" # Options to sage-spkg
NO_DEPS="" # Append to the package name in 'make'
for OPT in "$@"; do
case "$OPT" in
-info|--info)
echo >&2 "Error: 'sage -i $OPT <package>' is no longer supported, use 'sage --info <package>' instead."
exit 2;;
-f) FORCE_INSTALL=yes;;
-p) NO_DEPS=-no-deps;;
# Setting SAGE_CHECK here duplicates what we do in sage-spkg
# but we need it in "make" already when there are (order-only)
# dependencies on packages providing test infrastructure
-c) INSTALL_OPTIONS="$INSTALL_OPTIONS $OPT"; export SAGE_CHECK=yes;;
-w) INSTALL_OPTIONS="$INSTALL_OPTIONS $OPT"; export SAGE_CHECK=warn;;
-*) INSTALL_OPTIONS="$INSTALL_OPTIONS $OPT";;
*.spkg)
echo "Error: Installing old-style SPKGs is no longer supported."
exit 1;;
*) PACKAGES="$PACKAGES $OPT";;
esac
done
# Get list of targets; this may trigger bootstrap/configure
ALL_TARGETS="$($MAKE list)"
# First, uninstall the packages if -f was given
if [ "$FORCE_INSTALL" = yes ]; then
for PKG in $PACKAGES; do
$MAKE "$PKG-uninstall" || true # Ignore errors
done
fi
if [ -z "$NO_DEPS" ]; then
# Make sure that the toolchain is up-to-date
# (which is a dependency of every package)
$MAKE all-toolchain
fi
# Now install the packages
for PKG in $PACKAGES; do
echo
# Check that $PKG is actually a Makefile target
# See https://github.com/sagemath/sage/issues/25078
if ! echo "$ALL_TARGETS" | grep "^${PKG}$" >/dev/null; then
echo >&2 "Error: package '$PKG' not found"
echo >&2 "Note: if it is an old-style package, installing these is no longer supported"
exit 1
fi
$MAKE SAGE_SPKG="sage-spkg $INSTALL_OPTIONS" "$PKG$NO_DEPS"
done
if [ -z "$NO_DEPS" ]; then
echo "New packages may have been installed."
echo "Re-running configure and make in case any dependent packages need updating."
touch "$SAGE_ROOT/configure" && $MAKE all-build
fi
exit 0
fi
if [ "$1" = '-info' -o "$1" = '--info' ]; then
shift
if [ $# -eq 0 ]; then
# If there are no further arguments, display usage help.
"$SAGE_ROOT"/build/bin/sage-spkg
exit 0
fi
for PKG in "$@"
do
"$SAGE_ROOT"/build/bin/sage-spkg --info "$PKG" || exit $?
done
exit 0
fi
if [ "$1" = '-git-branch' -o "$1" = '--git-branch' ]; then
shift
exec git --git-dir="$SAGE_ROOT"/.git rev-parse --abbrev-ref HEAD
fi
echo "Error: unknown option: $1"
exit 1