#!/usr/bin/env bash ######################################################################## # Set various environment variables ######################################################################## # Assume current directory is SAGE_ROOT/build/make export SAGE_ROOT=`cd ../.. && pwd -P` export SAGE_SRC="$SAGE_ROOT/src" # Determine SAGE_LOCAL . "$SAGE_SRC"/bin/sage-env-config if [ $? -ne 0 ]; then echo "Error: Failed to read sage-env-config. Did you run configure?" exit 1 fi export SAGE_SHARE="$SAGE_LOCAL/share" export SAGE_PKGCONFIG="$SAGE_LOCAL/lib/pkgconfig" export SAGE_LOGS="$SAGE_ROOT/logs/pkgs" if [ -z "${SAGE_ORIG_PATH_SET}" ]; then SAGE_ORIG_PATH=$PATH && export SAGE_ORIG_PATH SAGE_ORIG_PATH_SET=True && export SAGE_ORIG_PATH_SET fi export PATH="$SAGE_ROOT/build/bin:$SAGE_SRC/bin:$SAGE_LOCAL/bin:$PATH" export PYTHONPATH="$SAGE_LOCAL" sage_num_threads_array=$(sage-build-num-threads 2>/dev/null || echo 1 2 1) sage_num_threads_array="${sage_num_threads_array% *}" # strip third item export SAGE_NUM_THREADS="${sage_num_threads_array% *}" # keep first item export SAGE_NUM_THREADS_PARALLEL="${sage_num_threads_array#* }" # keep second item ############################################################################### # Skip the rest if nothing to do (i.e., to [re]build). ############################################################################### # Set MAKE to "make" if unset if [ -z "$MAKE" ]; then export MAKE=make fi # Make the special target _clean-broken-gcc before trying to build any other # packages. This is necessary if configure detected a broken GCC installed # in Sage; Issue #25011 $MAKE _clean-broken-gcc # If "make" doesn't understand the -q option (although we require # GNU make, which supports it), it should exit with a non-zero status # which is not a problem. if $MAKE -q "$@" >/dev/null 2>/dev/null; then echo "Nothing to (re)build / all up-to-date." exit 0 fi # Dump environment for debugging purposes: if [ -n "$GITHUB_ACTIONS" ]; then echo "::group::*** ALL ENVIRONMENT VARIABLES BEFORE BUILD: ***" else echo "*** ALL ENVIRONMENT VARIABLES BEFORE BUILD: ***" fi env | sort printf '\E[m' echo "***********************************************" if [ -n "$GITHUB_ACTIONS" ]; then echo "::endgroup::" fi # look_for_errors: search log files for error messages and print a summary. # arguments: # - $1: glob pattern for log files to search # - $2: N for "tail -N" # - $3: regular expression to search for # - $4: type of object ("package" or "documentation") look_for_errors() { # Sort in chronological order by log file. for f in `ls -tr $1 2>/dev/null`; do # Look for recent error message in log file. # Note that "tail -n 20 ..." doesn't work on Solaris. if tail -$2 $f 2>/dev/null | grep "$3" &>/dev/null; then base_f=`basename $f .log` # stat(1) is not portable between Linux and macOS, so we extract it from ls -lf timestamp=`ls -l $f | awk -F' ' '{print $6, $7, $8}'` 2> /dev/null cat >&2 <<EOF * $4: $base_f last build time: $timestamp log file: $f EOF if [ $4 = "package" ]; then build_dir="${SAGE_BUILD_DIR:-$SAGE_LOCAL/var/tmp/sage/build}/$base_f" if [ -d "$build_dir" ]; then cat >&2 <<EOF build directory: $build_dir EOF fi fi fi done } ############################################################################### # NOW do the actual build: ############################################################################### $MAKE "$@" if [ $? -ne 0 ]; then cat >&2 <<EOF *************************************************************** Error building Sage. The following package(s) may have failed to build (not necessarily during this run of 'make $@'): EOF look_for_errors "$SAGE_LOGS/*.log" 20 "^Error" package >&2 cat >&2 <<EOF It is safe to delete any log files and build directories, but they contain information that is helpful for debugging build problems. WARNING: If you now run 'make' again, the build directory of the same version of the package will, by default, be deleted. Set the environment variable SAGE_KEEP_BUILT_SPKGS=yes to prevent this. EOF exit 1 elif [ "$SAGE_CHECK" = "warn" ]; then echo "SAGE_CHECK=warn, so scanning the log files. This may take a few seconds." # The following warning message must be consistent with SAGE_ROOT/build/bin/sage-spkg (see trac:32781) warnings=`look_for_errors "$SAGE_LOGS/*.log" 20 "^Warning: Failures testing package" package` if [ -n "$warnings" ]; then cat >&2 <<EOF *************************************************************** Warning: the following package(s) may have failed their test suites (not necessarily during this run of 'make $@'): EOF echo $warnings >&2 fi fi # Build succeeded. echo "Sage build/upgrade complete!"