summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorGreg Becker <becker33@llnl.gov>2019-11-04 23:03:35 -0600
committerTodd Gamblin <tgamblin@llnl.gov>2019-11-04 22:03:35 -0700
commit385e41d70b6562e19a549f9141697ba12b4e7b6d (patch)
tree9b564b445c49d89af8618fdca0be0c2afa225518 /lib
parentedf9548310b59bf7c52d75f02b619520bba467ad (diff)
downloadspack-385e41d70b6562e19a549f9141697ba12b4e7b6d.tar.gz
spack-385e41d70b6562e19a549f9141697ba12b4e7b6d.tar.bz2
spack-385e41d70b6562e19a549f9141697ba12b4e7b6d.tar.xz
spack-385e41d70b6562e19a549f9141697ba12b4e7b6d.zip
binary distribution: relocate text files properly in relative binaries (#13578)
* Make relative binaries relocate text files properly * rb strings aren't valid in python 2 * move perl to new interface for setup_environment family methods
Diffstat (limited to 'lib')
-rw-r--r--lib/spack/spack/binary_distribution.py2
-rw-r--r--lib/spack/spack/relocate.py20
2 files changed, 12 insertions, 10 deletions
diff --git a/lib/spack/spack/binary_distribution.py b/lib/spack/spack/binary_distribution.py
index eafa1dcdb1..2dcb75860b 100644
--- a/lib/spack/spack/binary_distribution.py
+++ b/lib/spack/spack/binary_distribution.py
@@ -520,8 +520,6 @@ def relocate_package(workdir, spec, allow_root):
old_prefix = str(buildinfo.get('spackprefix',
'/not/in/buildinfo/dictionary'))
rel = buildinfo.get('relative_rpaths', False)
- if rel:
- return
tty.msg("Relocating package from",
"%s to %s." % (old_path, new_path))
diff --git a/lib/spack/spack/relocate.py b/lib/spack/spack/relocate.py
index 8e4350a7b1..9a54be1c64 100644
--- a/lib/spack/spack/relocate.py
+++ b/lib/spack/spack/relocate.py
@@ -360,17 +360,21 @@ def replace_prefix_text(path_name, old_dir, new_dir):
Replace old install prefix with new install prefix
in text files using utf-8 encoded strings.
"""
-
- def replace(match):
- return match.group().replace(old_dir.encode('utf-8'),
- new_dir.encode('utf-8'))
with open(path_name, 'rb+') as f:
data = f.read()
f.seek(0)
- pat = re.compile(old_dir.encode('utf-8'))
- if not pat.search(data):
- return
- ndata = pat.sub(replace, data)
+ # Replace old_dir with new_dir if it appears at the beginning of a path
+ # Negative lookbehind for a character legal in a path
+ # Then a match group for any characters legal in a compiler flag
+ # Then old_dir
+ # Then characters legal in a path
+ # Ensures we only match the old_dir if it's precedeed by a flag or by
+ # characters not legal in a path, but not if it's preceeded by other
+ # components of a path.
+ old_bytes = old_dir.encode('utf-8')
+ pat = b'(?<![\\w\\-_/])([\\w\\-_]*?)%s([\\w\\-_/]*)' % old_bytes
+ repl = b'\\1%s\\2' % new_dir.encode('utf-8')
+ ndata = re.sub(pat, repl, data)
f.write(ndata)
f.truncate()