summaryrefslogtreecommitdiff
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
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
-rw-r--r--lib/spack/spack/binary_distribution.py2
-rw-r--r--lib/spack/spack/relocate.py20
-rw-r--r--var/spack/repos/builtin/packages/perl/package.py32
3 files changed, 37 insertions, 17 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()
diff --git a/var/spack/repos/builtin/packages/perl/package.py b/var/spack/repos/builtin/packages/perl/package.py
index 45239576da..5df5692895 100644
--- a/var/spack/repos/builtin/packages/perl/package.py
+++ b/var/spack/repos/builtin/packages/perl/package.py
@@ -165,12 +165,13 @@ class Perl(Package): # Perl doesn't use Autotools, it should subclass Package
make()
make('install')
- def setup_dependent_environment(self, spack_env, run_env, dependent_spec):
+ def setup_dependent_build_environment(self, env, dependent_spec):
"""Set PATH and PERL5LIB to include the extension and
any other perl extensions it depends on,
assuming they were installed with INSTALL_BASE defined."""
- perl_lib_dirs = []
- perl_bin_dirs = []
+ perl_lib_dirs = [join_path(self.spec.prefix.lib,
+ str(self.spec.version))]
+ perl_bin_dirs = [self.spec.prefix.bin]
for d in dependent_spec.traverse(
deptype=('build', 'run'), deptype_query='run'):
if d.package.extends(self.spec):
@@ -178,12 +179,29 @@ class Perl(Package): # Perl doesn't use Autotools, it should subclass Package
perl_bin_dirs.append(d.prefix.bin)
if perl_bin_dirs:
perl_bin_path = ':'.join(perl_bin_dirs)
- spack_env.prepend_path('PATH', perl_bin_path)
- run_env.prepend_path('PATH', perl_bin_path)
+ env.prepend_path('PATH', perl_bin_path)
if perl_lib_dirs:
perl_lib_path = ':'.join(perl_lib_dirs)
- spack_env.prepend_path('PERL5LIB', perl_lib_path)
- run_env.prepend_path('PERL5LIB', perl_lib_path)
+ env.prepend_path('PERL5LIB', perl_lib_path)
+
+ def setup_dependent_run_environment(self, env, dependent_spec):
+ """Set PATH and PERL5LIB to include the extension and
+ any other perl extensions it depends on,
+ assuming they were installed with INSTALL_BASE defined."""
+ perl_lib_dirs = [join_path(self.spec.prefix.lib,
+ str(self.spec.version))]
+ perl_bin_dirs = [self.spec.prefix.bin]
+ for d in dependent_spec.traverse(
+ deptype=('run',), deptype_query='run'):
+ if d.package.extends(self.spec):
+ perl_lib_dirs.append(d.prefix.lib.perl5)
+ perl_bin_dirs.append(d.prefix.bin)
+ if perl_bin_dirs:
+ perl_bin_path = ':'.join(perl_bin_dirs)
+ env.prepend_path('PATH', perl_bin_path)
+ if perl_lib_dirs:
+ perl_lib_path = ':'.join(perl_lib_dirs)
+ env.prepend_path('PERL5LIB', perl_lib_path)
def setup_dependent_package(self, module, dependent_spec):
"""Called before perl modules' install() methods.