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:
		
				
					committed by
					
						
						Todd Gamblin
					
				
			
			
				
	
			
			
			
						parent
						
							edf9548310
						
					
				
				
					commit
					385e41d70b
				
			@@ -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))
 | 
			
		||||
 
 | 
			
		||||
@@ -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()
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -165,12 +165,13 @@ def install_cpanm(self):
 | 
			
		||||
                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 @@ def setup_dependent_environment(self, spack_env, run_env, dependent_spec):
 | 
			
		||||
                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.
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user