summaryrefslogtreecommitdiff
path: root/var/spack/repos/builtin/packages/hdf-eos2/package.py
blob: f7cad7c7ce728c1a4ca8a9dddb18b16d584b1c2e (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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# 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 sys
from os import chmod

from spack.package import *


class HdfEos2(AutotoolsPackage):
    """HDF-EOS (Hierarchical Data Format - Earth Observing System) is a
    self-describing file format based upon HDF for standard data products
    that are derived from EOS missions.  HDF-EOS2 is based upon HDF4.
    """

    homepage = "https://hdfeos.org"
    # The download URLs are messing, and include sha256 checksum.
    # This is just a template.  See version_list and url_for_version below
    # Template for url_for_version. 0 is sha256 checksum, 1 is filename
    url = "https://git.earthdata.nasa.gov/rest/git-lfs/storage/DAS/hdfeos/{0}?response-content-disposition=attachment%3B%20filename%3D%22{1}%22%3B%20filename*%3Dutf-8%27%27{1}"

    maintainers("climbfuji")

    # Crazy URL scheme, differing with each version, and including the
    # sha256 checksum in the URL.  Yuck
    # The data in version_list is used to generate versions and urls
    # In basename expansions, 0 is raw version,
    # 1 is for version with dots => underscores
    version_list = [
        {
            "version": "2.20v1.00",
            "sha256": "cb0f900d2732ab01e51284d6c9e90d0e852d61bba9bce3b43af0430ab5414903",
            "basename": "HDF-EOS{0}.tar.Z",
        },
        {
            "version": "2.19b",
            "sha256": "a69993508dbf5fa6120bac3c906ab26f1ad277348dfc2c891305023cfdf5dc9d",
            "basename": "hdfeos{1}.zip",
        },
    ]

    for vrec in version_list:
        ver = vrec["version"]
        sha256 = vrec["sha256"]
        version(ver, sha256=sha256)

    variant(
        "shared", default=True, description="Build shared libraries (can be used with +static)"
    )
    variant(
        "static", default=True, description="Build static libraries (can be used with +shared)"
    )

    conflicts("~static", when="~shared", msg="At least one of +static or +shared must be set")

    # Build dependencies
    depends_on("hdf")
    # Because hdf always depends on zlib and jpeg in spack, the tests below in configure_args
    # (if "jpeg" in self.spec:) always returns true and hdf-eos2 wants zlib and jpeg, too.
    depends_on("zlib-api")
    depends_on("jpeg")
    depends_on("szip", when="^hdf +szip")

    # The standard Makefile.am, etc. add a --single_module flag to LDFLAGS
    # to pass to the linker.
    # That appears to be only recognized by the Darwin linker, remove it
    # if we are not running on darwin/
    if sys.platform != "darwin":
        patch("hdf-eos2.nondarwin-no-single_module.patch")

    def url_for_version(self, version):
        vrec = [x for x in self.version_list if x["version"] == version.dotted.string]
        if vrec:
            fname = vrec[0]["basename"].format(version.dotted, version.underscored)
            sha256 = vrec[0]["sha256"]
            myurl = self.url.format(sha256, fname)
            return myurl
        else:
            sys.exit(
                "ERROR: cannot generate URL for version {0};"
                "version/checksum not found in version_list".format(version)
            )

    # spack patches the configure file unless autoconf is run,
    # and this fails because configure has the wrong permissions (644)
    @run_before("configure")
    def fix_permissions(self):
        if not self.force_autoreconf:
            chmod(join_path(self.stage.source_path, "configure"), 0o755)

    def flag_handler(self, name, flags):
        if self.spec.compiler.name == "apple-clang":
            if name == "cflags":
                flags.append("-Wno-error=implicit-function-declaration")

        return flags, None, None

    def configure_args(self):
        extra_args = []

        # Package really wants h4cc to be used
        extra_args.append("CC={0}/bin/h4cc -Df2cFortran".format(self.spec["hdf"].prefix))

        # We always build PIC code
        extra_args.append("--with-pic")
        extra_args.append("--enable-install_include")

        # Set shared/static appropriately
        extra_args.extend(self.enable_or_disable("shared"))
        extra_args.extend(self.enable_or_disable("static"))

        # Provide config args for dependencies
        extra_args.append("--with-hdf4={0}".format(self.spec["hdf"].prefix))
        if "jpeg" in self.spec:
            extra_args.append("--with-jpeg={0}".format(self.spec["jpeg"].prefix))
        if "szip" in self.spec:
            extra_args.append("--with-szlib={0}".format(self.spec["szip"].prefix))
        if "zlib" in self.spec:
            extra_args.append("--with-zlib={0}".format(self.spec["zlib-api"].prefix))

        return extra_args