summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/spack/spack/audit.py6
-rw-r--r--lib/spack/spack/directives.py71
-rw-r--r--lib/spack/spack/package_base.py2
-rw-r--r--lib/spack/spack/resource.py5
4 files changed, 43 insertions, 41 deletions
diff --git a/lib/spack/spack/audit.py b/lib/spack/spack/audit.py
index 7e6b87c987..77e85172d7 100644
--- a/lib/spack/spack/audit.py
+++ b/lib/spack/spack/audit.py
@@ -693,19 +693,19 @@ def _ensure_all_packages_use_sha256_checksums(pkgs, error_cls):
return h, True
return None, False
- error_msg = "Package '{}' does not use sha256 checksum".format(pkg_name)
+ error_msg = f"Package '{pkg_name}' does not use sha256 checksum"
details = []
for v, args in pkg.versions.items():
fetcher = spack.fetch_strategy.for_package_version(pkg, v)
digest, is_bad = invalid_sha256_digest(fetcher)
if is_bad:
- details.append("{}@{} uses {}".format(pkg_name, v, digest))
+ details.append(f"{pkg_name}@{v} uses {digest}")
for _, resources in pkg.resources.items():
for resource in resources:
digest, is_bad = invalid_sha256_digest(resource.fetcher)
if is_bad:
- details.append("Resource in '{}' uses {}".format(pkg_name, digest))
+ details.append(f"Resource in '{pkg_name}' uses {digest}")
if details:
errors.append(error_cls(error_msg, details))
diff --git a/lib/spack/spack/directives.py b/lib/spack/spack/directives.py
index 87e68da002..2f152f813d 100644
--- a/lib/spack/spack/directives.py
+++ b/lib/spack/spack/directives.py
@@ -40,6 +40,7 @@ from typing import Any, Callable, List, Optional, Tuple, Type, Union
import llnl.util.tty.color
import spack.deptypes as dt
+import spack.fetch_strategy
import spack.package_base
import spack.patch
import spack.spec
@@ -47,7 +48,6 @@ import spack.util.crypto
import spack.variant
from spack.dependency import Dependency
from spack.directives_meta import DirectiveError, DirectiveMeta
-from spack.fetch_strategy import from_kwargs
from spack.resource import Resource
from spack.version import (
GitVersion,
@@ -740,58 +740,55 @@ def variant(
@directive("resources")
-def resource(**kwargs):
- """Define an external resource to be fetched and staged when building the
- package. Based on the keywords present in the dictionary the appropriate
- FetchStrategy will be used for the resource. Resources are fetched and
- staged in their own folder inside spack stage area, and then moved into
- the stage area of the package that needs them.
-
- List of recognized keywords:
-
- * 'when' : (optional) represents the condition upon which the resource is
- needed
- * 'destination' : (optional) path where to move the resource. This path
- must be relative to the main package stage area.
- * 'placement' : (optional) gives the possibility to fine tune how the
- resource is moved into the main package stage area.
+def resource(
+ *,
+ name: Optional[str] = None,
+ destination: str = "",
+ placement: Optional[str] = None,
+ when: WhenType = None,
+ # additional kwargs are as for `version()`
+ **kwargs,
+):
+ """Define an external resource to be fetched and staged when building the package.
+ Based on the keywords present in the dictionary the appropriate FetchStrategy will
+ be used for the resource. Resources are fetched and staged in their own folder
+ inside spack stage area, and then moved into the stage area of the package that
+ needs them.
+
+ Keyword Arguments:
+ name: name for the resource
+ when: condition defining when the resource is needed
+ destination: path, relative to the package stage area, to which resource should be moved
+ placement: optionally rename the expanded resource inside the destination directory
+
"""
def _execute_resource(pkg):
- when = kwargs.get("when")
when_spec = _make_when_spec(when)
if not when_spec:
return
- destination = kwargs.get("destination", "")
- placement = kwargs.get("placement", None)
-
# Check if the path is relative
if os.path.isabs(destination):
- message = (
- "The destination keyword of a resource directive " "can't be an absolute path.\n"
- )
- message += "\tdestination : '{dest}\n'".format(dest=destination)
- raise RuntimeError(message)
+ msg = "The destination keyword of a resource directive can't be an absolute path.\n"
+ msg += f"\tdestination : '{destination}\n'"
+ raise RuntimeError(msg)
# Check if the path falls within the main package stage area
test_path = "stage_folder_root"
- normalized_destination = os.path.normpath(
- os.path.join(test_path, destination)
- ) # Normalized absolute path
+
+ # Normalized absolute path
+ normalized_destination = os.path.normpath(os.path.join(test_path, destination))
if test_path not in normalized_destination:
- message = (
- "The destination folder of a resource must fall "
- "within the main package stage directory.\n"
- )
- message += "\tdestination : '{dest}'\n".format(dest=destination)
- raise RuntimeError(message)
+ msg = "Destination of a resource must be within the package stage directory.\n"
+ msg += f"\tdestination : '{destination}'\n"
+ raise RuntimeError(msg)
resources = pkg.resources.setdefault(when_spec, [])
- name = kwargs.get("name")
- fetcher = from_kwargs(**kwargs)
- resources.append(Resource(name, fetcher, destination, placement))
+ resources.append(
+ Resource(name, spack.fetch_strategy.from_kwargs(**kwargs), destination, placement)
+ )
return _execute_resource
diff --git a/lib/spack/spack/package_base.py b/lib/spack/spack/package_base.py
index cfd2803805..85f23c4b8e 100644
--- a/lib/spack/spack/package_base.py
+++ b/lib/spack/spack/package_base.py
@@ -54,6 +54,7 @@ import spack.util.web
import spack.variant
from spack.error import InstallError, NoURLError, PackageError
from spack.filesystem_view import YamlFilesystemView
+from spack.resource import Resource
from spack.solver.version_order import concretization_version_order
from spack.stage import DevelopStage, ResourceStage, Stage, StageComposite, compute_stage_name
from spack.util.package_hash import package_hash
@@ -585,6 +586,7 @@ class PackageBase(WindowsRPath, PackageViewMixin, metaclass=PackageMeta):
# Declare versions dictionary as placeholder for values.
# This allows analysis tools to correctly interpret the class attributes.
versions: dict
+ resources: Dict[spack.spec.Spec, List[Resource]]
dependencies: Dict[spack.spec.Spec, Dict[str, spack.dependency.Dependency]]
conflicts: Dict[spack.spec.Spec, List[Tuple[spack.spec.Spec, Optional[str]]]]
requirements: Dict[
diff --git a/lib/spack/spack/resource.py b/lib/spack/spack/resource.py
index ba855cbb63..5f222fe016 100644
--- a/lib/spack/spack/resource.py
+++ b/lib/spack/spack/resource.py
@@ -12,7 +12,10 @@ package to enable optional features.
class Resource:
- """Represents an optional resource to be fetched by a package.
+ """Represents any resource to be fetched by a package.
+
+ This includes the main tarball or source archive, as well as extra archives defined
+ by the resource() directive.
Aggregates a name, a fetcher, a destination and a placement.
"""