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
This commit is contained in:
Greg Becker 2019-11-04 23:03:35 -06:00 committed by Todd Gamblin
parent e433a5dc0b
commit 99dfff4475
No known key found for this signature in database
GPG key ID: 66B24B9050FDD0B8
3 changed files with 37 additions and 17 deletions

View file

@ -521,8 +521,6 @@ def relocate_package(workdir, spec, allow_root):
old_prefix = str(buildinfo.get('spackprefix', old_prefix = str(buildinfo.get('spackprefix',
'/not/in/buildinfo/dictionary')) '/not/in/buildinfo/dictionary'))
rel = buildinfo.get('relative_rpaths', False) rel = buildinfo.get('relative_rpaths', False)
if rel:
return
tty.msg("Relocating package from", tty.msg("Relocating package from",
"%s to %s." % (old_path, new_path)) "%s to %s." % (old_path, new_path))

View file

@ -378,17 +378,21 @@ def replace_prefix_text(path_name, old_dir, new_dir):
Replace old install prefix with new install prefix Replace old install prefix with new install prefix
in text files using utf-8 encoded strings. 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: with open(path_name, 'rb+') as f:
data = f.read() data = f.read()
f.seek(0) f.seek(0)
pat = re.compile(old_dir.encode('utf-8')) # Replace old_dir with new_dir if it appears at the beginning of a path
if not pat.search(data): # Negative lookbehind for a character legal in a path
return # Then a match group for any characters legal in a compiler flag
ndata = pat.sub(replace, data) # 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.write(ndata)
f.truncate() f.truncate()

View file

@ -165,12 +165,13 @@ def install_cpanm(self):
make() make()
make('install') 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 """Set PATH and PERL5LIB to include the extension and
any other perl extensions it depends on, any other perl extensions it depends on,
assuming they were installed with INSTALL_BASE defined.""" assuming they were installed with INSTALL_BASE defined."""
perl_lib_dirs = [] perl_lib_dirs = [join_path(self.spec.prefix.lib,
perl_bin_dirs = [] str(self.spec.version))]
perl_bin_dirs = [self.spec.prefix.bin]
for d in dependent_spec.traverse( for d in dependent_spec.traverse(
deptype=('build', 'run'), deptype_query='run'): deptype=('build', 'run'), deptype_query='run'):
if d.package.extends(self.spec): if d.package.extends(self.spec):
@ -178,12 +179,29 @@ def setup_dependent_environment(self, spack_env, run_env, dependent_spec):
perl_bin_dirs.append(d.prefix.bin) perl_bin_dirs.append(d.prefix.bin)
if perl_bin_dirs: if perl_bin_dirs:
perl_bin_path = ':'.join(perl_bin_dirs) perl_bin_path = ':'.join(perl_bin_dirs)
spack_env.prepend_path('PATH', perl_bin_path) env.prepend_path('PATH', perl_bin_path)
run_env.prepend_path('PATH', perl_bin_path)
if perl_lib_dirs: if perl_lib_dirs:
perl_lib_path = ':'.join(perl_lib_dirs) perl_lib_path = ':'.join(perl_lib_dirs)
spack_env.prepend_path('PERL5LIB', perl_lib_path) env.prepend_path('PERL5LIB', perl_lib_path)
run_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): def setup_dependent_package(self, module, dependent_spec):
"""Called before perl modules' install() methods. """Called before perl modules' install() methods.