From 4ee37c37de98c67e61ad9cba028cfd8d54136d3a Mon Sep 17 00:00:00 2001 From: Paul Ferrell <51765748+Paul-Ferrell@users.noreply.github.com> Date: Thu, 28 Oct 2021 06:34:31 -0600 Subject: 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. --- lib/spack/spack/binary_distribution.py | 10 ++++++++++ lib/spack/spack/test/bindist.py | 10 +++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/binary_distribution.py b/lib/spack/spack/binary_distribution.py index 165ba219b3..0cf254b582 100644 --- a/lib/spack/spack/binary_distribution.py +++ b/lib/spack/spack/binary_distribution.py @@ -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) diff --git a/lib/spack/spack/test/bindist.py b/lib/spack/spack/test/bindist.py index dbcf0d8ea6..8dc0cb68d6 100644 --- a/lib/spack/spack/test/bindist.py +++ b/lib/spack/spack/test/bindist.py @@ -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) -- cgit v1.2.3-60-g2f50