summaryrefslogtreecommitdiff
path: root/var/spack/repos/builtin/packages/evtgen/package.py
blob: a03fd08abdcab555a534b96ee35b4725a0f2ab09 (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
# Copyright 2013-2022 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.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')

    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("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)