summaryrefslogtreecommitdiff
path: root/var/spack/repos/builtin/packages/tar/package.py
blob: 566f347d03ef93ceaf972cb1cf73574f4a8473b1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# 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"]

    license("GPL-3.0-or-later")

    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