summaryrefslogtreecommitdiff
path: root/var/spack/repos/builtin/packages/stata/package.py
blob: e4292590e10f7b2108805079f58834e216e85893 (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
# 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 os
from datetime import datetime

from spack.package import *


class Stata(Package):
    """STATA is a general-purpose statistical software package developed
    by StataCorp."""

    # Known limitations of this installer:
    # * This really only installs the command line version of the program. To
    #   install GUI support there are extra packages needed that I can't easily
    #   test right now (should be installable via yum as a temp workaround):
    #   libgtk-x11-2.0.so libgdk-x11-2.0.so libatk-1.0.so libgdk_pixbuf-2.0.so
    #   Those libraries appear to be provided by: pango gdk-pixbuf2 gtk2
    #
    # * There are two popular environment variables that can be set, but vary from
    #   place to place, so future enhancement maybe to support STATATMP and TMPDIR.
    #
    # * I haven't tested any installer version but 15.

    homepage = "https://www.stata.com/"
    manual_download = True
    # url      = "stata"

    version("16", sha256="a13a6a92558eeb3c6cb3013c458a6777e54c21af43599df6b0a924f5f5c2d5d2")
    version("15", sha256="2486f4c7db1e7b453004c7bd3f8da40ba1e30be150613065c7b82b1915259016")

    depends_on("libpng@1.2.57", when="@15", type="run")
    depends_on("libpng@1.6.0:1.6", when="@16", type="run")

    # STATA is downloaded from user/pass protected ftp as Stata15Linux64.tar.gz
    def url_for_version(self, version):
        return "file://{0}/Stata{1}Linux64.tar.gz".format(os.getcwd(), version)

    # STATA is simple and needs really just the PATH set.
    def setup_run_environment(self, env):
        env.prepend_path("PATH", self.prefix)
        env.prepend_path("LD_LIBRARY_PATH", self.spec["libpng"].prefix.lib)

    # Extracting the file provides the following:
    # ./unix/
    # ./unix/linux64/
    # ./unix/linux64/docs.taz
    # ./unix/linux64/setrwxp
    # ./unix/linux64/ado.taz
    # ./unix/linux64/inst2
    # ./unix/linux64/base.taz
    # ./unix/linux64/bins.taz
    # ./license.pdf
    # ./stata15.ico
    # ./install
    #
    # The installation scripts aren't really necessary:
    # ./install is a shell script that sets up the environment.
    # ./unix/linux64/setrwxp is a shell script that ensures permissions.
    # ./unix/linux64/inst2 is the actual installation script.
    #
    # 1. There is a markfile that is the version number. Stata uses this for
    # for doing version checks/updates.
    # echo $(date) > installed.150
    #
    # 2. Then it extracts the tar.gz files: ado.taz base.taz bins.taz docs.taz
    #
    # 3. It copies installer scripts to root directory
    # cp ./unix/linux64/setrwxp setrwxp
    # cp ./unix/linux64/inst2 inst2
    #
    # 4. Then it checks for proper permissions:
    # chmod 750 setrwxp inst2
    # ./setrwxp now
    #
    # 5. The last step has to be run manually since it is an interactive binary
    # for configuring the license key. Load the module and run:
    # $ stinit

    def install(self, spec, prefix):
        bash = which("bash")
        tar = which("tar")

        res_dir = "unix/linux64/"

        if self.spec.satisfies("@16:"):
            res_dir = "unix/linux64p/"

        # Step 1.
        x = datetime.now()
        with open("installed.150", "w") as fh:
            fh.write(x.strftime("%a %b %d %H:%M:%S %Z %Y"))

        # Step 2.
        instlist = ["ado.taz", "base.taz", "bins.taz", "docs.taz"]
        for instfile in instlist:
            tar("-x", "-z", "-f", res_dir + instfile)

        # Step 3.
        install(res_dir + "setrwxp", "setrwxp")
        install(res_dir + "inst2", "inst2")

        # Step 4. Since the install script calls out specific permissions and
        # could change in the future (or old versions) I thought it best to
        # just use it.
        bash("./setrwxp", "now")

        # Install should now be good to copy into the installation directory.
        install_tree(".", prefix)