Opened 12 years ago

Last modified 10 years ago

#10469 closed defect

Don't (effectively) source sage-env more than once — at Initial Version

Reported by: Leif Leonhardy Owned by: Georg S. Weber
Priority: major Milestone: sage-4.7.1
Component: build Keywords: environment variables sage-sage scripts
Cc: John Palmieri, Mitesh Patel, Ivan Andrus Merged in:
Authors: Reviewers:
Report Upstream: N/A Work issues:
Branch: Commit:
Dependencies: Stopgaps:

Status badges


This can currently happen because

  • some scripts (like e.g. at least sage-spkg) sources it itself (which is necessary since sage-spkg isn't always called through sage-sage, which also sources it),
  • some receipts in the top-level Makefile source it before some other script is called through sage-sage,
  • sage-sage itself or other (e.g. Python) code may run sage ... commands such that sage-sage is then called recursively, again sourcing sage-env.

To achieve this, we could simply add

# Don't execute the commands below more than once:
if [ -z "$SAGE_ENV_SOURCED" ]; then
    export SAGE_ENV_SOURCED=1  # or "yes", "true" or alike, but see below (versioning)
    # Already sourced, nothing to do.
    return 0

near its top.

We may even put a version number into that variable and execute (perhaps only some of) the commands in sage-env "again" in case it was modified during running scripts, which could be helpful when upgrading Sage.

Such a variable also allows still generic, but safer tests than the usual [ -z "$SAGE_LOCAL" ], since SAGE_LOCAL being defined doesn't really imply sage-env was sourced, but we usually intend to ensure that some environment variables (like e.g. CC or UNAME) are properly set up, without testing each of these individually.

Effectively sourcing (at least parts of) sage-env only once also

  • avoids redundant entries in PATH etc.,
  • avoids special tests if some variable was already defined / modified (like e.g. SAGE_ORIG_LD_LIBRARY_PATH), also simplifying other scripts (cf. #10286),
  • IMHO reduces the risk of unintentional side-effects, and
  • speeds up execution.

Also, we should replace the useless

#!/usr/bin/env bash

at its top by (e.g.)


which causes an error if sage-env is called rather than sourced (which makes no sense and therefore is indeed an error), with an "appropriate" error message since such an interpreter certainly does not exist.

Change History (0)

Note: See TracTickets for help on using tickets.