summaryrefslogtreecommitdiff
path: root/var/spack/repos/builtin/packages/evtgen/package.py
blob: 2c4d3d9a68e9948ce68940ee10de8df195eb7a5b (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
124
125
126
127
128
129
130
131
# 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)

from spack.package import *


class Evtgen(CMakePackage):
    """EvtGen is a Monte Carlo event generator that simulates
    the decays of heavy flavour particles, primarily B and D mesons."""

    homepage = "https://evtgen.hepforge.org/"
    url = "https://evtgen.hepforge.org/downloads?f=EvtGen-02.00.00.tar.gz"

    tags = ["hep"]

    maintainers("vvolkl")

    version("02.02.00", sha256="0c626e51cb17e799ad0ffd0beea5cb94d7ac8a5f8777b746aa1944dd26071ecf")
    version("02.00.00", sha256="02372308e1261b8369d10538a3aa65fe60728ab343fcb64b224dac7313deb719")
    # switched to cmake in 02.00.00
    version(
        "01.07.00",
        sha256="2648f1e2be5f11568d589d2079f22f589c283a2960390bbdb8d9d7f71bc9c014",
        deprecated=True,
    )

    variant("pythia8", default=True, description="Build with pythia8")
    variant("tauola", default=False, description="Build with tauola")
    variant("photos", default=False, description="Build with photos")
    variant("hepmc3", default=False, description="Link with hepmc3 (instead of hepmc)")

    patch("g2c.patch", when="@01.07.00")
    patch("evtgen-2.0.0.patch", when="@02.00.00 ^pythia8@8.304:")

    depends_on("hepmc", when="~hepmc3")
    depends_on("hepmc3", when="+hepmc3")
    depends_on("pythia8", when="+pythia8")
    depends_on("tauola~hepmc3", when="+tauola~hepmc3")
    depends_on("photos~hepmc3", when="+photos~hepmc3")
    depends_on("tauola+hepmc3", when="+tauola+hepmc3")
    depends_on("photos+hepmc3", when="+photos+hepmc3")

    conflicts(
        "^pythia8+evtgen",
        when="+pythia8",
        msg="Building pythia with evtgen bindings and "
        "evtgen with pythia bindings results in a circular dependency "
        "that cannot be resolved at the moment! "
        "Use evtgen+pythia8^pythia8~evtgen.",
    )
    conflicts("+hepmc3", when="@:01", msg="hepmc3 support was added in 02.00.00")

    @property
    def root_cmakelists_dir(self):
        # deal with inconsistent intermediate folders of tarballs
        # 02.00.00 only has 'R02-00-00'
        # but 02.02.00 has 'EvtGen/R02-02-00'
        if self.spec.satisfies("@02.02.00:"):
            return "R" + str(self.version).replace(".", "-")
        else:
            return ""

    def cmake_args(self):
        args = []

        args.append(self.define_from_variant("EVTGEN_PYTHIA", "pythia8"))
        args.append(self.define_from_variant("EVTGEN_TAUOLA", "tauola"))
        args.append(self.define_from_variant("EVTGEN_PHOTOS", "photos"))
        args.append(self.define_from_variant("EVTGEN_HEPMC3", "hepmc3"))

        return args

    def patch(self):
        # gcc on MacOS doesn't recognize `-shared`, should use `-dynamiclib`;
        # the `-undefined dynamic_lookup` flag enables weak linking on Mac
        # Patch taken from CMS recipe:
        # https://github.com/cms-sw/cmsdist/blob/IB/CMSSW_12_1_X/master/evtgen.spec#L48
        if not self.spec.satisfies("%gcc platform=darwin"):
            return

        filter_file("-shared", "-dynamiclib -undefined dynamic_lookup", "make.inc")

    # Taken from AutotoolsPackage
    def configure(self, spec, prefix):
        """Runs configure with the arguments specified in
        :py:meth:`~.AutotoolsPackage.configure_args`
        and an appropriately set prefix.
        """
        options = getattr(self, "configure_flag_args", [])
        options += ["--prefix={0}".format(prefix)]
        options += self.configure_args()

        with working_dir(self.build_directory, create=True):
            inspect.getmodule(self).configure(*options)

    @when("@:01")
    def configure_args(self):
        args = []

        args.append("--hepmcdir=%s" % self.spec["hepmc"].prefix)
        if "+pythia8" in self.spec:
            args.append("--pythiadir=%s" % self.spec["pythia8"].prefix)
        if "+photos" in self.spec:
            args.append("--photosdir=%s" % self.spec["photos"].prefix)
        if "+tauola" in self.spec:
            args.append("--tauoladir=%s" % self.spec["tauola"].prefix)

        return args

    @when("@:01")
    def cmake(self, spec, prefix):
        pass

    @when("@:01")
    def build(self, spec, prefix):
        self.configure(spec, prefix)
        # avoid parallel compilation errors
        # due to libext_shared depending on lib_shared
        with working_dir(self.build_directory):
            make("lib_shared")
            make("all")

    @when("@:01")
    def install(self, spec, prefix):
        with working_dir(self.build_directory):
            make("install")

    def setup_run_environment(self, env):
        env.set("EVTGEN", self.prefix.share)