Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Relative symlinks?

24 views
Skip to first unread message

Jack Bates

unread,
Oct 15, 2016, 4:28:51 PM10/15/16
to dev-b...@lists.mozilla.org
What do you think about making the
mozilla-central/obj-x86_64-pc-linux-gnu/dist/bin/libnssutil3.so symlink
relative vs. absolute?
When I follow these instructions [1] to build Firefox, I get the
following error:

> $ ./mach run
> [...]
> XPCOMGlueLoad error for file
.../mozilla-central/obj-x86_64-pc-linux-gnu/dist/bin/libnssutil3.so:
> .../mozilla-central/obj-x86_64-pc-linux-gnu/dist/bin/libnssutil3.so:
cannot open shared object file: No such file or directory
> $

mozilla-central/obj-x86_64-pc-linux-gnu/dist/bin/libnssutil3.so is a
symlink to
mozilla-central/obj-x86_64-pc-linux-gnu/dist/lib/libnssutil3.so, but the
symlink is absolute, so if I move the source tree to another path, I get
the error above.
Could these symlinks be made relative vs. absolute?

[1]
developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/Build_Instructions/Simple_Firefox_build

Jack Bates

unread,
Oct 17, 2016, 9:10:41 AM10/17/16
to dev-b...@lists.mozilla.org

Gregory Szorc

unread,
Oct 17, 2016, 2:02:29 PM10/17/16
to Jack Bates, dev-builds
On Sat, Oct 15, 2016 at 1:28 PM, Jack Bates <tzm...@nottheoilrig.com> wrote:
What do you think about making the mozilla-central/obj-x86_64-pc-linux-gnu/dist/bin/libnssutil3.so symlink relative vs. absolute?
When I follow these instructions [1] to build Firefox, I get the following error:

 > $ ./mach run
 > [...]
 > XPCOMGlueLoad error for file .../mozilla-central/obj-x86_64-pc-linux-gnu/dist/bin/libnssutil3.so:
 > .../mozilla-central/obj-x86_64-pc-linux-gnu/dist/bin/libnssutil3.so: cannot open shared object file: No such file or directory
 > $

mozilla-central/obj-x86_64-pc-linux-gnu/dist/bin/libnssutil3.so is a symlink to mozilla-central/obj-x86_64-pc-linux-gnu/dist/lib/libnssutil3.so, but the symlink is absolute, so if I move the source tree to another path, I get the error above.
Could these symlinks be made relative vs. absolute?

They probably could be. But it is a lot of work and isn't a high priority since very few people bring up this issue.

Jack Bates

unread,
Oct 24, 2016, 5:41:44 PM10/24/16
to Gregory Szorc, dev-builds
Here's a rough patch for turning the absolute symlinks into relative
ones. It works on my machine and resolves the issue above.
Would you be willing to take a look?
Are there any larger issues that I haven't considered?
If not, would you be willing to help me polish it into something that
could be accepted?

> diff -r c845bfd0accb config/nsinstall.c
> --- a/config/nsinstall.c Mon Oct 24 16:55:47 2016 +0200
> +++ b/config/nsinstall.c Mon Oct 24 13:26:17 2016 -0700
> @@ -263,13 +263,13 @@
> {
> int onlydir, dodir, dolink, dorelsymlink, dotimes, opt, len, lplen, tdlen, bnlen, exists;
> mode_t mode = 0755;
> - char *linkprefix, *owner, *group, *cp, *cwd, *todir, *toname, *name, *base, *linkname, buf[BUFSIZ];
> + char *linkprefix, *owner, *group, *cp, *cwd, *todir, *toname, *name, *base, *linkname, *absolute, buf[BUFSIZ];
> uid_t uid;
> gid_t gid;
> struct stat sb, tosb, fromsb;
>
> program = argv[0];
> - cwd = linkname = linkprefix = owner = group = 0;
> + cwd = linkname = absolute = linkprefix = owner = group = 0;
> onlydir = dodir = dolink = dorelsymlink = dotimes = lplen = 0;
>
> while ((opt = getopt(argc, argv, "C:DdlL:Rm:o:g:t")) != EOF) {
> @@ -379,33 +379,33 @@
> if (access(name, R_OK) != 0) {
> fail("cannot access %s", name);
> }
> - if (*name == '/') {
> - /* source is absolute pathname, link to it directly */
> - linkname = 0;
> - } else {
> if (linkprefix) {
> /* -L prefixes names with a $cwd arg. */
> len += lplen + 1;
> linkname = xmalloc((unsigned int)(len + 1));
> sprintf(linkname, "%s/%s", linkprefix, name);
> } else if (dorelsymlink) {
> + if (*name != '/') {
> + absolute = xmalloc((unsigned int)(strlen(cwd) + 1 + len + 1));
> + sprintf(absolute, "%s/%s", cwd, name);
> + name = absolute;
> + }
> +
> /* Symlink the relative path from todir to source name. */
> linkname = xmalloc(PATH_MAX);
>
> - if (*todir == '/') {
> /* todir is absolute: skip over common prefix. */
> - lplen = relatepaths(todir, cwd, linkname);
> - strcpy(linkname + lplen, name);
> - } else {
> - /* todir is named by a relative path: reverse it. */
> - reversepath(todir, name, len, linkname);
> - xchdir(cwd);
> + len = relatepaths(todir, name, linkname);
> + if (len > 0) {
> + linkname[--len] = '\0';
> }
>
> - len = strlen(linkname);
> + if (absolute) {
> + free(absolute);
> + absolute = 0;
> + }
> }
> name = linkname;
> - }
>
> /* Check for a pre-existing symlink with identical content. */
> if (exists && (!S_ISLNK(tosb.st_mode) ||
> diff -r c845bfd0accb python/mozbuild/mozbuild/jar.py
> --- a/python/mozbuild/mozbuild/jar.py Mon Oct 24 16:55:47 2016 +0200
> +++ b/python/mozbuild/mozbuild/jar.py Mon Oct 24 13:26:17 2016 -0700
> @@ -545,6 +545,7 @@
> if e.errno != errno.ENOENT:
> raise
> if sys.platform != 'win32':
> + src = os.path.relpath(src, os.path.dirname(out))
> os.symlink(src, out)
> else:
> # On Win32, use ctypes to create a hardlink
> diff -r c845bfd0accb python/mozbuild/mozpack/files.py
> --- a/python/mozbuild/mozpack/files.py Mon Oct 24 16:55:47 2016 +0200
> +++ b/python/mozbuild/mozpack/files.py Mon Oct 24 13:26:17 2016 -0700
> @@ -323,23 +323,25 @@
> if ose.errno != errno.ENOENT:
> raise
>
> + src = os.path.relpath(self.path, os.path.dirname(dest))
> +
> # If the dest is a symlink pointing to us, we have nothing to do.
> # If it's the wrong symlink, the filesystem must support symlinks,
> # so we replace with a proper symlink.
> if st and stat.S_ISLNK(st.st_mode):
> link = os.readlink(dest)
> - if link == self.path:
> + if link == src:
> return False
>
> os.remove(dest)
> - os.symlink(self.path, dest)
> + os.symlink(src, dest)
> return True
>
> # If the destination doesn't exist, we try to create a symlink. If that
> # fails, we fall back to copy code.
> if not st:
> try:
> - os.symlink(self.path, dest)
> + os.symlink(src, dest)
> return True
> except OSError:
> return File.copy(self, dest, skip_if_older=skip_if_older)
> @@ -362,7 +364,7 @@
>
> temp_dest = os.path.join(os.path.dirname(dest), str(uuid.uuid4()))
> try:
> - os.symlink(self.path, temp_dest)
> + os.symlink(src, temp_dest)
> # TODO Figure out exactly how symlink creation fails and only trap
> # that.
> except EnvironmentError:

Jack Bates

unread,
Nov 10, 2016, 7:18:01 PM11/10/16
to dev-b...@lists.mozilla.org
To move this forward, I submitted a review request [1] and picked gps as
the reviewer. If it shouldn't move forward, or there's a better choice
of reviewer, just let me know.

[1] https://bugzilla.mozilla.org/show_bug.cgi?id=1316735

Andreas Tolfsen

unread,
Nov 10, 2016, 7:27:22 PM11/10/16
to dev-b...@lists.mozilla.org, Jack Bates
Jack Bates <tzm...@nottheoilrig.com> writes:

> To move this forward, I submitted a review request [1] and picked gps
> as the reviewer. If it shouldn't move forward, or there's a better
> choice of reviewer, just let me know.

For what it’s worth: Thank you for addressing this! I ran into issues
with the absolute symlinks a while back when I tried mounting a build
directory from the host on a Linux container to run some tests that
required a special environment.
0 new messages