Opened 12 years ago

Last modified 10 years ago

#10469 closed defect

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

Reported by: leif Owned by: GeorgSWeber
Priority: major Milestone: sage-4.7.1
Component: build Keywords: environment variables sage-sage scripts
Cc: jhpalmieri, mpatel, iandrus Merged in:
Authors: Ivan Andrus Reviewers:
Report Upstream: N/A Work issues:
Branch: Commit:
Dependencies: Stopgaps:

Status badges

Description (last modified by kini)

This can currently happen because

  • some scripts source it themselves (like e.g. at least sage-spkg, 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)
else
    # Already sourced, nothing to do.
    return 0
fi

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.)

#!/this/script/must/be/sourced

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.

Apply trac_10469.v3.patch to local/bin

Change History (7)

comment:1 Changed 12 years ago by leif

Thoughts?

comment:2 Changed 12 years ago by leif

  • Description modified (diff)

Changed 11 years ago by iandrus

comment:3 Changed 11 years ago by iandrus

  • Authors set to Ivan Andrus
  • Status changed from new to needs_review

It seems reasonable to me, so I've included a patch which does everything except versioning. This will obsolete #4029.

Changed 11 years ago by jhpalmieri

scripts repo; replaces other patch

Changed 11 years ago by kini

comment:4 Changed 11 years ago by kini

  • Description modified (diff)

While we're at it, why don't we just make sage-env non-executable? Patch attached.

Note: See TracTickets for help on using tickets.