Source code for spack_repo.builtin.build_systems.gnu
# Copyright Spack Project Developers. See COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
import os.path
from typing import List, Optional
from spack.package import PackageBase, join_url
[docs]
class GNUMirrorPackage(PackageBase):
"""Mixin that takes care of setting url and mirrors for GNU packages."""
#: Path of the package in a GNU mirror
gnu_mirror_path: Optional[str] = None
#: Depth of url spidering to search up the path for new versions
list_depth: int = 0
#: List of GNU mirrors used by Spack
base_mirrors = [
"https://ftpmirror.gnu.org/",
"https://ftp.gnu.org/gnu/",
# Fall back to http if https didn't work (for instance because
# Spack is bootstrapping curl)
"http://ftpmirror.gnu.org/",
]
@property
def urls(self) -> List[str]:
self._ensure_gnu_mirror_path_is_set_or_raise()
# narrow the type for the checker: the call above raises when None
if self.gnu_mirror_path is None:
return []
return [join_url(m, self.gnu_mirror_path, resolve_href=True) for m in self.base_mirrors]
@property
def list_url(self):
if self.gnu_mirror_path is None:
return None
mirror_dir = os.path.dirname(self.gnu_mirror_path)
# Use the canonical ftp.gnu.org mirror for listing; the redirecting
# ftpmirror.gnu.org does not reliably serve directory indexes.
return join_url("https://ftp.gnu.org/gnu/", mirror_dir, resolve_href=True)
def _ensure_gnu_mirror_path_is_set_or_raise(self):
if self.gnu_mirror_path is None:
cls_name = type(self).__name__
msg = "{0} must define a `gnu_mirror_path` attribute [none defined]"
raise AttributeError(msg.format(cls_name))