684 lines
32 KiB
Python
684 lines
32 KiB
Python
# 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 spack.operating_systems.mac_os import macos_version
|
|
from spack.package import *
|
|
from spack.util.environment import is_system_path
|
|
|
|
|
|
class Root(CMakePackage):
|
|
"""ROOT is a data analysis framework."""
|
|
|
|
homepage = "https://root.cern.ch"
|
|
url = "https://root.cern/download/root_v6.16.00.source.tar.gz"
|
|
git = "https://github.com/root-project/root.git"
|
|
|
|
executables = ["^root$", "^root-config$"]
|
|
|
|
tags = ["hep"]
|
|
|
|
maintainers(
|
|
"drbenmorgan", "gartung", "greenc-FNAL", "HadrienG2", "marcmengel", "vitodb", "vvolkl"
|
|
)
|
|
|
|
# ###################### Versions ##########################
|
|
|
|
# Master branch
|
|
version("master", branch="master")
|
|
|
|
# Development version (when more recent than production).
|
|
|
|
# Production version
|
|
version("6.28.06", sha256="af3b673b9aca393a5c9ae1bf86eab2672aaf1841b658c5c6e7a30ab93c586533")
|
|
version("6.28.04", sha256="70f7f86a0cd5e3f2a0befdc59942dd50140d990ab264e8e56c7f17f6bfe9c965")
|
|
version("6.28.02", sha256="6643c07710e68972b00227c68b20b1016fec16f3fba5f44a571fa1ce5bb42faa")
|
|
version("6.28.00", sha256="afa1c5c06d0915411cb9492e474ea9ab12b09961a358e7e559013ed63b5d8084")
|
|
version("6.26.10", sha256="8e56bec397104017aa54f9eb554de7a1a134474fe0b3bb0f43a70fc4fabd625f")
|
|
version("6.26.08", sha256="4dda043e7918b40743ad0299ddd8d526b7078f0a3822fd06066df948af47940e")
|
|
version("6.26.06", sha256="b1f73c976a580a5c56c8c8a0152582a1dfc560b4dd80e1b7545237b65e6c89cb")
|
|
version("6.26.04", sha256="a271cf82782d6ed2c87ea5eef6681803f2e69e17b3036df9d863636e9358421e")
|
|
version("6.26.02", sha256="7ba96772271a726079506c5bf629c3ceb21bf0682567ed6145be30606d7cd9bb")
|
|
version("6.26.00", sha256="5fb9be71fdf0c0b5e5951f89c2f03fcb5e74291d043f6240fb86f5ca977d4b31")
|
|
version("6.24.06", sha256="907f69f4baca1e4f30eeb4979598ca7599b6aa803ca046e80e25b6bbaa0ef522")
|
|
version("6.24.02", sha256="0507e1095e279ccc7240f651d25966024325179fa85a1259b694b56723ad7c1c")
|
|
version("6.24.00", sha256="9da30548a289211c3122d47dacb07e85d35e61067fac2be6c5a5ff7bda979989")
|
|
version("6.22.08", sha256="6f061ff6ef8f5ec218a12c4c9ea92665eea116b16e1cd4df4f96f00c078a2f6f")
|
|
version("6.22.06", sha256="c4688784a7e946cd10b311040b6cf0b2f75125a7520e04d1af0b746505911b57")
|
|
version("6.22.02", sha256="89784afa9c9047e9da25afa72a724f32fa8aa646df267b7731e4527cc8a0c340")
|
|
version("6.22.00", sha256="efd961211c0f9cd76cf4a486e4f89badbcf1d08e7535bba556862b3c1a80beed")
|
|
version("6.20.08", sha256="d02f224b4908c814a99648782b927c353d44db79dea2cadea86138c1afc23ae9")
|
|
version("6.20.06", sha256="9a734758a91598d8a58a3d64d7d606aeb17bdf6fd8214e33f5c4d9947d391951")
|
|
version("6.20.04", sha256="1f8c76ccdb550e64e6ddb092b4a7e9d0a10655ef80044828cba12d5e7c874472")
|
|
version("6.20.02", sha256="0997586bf097c0afbc6f08edbffcebf5eb6a4237262216114ba3f5c8087dcba6")
|
|
version("6.20.00", sha256="68421eb0434b38b66346fa8ea6053a0fdc9a6d254e4a72019f4e3633ae118bf0")
|
|
version("6.18.04", sha256="315a85fc8363f8eb1bffa0decbf126121258f79bd273513ed64795675485cfa4")
|
|
|
|
# Old versions
|
|
version("6.18.02", sha256="50ffffdbf2585a536c77a03f54aa631926138275ffeee02e5a16dde87e978c1d")
|
|
version("6.18.00", sha256="e6698d6cfe585f186490b667163db65e7d1b92a2447658d77fa831096383ea71")
|
|
version("6.16.00", sha256="2a45055c6091adaa72b977c512f84da8ef92723c30837c7e2643eecc9c5ce4d8")
|
|
version("6.14.08", sha256="1b63b51cfb4dc20f1f5749faac6bbd1098eccab777f8b49911257d77186c73c4")
|
|
version("6.14.06", sha256="0fb943b61396f282b289e35c455a9ab60126229be1bd3f04a8f00b37c13ab432")
|
|
version("6.14.04", sha256="463ec20692332a422cfb5f38c78bedab1c40ab4d81be18e99b50cf9f53f596cf")
|
|
version("6.14.02", sha256="93816519523e87ac75924178d87112d1573eaa108fc65691aea9a9dd5bc05b3e")
|
|
version("6.14.00", sha256="7946430373489310c2791ff7a3520e393dc059db1371272bcd9d9cf0df347a0b")
|
|
version("6.12.06", sha256="aedcfd2257806e425b9f61b483e25ba600eb0ea606e21262eafaa9dc745aa794")
|
|
version("6.10.08", sha256="2cd276d2ac365403c66f08edd1be62fe932a0334f76349b24d8c737c0d6dad8a")
|
|
version("6.08.06", sha256="ea31b047ba6fc04b0b312667349eaf1498a254ccacd212144f15ffcb3f5c0592")
|
|
version("6.06.08", sha256="7cb836282014cce822ef589cad27811eb7a86d7fad45a871fa6b0e6319ec201a")
|
|
version("6.06.06", sha256="0a7d702a130a260c72cb6ea754359eaee49a8c4531b31f23de0bfcafe3ce466b")
|
|
version("6.06.04", sha256="ab86dcc80cbd8e704099af0789e23f49469932ac4936d2291602301a7aa8795b")
|
|
version("6.06.02", sha256="18a4ce42ee19e1a810d5351f74ec9550e6e422b13b5c58e0c3db740cdbc569d1")
|
|
|
|
# ###################### Patches ##########################
|
|
|
|
# Widely used patch (CMS, FNAL) to increase the size of static
|
|
# buffers used to improve the operation of TString.
|
|
patch("format-stringbuf-size.patch", level=0)
|
|
# Support use of `mariadb-c-client` and `mariadb` to provide the
|
|
# MySQL API _cf_
|
|
# https://github.com/root-project/root/commit/9c0fa8c554a569c971185249f9acfff4418c0c13.
|
|
patch("find-mysql.patch", level=1, when="@:6.16.00")
|
|
# Some ROOT versions did not honor the option to avoid building an
|
|
# internal version of unuran, _cf_
|
|
# https://github.com/root-project/ROOT/commit/3e60764f133218b6938e5aa4986de760e8f058d9.
|
|
patch("honor-unuran-switch.patch", level=1, when="@6.08.06:6.13")
|
|
# 6.16.00 fails to handle particular build option combinations, _cf_
|
|
# https://github.com/root-project/ROOT/commit/e0ae0483985d90a71a6cabd10d3622dfd1c15611.
|
|
patch("root7-webgui.patch", level=1, when="@6.16.00")
|
|
# 6.26.00:6.26.06 can fail with empty string COMPILE_DEFINITIONS, which this patch
|
|
# protects against
|
|
patch(
|
|
"https://github.com/root-project/root/pull/11111.patch?full_index=1",
|
|
sha256="3115be912bd948979c9c2a3d89ffe6437fe17bd3b81396958c6cb6f51f64ae62",
|
|
when="@6.26:6.26.06",
|
|
)
|
|
# 6.26.00:6.26.06 fails for recent nlohmann-json single headers versions
|
|
patch(
|
|
"https://github.com/root-project/root/pull/11225.patch?full_index=1",
|
|
sha256="397f2de7db95a445afdb311fc91c40725fcfad485d58b4d72e6c3cdd0d0c5de7",
|
|
when="@6.26:6.26.06 +root7 ^nlohmann-json@3.11:",
|
|
)
|
|
|
|
patch("webgui.patch", level=0, when="@6.26.00:6.26.10,6.28.00:6.28.08 +webgui")
|
|
|
|
if sys.platform == "darwin":
|
|
# Resolve non-standard use of uint, _cf_
|
|
# https://sft.its.cern.ch/jira/browse/ROOT-7886.
|
|
patch("math_uint.patch", when="@6.06.02")
|
|
# Resolve circular dependency, _cf_
|
|
# https://sft.its.cern.ch/jira/browse/ROOT-8226.
|
|
patch("root6-60606-mathmore.patch", when="@6.06.06")
|
|
|
|
# ###################### Variants ##########################
|
|
# See README.md for specific notes about what ROOT configuration
|
|
# options are or are not supported, and why.
|
|
|
|
variant("aqua", default=False, description="Enable Aqua interface")
|
|
variant("arrow", default=False, description="Enable Arrow interface")
|
|
variant("davix", default=True, description="Compile with external Davix")
|
|
variant("dcache", default=False, description="Enable support for dCache")
|
|
variant("emacs", default=False, description="Enable Emacs support")
|
|
variant("examples", default=True, description="Install examples")
|
|
variant("fftw", default=False, description="Enable Fast Fourier Transform support")
|
|
variant(
|
|
"fits", default=False, description="Enable support for images and data from FITS files"
|
|
)
|
|
variant("fortran", default=False, description="Enable the Fortran components of ROOT")
|
|
variant("graphviz", default=False, description="Enable graphviz support")
|
|
variant("gdml", default=True, description="Enable GDML writer and reader")
|
|
variant(
|
|
"gminimal",
|
|
default=True,
|
|
description="Ignore most of Root's feature defaults except for " "basic graphic options",
|
|
)
|
|
variant("gsl", default=True, description="Enable linking against shared libraries for GSL")
|
|
variant("http", default=False, description="Enable HTTP server support")
|
|
variant(
|
|
"jemalloc",
|
|
when="@:6.28",
|
|
default=False,
|
|
description="Enable using the jemalloc allocator (deprecated in 6.28)",
|
|
)
|
|
variant("math", default=True, description="Build the new libMathMore extended math library")
|
|
variant(
|
|
"memstat",
|
|
when="@:6.17",
|
|
default=False,
|
|
description="Enable a memory stats utility to detect memory leaks",
|
|
)
|
|
# Minuit must not be installed as a dependency of root
|
|
# otherwise it crashes with the internal minuit library
|
|
variant("minuit", default=True, description="Automatically search for support libraries")
|
|
variant(
|
|
"mlp",
|
|
default=False,
|
|
description="Enable support for TMultilayerPerceptron " "classes' federation",
|
|
)
|
|
variant("mysql", default=False, description="Enable support for MySQL databases")
|
|
variant("opengl", default=True, description="Enable OpenGL support")
|
|
variant("oracle", default=False, description="Enable support for Oracle databases")
|
|
variant("postgres", default=False, description="Enable postgres support")
|
|
variant("pythia6", default=False, description="Enable pythia6 support")
|
|
variant("pythia8", default=False, description="Enable pythia8 support")
|
|
variant("python", default=True, description="Enable Python ROOT bindings")
|
|
variant("qt4", when="@:6.17", default=False, description="Enable Qt graphics backend")
|
|
variant("r", default=False, description="Enable R ROOT bindings")
|
|
variant("rpath", default=True, description="Enable RPATH")
|
|
variant("roofit", default=True, description="Build the libRooFit advanced fitting package")
|
|
variant("root7", default=False, description="Enable ROOT 7 support")
|
|
variant("shadow", default=False, description="Enable shadow password support")
|
|
variant("spectrum", default=False, description="Enable support for TSpectrum")
|
|
variant("sqlite", default=False, description="Enable SQLite support")
|
|
variant("ssl", default=False, description="Enable SSL encryption support")
|
|
variant("table", when="@:6.17", default=False, description="Build libTable contrib library")
|
|
variant("tbb", default=True, description="TBB multi-threading support")
|
|
variant("threads", default=True, description="Enable using thread library")
|
|
variant("tmva", default=False, description="Build TMVA multi variate analysis library")
|
|
variant("unuran", default=True, description="Use UNURAN for random number generation")
|
|
variant("vc", default=False, description="Enable Vc for adding new types for SIMD programming")
|
|
variant("vdt", default=True, description="Enable set of fast and vectorisable math functions")
|
|
variant(
|
|
"veccore", default=False, description="Enable support for VecCore SIMD abstraction library"
|
|
)
|
|
variant(
|
|
"vmc", when="@:6.25", default=False, description="Enable the Virtual Monte Carlo interface"
|
|
)
|
|
variant(
|
|
"webgui", default=True, description="Enable web-based UI components of ROOT", when="+root7"
|
|
)
|
|
variant("x", default=True, description="Enable set of graphical options")
|
|
variant("xml", default=True, description="Enable XML parser interface")
|
|
variant("xrootd", default=False, description="Build xrootd file server and its client")
|
|
|
|
# ###################### Compiler variants ########################
|
|
|
|
variant(
|
|
"cxxstd",
|
|
default="11",
|
|
values=("11", "14", "17", "20"),
|
|
multi=False,
|
|
description="Use the specified C++ standard when building.",
|
|
)
|
|
|
|
# ###################### Dependencies ######################
|
|
|
|
depends_on("cmake@3.4.3:", type="build", when="@:6.16")
|
|
depends_on("cmake@3.9:", type="build", when="@6.18.00:")
|
|
depends_on("cmake@3.16:", type="build", when="@6.26.00:")
|
|
depends_on("cmake@3.19:", type="build", when="@6.28.00: platform=darwin")
|
|
depends_on("pkgconfig", type="build")
|
|
|
|
depends_on("blas")
|
|
depends_on("freetype")
|
|
depends_on("jpeg")
|
|
depends_on("libice")
|
|
depends_on("libpng")
|
|
depends_on("lz4", when="@6.13.02:") # See cmake_args, below.
|
|
depends_on("ncurses")
|
|
depends_on("nlohmann-json", when="@6.24:")
|
|
depends_on("nlohmann-json@:3.10", when="@6.24:6.26.07")
|
|
depends_on("pcre")
|
|
depends_on("xxhash", when="@6.13.02:") # See cmake_args, below.
|
|
depends_on("xz")
|
|
depends_on("zlib-api")
|
|
depends_on("zstd", when="@6.20:")
|
|
|
|
# X-Graphics
|
|
depends_on("libx11", when="+x")
|
|
depends_on("libxext", when="+x")
|
|
depends_on("libxft", when="+x")
|
|
depends_on("libxpm", when="+x")
|
|
depends_on("libsm", when="+x")
|
|
|
|
# OpenGL
|
|
depends_on("ftgl@2.4.0:", when="+opengl")
|
|
depends_on("glew", when="+opengl")
|
|
depends_on("gl2ps", when="+opengl")
|
|
depends_on("gl", when="+opengl")
|
|
depends_on("glu", when="+opengl")
|
|
|
|
# Qt4
|
|
depends_on("qt@:4", when="+qt4")
|
|
|
|
# Python
|
|
depends_on("python@2.7:", when="+python", type=("build", "run"))
|
|
depends_on("python@2.7:3.10", when="@:6.26.09 +python", type=("build", "run"))
|
|
depends_on("py-numpy", type=("build", "run"), when="+tmva")
|
|
# This numpy dependency was not intended and will hopefully
|
|
# be fixed in 6.20.06.
|
|
# See: https://sft.its.cern.ch/jira/browse/ROOT-10626
|
|
depends_on("py-numpy", type=("build", "run"), when="@6.20.00:6.20.05 +python")
|
|
|
|
# Optional dependencies
|
|
depends_on("arrow", when="+arrow")
|
|
depends_on("davix @0.7.1:", when="+davix")
|
|
depends_on("dcap", when="+dcache")
|
|
depends_on("cfitsio", when="+fits")
|
|
depends_on("fcgi", when="+http")
|
|
depends_on("fftw", when="+fftw")
|
|
depends_on("graphviz", when="+graphviz")
|
|
depends_on("gsl", when="+gsl")
|
|
depends_on("jemalloc", when="+jemalloc")
|
|
depends_on("mysql-client", when="+mysql")
|
|
depends_on("openssl", when="+ssl")
|
|
depends_on("openssl", when="+davix") # Also with davix
|
|
depends_on("oracle-instant-client@19.10.0.0.0", when="+oracle @:6.24.01")
|
|
depends_on("postgresql", when="+postgres")
|
|
depends_on("pythia6+root", when="+pythia6")
|
|
depends_on("pythia8", when="+pythia8")
|
|
depends_on("r", when="+r", type=("build", "run"))
|
|
depends_on("r-rcpp", when="+r", type=("build", "run"))
|
|
depends_on("r-rinside", when="+r", type=("build", "run"))
|
|
depends_on("readline", when="+r")
|
|
depends_on("shadow", when="+shadow")
|
|
depends_on("sqlite", when="+sqlite")
|
|
depends_on("tbb", when="+tbb")
|
|
# See: https://github.com/root-project/root/issues/6933
|
|
conflicts(
|
|
"^intel-tbb@2021.1:", when="@:6.22", msg="Please use an older intel-tbb version for ROOT"
|
|
)
|
|
conflicts(
|
|
"^intel-oneapi-tbb@2021.1:",
|
|
when="@:6.22",
|
|
msg="Please use an older intel-tbb/intel-oneapi-tbb version for ROOT",
|
|
)
|
|
# depends_on('intel-tbb@:2021.0', when='@:6.22 ^intel-tbb')
|
|
depends_on("unuran", when="+unuran")
|
|
depends_on("vc@1.0:", when="@6.07.04: +vc")
|
|
depends_on("vc@1.3.0:", when="@6.09.02: +vc")
|
|
depends_on("vdt", when="+vdt")
|
|
depends_on("veccore", when="+veccore")
|
|
depends_on("libxml2", when="+xml")
|
|
depends_on("xrootd", when="+xrootd")
|
|
depends_on("xrootd@:4", when="@:6.22.03 +xrootd")
|
|
|
|
# ###################### Conflicts ######################
|
|
|
|
# I was unable to build root with any Intel compiler
|
|
# See https://sft.its.cern.ch/jira/browse/ROOT-7517
|
|
conflicts("%intel")
|
|
|
|
# ROOT <6.08 was incompatible with the GCC 5+ ABI
|
|
conflicts("%gcc@5.0.0:", when="@:6.07")
|
|
|
|
# The version of Clang featured in ROOT <6.12 fails to build with
|
|
# GCC 9.2.1, which we can safely extrapolate to the GCC 9 series.
|
|
conflicts("%gcc@9.0.0:", when="@:6.11")
|
|
|
|
# See https://github.com/root-project/root/issues/9297
|
|
conflicts("target=ppc64le:", when="@:6.24")
|
|
|
|
# Incompatible variants
|
|
if sys.platform != "darwin":
|
|
conflicts("+opengl", when="~x", msg="root+opengl requires X")
|
|
conflicts("+math", when="~gsl", msg="root+math requires GSL")
|
|
conflicts("+tmva", when="~gsl", msg="root+tmva requires GSL")
|
|
conflicts("+tmva", when="~mlp", msg="root+tmva requires MLP")
|
|
conflicts("cxxstd=11", when="+root7", msg="root7 requires at least C++14")
|
|
conflicts("cxxstd=11", when="@6.25.02:", msg="This version of root requires at least C++14")
|
|
conflicts(
|
|
"cxxstd=20", when="@:6.28.02", msg="C++20 support requires root version at least 6.28.04"
|
|
)
|
|
|
|
# See https://github.com/root-project/root/issues/11128
|
|
conflicts("%clang@16:", when="@:6.26.07", msg="clang 16+ support was added in root 6.26.08")
|
|
|
|
# See https://github.com/root-project/root/issues/11714
|
|
if sys.platform == "darwin" and macos_version() >= Version("13"):
|
|
conflicts("@:6.26.09", msg="macOS 13 support was added in root 6.26.10")
|
|
|
|
# ROOT <6.14 is incompatible with Python >=3.7, which is the minimum supported by spack
|
|
conflicts("+python", when="@:6.13", msg="Spack wants python >=3.7, too new for ROOT <6.14")
|
|
|
|
# ROOT does not support LTO builds
|
|
# See https://github.com/root-project/root/issues/11135
|
|
conflicts("+ipo", msg="LTO is not a supported configuration for building ROOT")
|
|
|
|
@classmethod
|
|
def filter_detected_exes(cls, prefix, exes_in_prefix):
|
|
result = []
|
|
for exe in exes_in_prefix:
|
|
# no need to check the root executable itself
|
|
# we can get all information from root-config
|
|
if exe.endswith("root"):
|
|
continue
|
|
result.append(exe)
|
|
return result
|
|
|
|
@classmethod
|
|
def determine_version(cls, exe):
|
|
output = Executable(exe)("--version", output=str, error=str)
|
|
# turn the output of root-config --version
|
|
# (something like 6.22/06)
|
|
# into the format used in this recipe (6.22.06)
|
|
return output.strip().replace("/", ".")
|
|
|
|
@classmethod
|
|
def determine_variants(cls, exes, version_str):
|
|
v = [] # list of determined variants
|
|
# there is a fairly direct mapping between build options ( which
|
|
# root-config helpfully outputs) and variants
|
|
output = Executable(exes[0])("--features", output=str, error=str)
|
|
f = set(output.strip().split()) # features as reported by root-config
|
|
# only multivalued variant: cxxstd
|
|
if "cxx11" in f:
|
|
v.append("cxxstd=11")
|
|
elif "cxx14" in f:
|
|
v.append("cxxstd=14")
|
|
elif "cxx17" in f:
|
|
v.append("cxxstd=17")
|
|
elif "cxx20" in f:
|
|
v.append("cxxstd=20")
|
|
|
|
# helper function: check if featurename is in features, and if it is,
|
|
# append variantname to variants. featurename may be a list/tuple, in
|
|
# which case the variant is only added if all of them are present
|
|
def _add_variant(variants, features, featurename, variantname):
|
|
if isinstance(featurename, str):
|
|
if featurename in features:
|
|
variants.append("%s" % variantname)
|
|
else:
|
|
variants.append("~%s" % variantname[1:])
|
|
else:
|
|
if set(featurename).issubset(features):
|
|
variants.append("%s" % variantname)
|
|
else:
|
|
variants.append("~%s" % variantname[1:])
|
|
|
|
_add_variant(v, f, "cocoa", "+aqua")
|
|
_add_variant(v, f, "davix", "+davix")
|
|
_add_variant(v, f, "dcache", "+dcache")
|
|
_add_variant(v, f, "fftw3", "+fftw")
|
|
_add_variant(v, f, "fitsio", "+fits")
|
|
_add_variant(v, f, ("ftgl", "opengl"), "+opengl")
|
|
_add_variant(v, f, "gdml", "+gdml")
|
|
_add_variant(v, f, "mathmore", "+math")
|
|
_add_variant(v, f, "gviz", "+graphviz")
|
|
_add_variant(v, f, "http", "+http")
|
|
_add_variant(v, f, ("imt", "tbb"), "+tbb")
|
|
_add_variant(v, f, "jemalloc", "+jemalloc")
|
|
_add_variant(v, f, "memstat", "+memstat")
|
|
_add_variant(v, f, ("minuit", "minuit2"), "+minuit")
|
|
_add_variant(v, f, "mlp", "+mlp")
|
|
_add_variant(v, f, "mysql", "+mysql")
|
|
_add_variant(v, f, "oracle", "+oracle")
|
|
_add_variant(v, f, "pgsql", "+postgres")
|
|
_add_variant(v, f, "pythia6", "+pythia6")
|
|
_add_variant(v, f, "pythia8", "+pythia8")
|
|
_add_variant(v, f, "pyroot", "+python")
|
|
_add_variant(v, f, ("qt", "qtgsi"), "+qt4")
|
|
_add_variant(v, f, "r", "+r")
|
|
_add_variant(v, f, "roofit", "+roofit")
|
|
# webui feature renamed to webgui in 6.18
|
|
if Version(version_str).satisfies("@6.18:"):
|
|
_add_variant(v, f, ("root7", "webgui"), "+webgui")
|
|
else:
|
|
_add_variant(v, f, ("root7", "webui"), "+webgui")
|
|
_add_variant(v, f, "rpath", "+rpath")
|
|
_add_variant(v, f, "shadowpw", "+shadow")
|
|
_add_variant(v, f, "spectrum", "+spectrum")
|
|
_add_variant(v, f, "sqlite", "+sqlite")
|
|
_add_variant(v, f, "ssl", "+ssl")
|
|
_add_variant(v, f, "table", "+table")
|
|
_add_variant(v, f, "thread", "+threads")
|
|
_add_variant(v, f, "tmva", "+tmva")
|
|
_add_variant(v, f, "unuran", "+unuran")
|
|
_add_variant(v, f, "vc", "+vc")
|
|
_add_variant(v, f, "vdt", "+vdt")
|
|
_add_variant(v, f, "veccore", "+veccore")
|
|
_add_variant(v, f, "vmc", "+vmc")
|
|
_add_variant(v, f, ("x11", "xft"), "+x")
|
|
_add_variant(v, f, "xml", "+xml")
|
|
_add_variant(v, f, "xrootd", "+xrootd")
|
|
return " ".join(v)
|
|
|
|
def cmake_args(self):
|
|
spec = self.spec
|
|
define = self.define
|
|
define_from_variant = self.define_from_variant
|
|
options = []
|
|
|
|
# ###################### Boolean Options ######################
|
|
# For option list format see _process_opts(), below.
|
|
|
|
# Options controlling gross build / config behavior.
|
|
options += [
|
|
define("cxxmodules", False),
|
|
define("exceptions", True),
|
|
define("explicitlink", True),
|
|
define("fail-on-missing", True),
|
|
define_from_variant("fortran"),
|
|
define_from_variant("gminimal"),
|
|
define("gnuinstall", True),
|
|
define("libcxx", False),
|
|
define("pch", True),
|
|
define("roottest", False),
|
|
define_from_variant("rpath"),
|
|
define("runtime_cxxmodules", False),
|
|
define("shared", True),
|
|
define("soversion", True),
|
|
define("testing", self.run_tests),
|
|
define_from_variant("thread", "threads"),
|
|
# The following option makes sure that Cling will call the compiler
|
|
# it was compiled with at run time; see #17488, #18078 and #23886
|
|
define("CLING_CXX_PATH", self.compiler.cxx),
|
|
]
|
|
|
|
# Options related to ROOT's ability to download and build its own
|
|
# dependencies. Per Spack convention, this should generally be avoided.
|
|
|
|
afterimage_enabled = ("+x" in self.spec) if "platform=darwin" not in self.spec else True
|
|
|
|
options += [
|
|
define("builtin_afterimage", afterimage_enabled),
|
|
define("builtin_cfitsio", False),
|
|
define("builtin_davix", False),
|
|
define("builtin_fftw3", False),
|
|
define("builtin_freetype", False),
|
|
define("builtin_ftgl", False),
|
|
define("builtin_gl2ps", False),
|
|
define("builtin_glew", False),
|
|
define("builtin_gsl", False),
|
|
define("builtin_llvm", True),
|
|
define("builtin_lz4", self.spec.satisfies("@6.12.02:6.12")),
|
|
define("builtin_lzma", False),
|
|
define("builtin_nlohmannjson", False),
|
|
define("builtin_openssl", False),
|
|
define("builtin_pcre", False),
|
|
define("builtin_tbb", False),
|
|
define("builtin_unuran", False),
|
|
define("builtin_vc", False),
|
|
define("builtin_vdt", False),
|
|
define("builtin_veccore", False),
|
|
define("builtin_xrootd", False),
|
|
define("builtin_xxhash", self.spec.satisfies("@6.12.02:6.12")),
|
|
define("builtin_zlib", False),
|
|
]
|
|
|
|
# Features
|
|
options += [
|
|
define("afdsmrgd", False),
|
|
define("afs", False),
|
|
define("alien", False),
|
|
define_from_variant("arrow"),
|
|
define("asimage", True),
|
|
define("astiff", True),
|
|
define("bonjour", False),
|
|
define("castor", False),
|
|
define("ccache", False),
|
|
define("chirp", False),
|
|
define("cling", True),
|
|
define_from_variant("cocoa", "aqua"),
|
|
define("dataframe", True),
|
|
define_from_variant("davix"),
|
|
define_from_variant("dcache"),
|
|
define_from_variant("fftw3", "fftw"),
|
|
define_from_variant("fitsio", "fits"),
|
|
define_from_variant("ftgl", "opengl"),
|
|
define_from_variant("gdml"),
|
|
define_from_variant("genvector", "math"),
|
|
define("geocad", False),
|
|
define("gfal", False),
|
|
define_from_variant("gl2ps", "opengl"),
|
|
define("glite", False),
|
|
define("globus", False),
|
|
define_from_variant("gviz", "graphviz"),
|
|
define("hdfs", False),
|
|
define_from_variant("http"), # See conflicts
|
|
define_from_variant("imt", "tbb"),
|
|
define_from_variant("jemalloc"),
|
|
define("krb5", False),
|
|
define("ldap", False),
|
|
define_from_variant("mathmore", "math"),
|
|
define_from_variant("memstat"), # See conflicts
|
|
define("minimal", False),
|
|
define_from_variant("minuit"),
|
|
define_from_variant("minuit2", "minuit"),
|
|
define_from_variant("mlp"),
|
|
define("monalisa", False),
|
|
define_from_variant("mysql"),
|
|
define("odbc", False),
|
|
define_from_variant("opengl"),
|
|
define_from_variant("oracle"),
|
|
define_from_variant("pgsql", "postgres"),
|
|
define_from_variant("pythia6"),
|
|
define_from_variant("pythia8"),
|
|
define_from_variant("qt", "qt4"), # See conflicts
|
|
define_from_variant("qtgsi", "qt4"), # See conflicts
|
|
define_from_variant("r"),
|
|
define("rfio", False),
|
|
define_from_variant("roofit"),
|
|
define_from_variant("root7"), # See conflicts
|
|
define("ruby", False),
|
|
define("sapdb", False),
|
|
define_from_variant("shadowpw", "shadow"),
|
|
define_from_variant("spectrum"),
|
|
define_from_variant("sqlite"),
|
|
define("srp", False),
|
|
define_from_variant("ssl"),
|
|
define_from_variant("table"),
|
|
define_from_variant("tbb"),
|
|
define("tcmalloc", False),
|
|
define_from_variant("tmva"),
|
|
define_from_variant("unuran"),
|
|
define_from_variant("vc"),
|
|
define_from_variant("vdt"),
|
|
define_from_variant("veccore"),
|
|
define_from_variant("vmc"),
|
|
define_from_variant("x11", "x"),
|
|
define_from_variant("xft", "x"),
|
|
define_from_variant("xml"),
|
|
define_from_variant("xrootd"),
|
|
]
|
|
|
|
# Necessary due to name change of variant (webui->webgui)
|
|
# https://github.com/root-project/root/commit/d631c542909f2f793ca7b06abc622e292dfc4934
|
|
if self.spec.satisfies("@:6.17.02"):
|
|
options.append(define_from_variant("webui", "webgui"))
|
|
if self.spec.satisfies("@6.18.00:"):
|
|
options.append(define_from_variant("webgui", "webgui"))
|
|
|
|
# Some special features
|
|
if self.spec.satisfies("@6.20.02:"):
|
|
options.append(define_from_variant("pyroot", "python"))
|
|
else:
|
|
options.append(define_from_variant("python"))
|
|
|
|
# #################### Compiler options ####################
|
|
|
|
if sys.platform == "darwin" and self.compiler.cc == "gcc":
|
|
cflags = "-D__builtin_unreachable=__builtin_trap"
|
|
options.extend([define("CMAKE_C_FLAGS", cflags), define("CMAKE_CXX_FLAGS", cflags)])
|
|
|
|
# Method for selecting C++ standard depends on ROOT version
|
|
if self.spec.satisfies("@6.18.00:"):
|
|
options.append(define_from_variant("CMAKE_CXX_STANDARD", "cxxstd"))
|
|
else:
|
|
options.append(define("cxx" + self.spec.variants["cxxstd"].value, True))
|
|
|
|
if "+x+opengl" in self.spec:
|
|
ftgl_prefix = self.spec["ftgl"].prefix
|
|
options.append(define("FTGL_ROOT_DIR", ftgl_prefix))
|
|
options.append(define("FTGL_INCLUDE_DIR", ftgl_prefix.include))
|
|
if "+python" in self.spec:
|
|
# See https://github.com/spack/spack/pull/11579
|
|
options.append(define("PYTHON_EXECUTABLE", spec["python"].command.path))
|
|
|
|
return options
|
|
|
|
def setup_build_environment(self, env):
|
|
spec = self.spec
|
|
|
|
if "lz4" in spec:
|
|
env.append_path("CMAKE_PREFIX_PATH", spec["lz4"].prefix)
|
|
|
|
# This hack is made necessary by a header name collision between
|
|
# asimage's "import.h" and Python's "import.h" headers...
|
|
env.set("SPACK_INCLUDE_DIRS", "", force=True)
|
|
|
|
# ...but it breaks header search for any ROOT dependency which does not
|
|
# use CMake. To resolve this, we must bring back those dependencies's
|
|
# include paths into SPACK_INCLUDE_DIRS.
|
|
#
|
|
# But in doing so, we must be careful not to inject system header paths
|
|
# into SPACK_INCLUDE_DIRS, even in a deprioritized form, because some
|
|
# system/compiler combinations don't like having -I/usr/include around.
|
|
def add_include_path(dep_name):
|
|
include_path = spec[dep_name].prefix.include
|
|
if not is_system_path(include_path):
|
|
env.append_path("SPACK_INCLUDE_DIRS", include_path)
|
|
|
|
# With that done, let's go fixing those deps
|
|
if spec.satisfies("@:6.12"):
|
|
add_include_path("zlib-api")
|
|
if "+x" in spec:
|
|
if spec.satisfies("@:6.08") or spec.satisfies("@6.22:"):
|
|
add_include_path("xextproto")
|
|
add_include_path("fontconfig")
|
|
add_include_path("libx11")
|
|
add_include_path("xproto")
|
|
if "+opengl" in spec and "platform=darwin" not in spec:
|
|
add_include_path("glew")
|
|
add_include_path("mesa-glu")
|
|
if "platform=darwin" in spec:
|
|
# Newer deployment targets cause fatal errors in rootcling, so
|
|
# override with an empty value even though it may lead to link
|
|
# warnings when building against ROOT
|
|
env.unset("MACOSX_DEPLOYMENT_TARGET")
|
|
|
|
def setup_run_environment(self, env):
|
|
env.set("ROOTSYS", self.prefix)
|
|
env.set("ROOT_VERSION", "v{0}".format(self.version.up_to(1)))
|
|
env.prepend_path("PYTHONPATH", self.prefix.lib.root)
|
|
# the following vars are copied from thisroot.sh; silence a cppyy warning
|
|
env.set("CLING_STANDARD_PCH", "none")
|
|
env.set("CPPYY_API_PATH", "none")
|
|
|
|
def setup_dependent_build_environment(self, env, dependent_spec):
|
|
env.set("ROOTSYS", self.prefix)
|
|
env.set("ROOT_VERSION", "v{0}".format(self.version.up_to(1)))
|
|
env.prepend_path("PYTHONPATH", self.prefix.lib.root)
|
|
env.prepend_path("PATH", self.prefix.bin)
|
|
env.append_path("CMAKE_MODULE_PATH", self.prefix.cmake)
|
|
env.prepend_path("ROOT_INCLUDE_PATH", dependent_spec.prefix.include)
|
|
if "+rpath" not in self.spec:
|
|
env.prepend_path("LD_LIBRARY_PATH", self.prefix.lib.root)
|
|
if "platform=darwin" in self.spec:
|
|
# Newer deployment targets cause fatal errors in rootcling
|
|
env.unset("MACOSX_DEPLOYMENT_TARGET")
|
|
|
|
def setup_dependent_run_environment(self, env, dependent_spec):
|
|
env.set("ROOTSYS", self.prefix)
|
|
env.set("ROOT_VERSION", "v{0}".format(self.version.up_to(1)))
|
|
env.prepend_path("PYTHONPATH", self.prefix.lib.root)
|
|
env.prepend_path("PATH", self.prefix.bin)
|
|
env.prepend_path("ROOT_INCLUDE_PATH", dependent_spec.prefix.include)
|
|
if "+rpath" not in self.spec:
|
|
env.prepend_path("LD_LIBRARY_PATH", self.prefix.lib.root)
|