buildcaches: fix directory link relocation (#26948)

When relocating a binary distribution, Spack only checks files to see
if they are a link that needs to be relocated. Directories can be
such links as well, however, and need to undergo the same checks
and potential relocation.
This commit is contained in:
Paul Ferrell
2021-10-28 06:34:31 -06:00
committed by GitHub
parent 890095e876
commit 4ee37c37de
3 changed files with 62 additions and 3 deletions

View File

@@ -608,6 +608,16 @@ def get_buildfile_manifest(spec):
# Used by make_package_relative to determine binaries to change.
for root, dirs, files in os.walk(spec.prefix, topdown=True):
dirs[:] = [d for d in dirs if d not in blacklist]
# Directories may need to be relocated too.
for directory in dirs:
dir_path_name = os.path.join(root, directory)
rel_path_name = os.path.relpath(dir_path_name, spec.prefix)
if os.path.islink(dir_path_name):
link = os.readlink(dir_path_name)
if os.path.isabs(link) and link.startswith(spack.store.layout.root):
data['link_to_relocate'].append(rel_path_name)
for filename in files:
path_name = os.path.join(root, filename)
m_type, m_subtype = relocate.mime_type(path_name)

View File

@@ -200,12 +200,14 @@ def test_default_rpaths_create_install_default_layout(mirror_dir):
into the default directory layout scheme.
"""
gspec, cspec = Spec('garply').concretized(), Spec('corge').concretized()
sy_spec = Spec('symly').concretized()
# Install 'corge' without using a cache
install_cmd('--no-cache', cspec.name)
install_cmd('--no-cache', sy_spec.name)
# Create a buildache
buildcache_cmd('create', '-au', '-d', mirror_dir, cspec.name)
buildcache_cmd('create', '-au', '-d', mirror_dir, cspec.name, sy_spec.name)
# Test force overwrite create buildcache (-f option)
buildcache_cmd('create', '-auf', '-d', mirror_dir, cspec.name)
@@ -219,7 +221,7 @@ def test_default_rpaths_create_install_default_layout(mirror_dir):
uninstall_cmd('-y', '--dependents', gspec.name)
# Test installing from build caches
buildcache_cmd('install', '-au', cspec.name)
buildcache_cmd('install', '-au', cspec.name, sy_spec.name)
# This gives warning that spec is already installed
buildcache_cmd('install', '-au', cspec.name)
@@ -247,10 +249,12 @@ def test_default_rpaths_install_nondefault_layout(mirror_dir):
into the non-default directory layout scheme.
"""
cspec = Spec('corge').concretized()
# This guy tests for symlink relocation
sy_spec = Spec('symly').concretized()
# Install some packages with dependent packages
# test install in non-default install path scheme
buildcache_cmd('install', '-au', cspec.name)
buildcache_cmd('install', '-au', cspec.name, sy_spec.name)
# Test force install in non-default install path scheme
buildcache_cmd('install', '-auf', cspec.name)