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:
parent
e433a5dc0b
commit
99dfff4475
3 changed files with 37 additions and 17 deletions
|
@ -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))
|
||||||
|
|
|
@ -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()
|
||||||
|
|
||||||
|
|
|
@ -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.
|
||||||
|
|
Loading…
Reference in a new issue