Skip to content

Properly canonicalize $SAGE_ROOT #5852

@tornaria

Description

@tornaria

Currently, $SAGE_ROOT/sage uses (first among other alternate methods) readlink -n to detect the directory where the script lives (that's $SAGE_ROOT), but that is broken because

  • It only works when $0 (the sage executable itself) is a symbolic link
  • If the sage executable is a symbolic link, then readlink -n returns the link itself, not the canonicalized name. Example: if /usr/local/sage-4.7.1/sage is a symbolic link to sagefoo, then SAGE_ROOT would become sagefoo when '/usr/local/sage-4.7.1/sagefoo is intended.
  • The symlink expansion may not be completely done, and $SAGE_ROOT could end up with a non-canonical dirname, which leads to issues with testing.
  • The code to detect SAGE_ROOT inside sage-env does not canonicalize the pathname at all. This should be fixed as well. (The only case where sage-env is run without SAGE_ROOT being set is when testing Sage from the Makefile, i.e. when running make ptest or similar.)

Note that we should do this in a portable way, without using realpath, readlink -f or the likes.

See also #11704, which solves the same problem for DOT_SAGE.

Apply:

  1. attachment: 5852_sage_root.patch to SAGE_ROOT
  2. attachment: 5852_scripts.patch to local/bin
  3. attachment: 5852_doc.patch and attachment: trac_5852-doc-referee.patch to devel/sage

Depends on #11926
Depends on #11959

CC: @nexttime @kini

Component: scripts

Author: Jeroen Demeyer

Reviewer: John Palmieri, Leif Leonhardy

Merged: sage-4.8.alpha3

Issue created by migration from https://trac.sagemath.org/ticket/5852

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions