spack/var/spack/repos/builtin/packages/tar/package.py
Chris Green c110bcc5af
libintl, iconv, gettext: account for libc provider and externals (#35450)
* libiconv can be provided by libc, so update packages which depend on
  libiconv to require the iconv virtual instead
* Many packages need special consideration when locating iconv depending
  on whether it is provided by libc (no prefix provided) or the libiconv
  package (in that case we want to provide a prefix)
* It was also noticed that when an iconv external was provided, that
  there was interference with linking (this should generally be handled
  by Spack's compiler wrappers and bears further investigation)
* Like iconv, libintl can be provided by libc or another package, namely
  gettext. It is not converted to a provider like libiconv because it
  provides additional routines. The logic is similar to that of iconv
  but instead of checking the provider, we check whether the gettext
  installation includes libintl.
2023-05-02 18:18:30 -07:00

91 lines
3.4 KiB
Python

# Copyright 2013-2023 Lawrence Livermore National Security, LLC and other
# Spack Project Developers. See the top-level COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
import re
from spack.package import *
from spack.util.environment import is_system_path
class Tar(AutotoolsPackage, GNUMirrorPackage):
"""GNU Tar provides the ability to create tar archives, as well as various
other kinds of manipulation."""
homepage = "https://www.gnu.org/software/tar/"
gnu_mirror_path = "tar/tar-1.32.tar.gz"
executables = [r"^tar$"]
tags = ["core-packages"]
version("1.34", sha256="03d908cf5768cfe6b7ad588c921c6ed21acabfb2b79b788d1330453507647aed")
version("1.32", sha256="b59549594d91d84ee00c99cf2541a3330fed3a42c440503326dab767f2fbb96c")
version("1.31", sha256="b471be6cb68fd13c4878297d856aebd50551646f4e3074906b1a74549c40d5a2")
version("1.30", sha256="4725cc2c2f5a274b12b39d1f78b3545ec9ebb06a6e48e8845e1995ac8513b088")
version("1.29", sha256="cae466e6e58c7292355e7080248f244db3a4cf755f33f4fa25ca7f9a7ed09af0")
version("1.28", sha256="6a6b65bac00a127a508533c604d5bf1a3d40f82707d56f20cefd38a05e8237de")
# A saner default than gzip?
variant(
"zip",
default="pigz",
values=("gzip", "pigz"),
description="Default compression program for tar -z",
)
depends_on("iconv")
# Compression
depends_on("gzip", type="run", when="zip=gzip")
depends_on("pigz", type="run", when="zip=pigz")
depends_on("zstd+programs", type="run", when="@1.31:")
depends_on("xz", type="run") # for xz/lzma
depends_on("bzip2", type="run")
patch("tar-pgi.patch", when="@1.29")
patch("config-pgi.patch", when="@:1.29")
patch("se-selinux.patch", when="@:1.29")
patch("argp-pgi.patch", when="@:1.29")
patch("gnutar-configure-xattrs.patch", when="@1.28")
# The NVIDIA compilers do not currently support some GNU builtins.
# Detect this case and use the fallback path.
patch("nvhpc-1.30.patch", when="@1.30:1.32 %nvhpc")
patch("nvhpc-1.34.patch", when="@1.34 %nvhpc")
# Workaround bug where __LONG_WIDTH__ is not defined
patch("nvhpc-long-width.patch", when="@1.34 %nvhpc")
@classmethod
def determine_version(cls, exe):
output = Executable(exe)("--version", output=str, error=str)
match = re.search(r"tar \(GNU tar\) (\S+)", output)
return match.group(1) if match else None
def configure_args(self):
spec = self.spec
# Note: compression programs are passed by abs path,
# so that tar can locate them when invoked without spack load.
args = [
"--with-xz={0}".format(spec["xz"].prefix.bin.xz),
"--with-lzma={0}".format(spec["xz"].prefix.bin.lzma),
"--with-bzip2={0}".format(spec["bzip2"].prefix.bin.bzip2),
]
if spec["iconv"].name == "libc":
args.append("--without-libiconv-prefix")
elif not is_system_path(spec["iconv"].prefix):
args.append("--with-libiconv-prefix={0}".format(spec["iconv"].prefix))
if "^zstd" in spec:
args.append("--with-zstd={0}".format(spec["zstd"].prefix.bin.zstd))
# Choose gzip/pigz
zip = spec.variants["zip"].value
if zip == "gzip":
gzip_path = spec["gzip"].prefix.bin.gzip
elif zip == "pigz":
gzip_path = spec["pigz"].prefix.bin.pigz
args.append("--with-gzip={}".format(gzip_path))
return args