spack/var/spack/repos/builtin/packages/mesa18/package.py
Harmen Stoppels eef9939c21
Automated git version fixes (#39637)
Use full length commit sha instead of short prefixes, to improve
reproducibility (future clashes) and guard against compromised repos and
man in the middle attacks.

Abbreviated commit shas are expanded to full length, to guard against future
clashes on short hash. It also guards against compromised repos and
man in the middle attacks, where attackers can easily fabricate a malicious
commit with a shasum prefix collision.

Versions with just tags now also get a commit sha, which can later be used to
check for retagged commits.
2023-08-29 16:33:03 +02:00

229 lines
7.6 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.package import *
class Mesa18(AutotoolsPackage):
"""Mesa is an open-source implementation of the OpenGL specification
- a system for rendering interactive 3D graphics."""
homepage = "https://www.mesa3d.org"
maintainers("v-dobrev", "ChristianTackeGSI")
# Note that we always want to build from the git repo instead of a
# tarball since the tarball has pre-generated files for certain versions
# of LLVM while the git repo doesn't so it can adapt at build time to
# whatever version of LLVM you're using.
git = "https://gitlab.freedesktop.org/mesa/mesa.git"
version("18.3.6", tag="mesa-18.3.6", commit="11049bcff86da8013a4f63bd68daf637e3af22f3")
depends_on("autoconf", type="build")
depends_on("automake", type="build")
depends_on("libtool", type="build")
depends_on("m4", type="build")
depends_on("pkgconfig", type="build")
depends_on("binutils+plugins", when=(sys.platform != "darwin"), type="build")
depends_on("bison", type="build")
depends_on("flex", type="build")
depends_on("gettext", type="build")
depends_on("pkgconfig", type="build")
depends_on("python@:3.8", type="build") # https://github.com/spack/spack/issues/28219
depends_on("py-mako@0.8.0:", type="build")
depends_on("libxml2")
depends_on("zlib-api")
depends_on("expat")
depends_on("ncurses+termlib")
# Internal options
variant("llvm", default=True, description="Enable LLVM.")
variant(
"swr",
values=spack.variant.DisjointSetsOfValues(
("none",), ("auto",), ("avx", "avx2", "knl", "skx")
)
.with_non_feature_values("auto")
.with_non_feature_values("none")
.with_default("auto"),
when="+llvm",
description="Enable the SWR driver.",
)
# Front ends
variant("osmesa", default=True, description="Enable the OSMesa frontend.")
is_linux = sys.platform.startswith("linux")
variant("glx", default=is_linux, description="Enable the GLX frontend.")
# Additional backends
variant("opengles", default=False, description="Enable OpenGL ES support.")
# Provides
provides("libglx", when="+glx")
provides("libosmesa", when="+osmesa")
# Variant dependencies
depends_on("libllvm@6:10", when="+llvm")
depends_on("libx11", when="+glx")
depends_on("libxcb", when="+glx")
depends_on("libxext", when="+glx")
depends_on("glproto@1.4.14:", when="+glx")
# Require at least 1 front-end
conflicts("~osmesa ~glx")
# Prevent an unnecessary xcb-dri dependency
patch("autotools-x11-nodri.patch")
# Backport Mesa MR#6053 to prevent multiply-defined symbols
patch("multiple-symbols_hash.patch", when="@:20.1.4%gcc@10:")
def setup_build_environment(self, env):
env.set("PYTHON", self.spec["python"].command.path)
def autoreconf(self, spec, prefix):
which("autoreconf")("--force", "--verbose", "--install")
def configure_args(self):
spec = self.spec
args = [
"LDFLAGS={0}".format(self.spec["ncurses"].libs.search_flags),
"--enable-shared",
"--disable-static",
"--disable-libglvnd",
"--disable-nine",
"--disable-omx-bellagio",
"--disable-omx-tizonia",
"--disable-opencl",
"--disable-opencl-icd",
"--disable-va",
"--disable-vdpau",
"--disable-xa",
"--disable-xvmc",
"--disable-osmesa",
"--with-vulkan-drivers=",
"--disable-egl",
"--disable-gbm",
"--disable-dri",
"--enable-opengl",
]
args_platforms = []
args_gallium_drivers = ["swrast"]
args_dri_drivers = []
if spec.target.family == "arm" or spec.target.family == "aarch64":
args.append("--disable-libunwind")
num_frontends = 0
if "+osmesa" in spec:
num_frontends += 1
args.append("--enable-gallium-osmesa")
else:
args.append("--disable-gallium-osmesa")
if "+glx" in spec:
num_frontends += 1
args.append("--enable-glx=gallium-xlib")
args_platforms.append("x11")
else:
args.append("--disable-glx")
if "+opengles" in spec:
args.extend(["--enable-gles1", "--enable-gles2"])
else:
args.extend(["--disable-gles1", "--disable-gles2"])
if num_frontends > 1:
args.append("--enable-shared-glapi")
else:
args.append("--disable-shared-glapi")
if "+llvm" in spec:
args.append("--enable-llvm")
args.append("--with-llvm-prefix=%s" % spec["libllvm"].prefix)
if "+llvm_dylib" in spec["libllvm"]:
args.append("--enable-llvm-shared-libs")
else:
args.append("--disable-llvm-shared-libs")
else:
args.append("--disable-llvm")
args_swr_arches = []
if "swr=auto" in spec:
if "avx" in spec.target:
args_swr_arches.append("avx")
if "avx2" in spec.target:
args_swr_arches.append("avx2")
if "avx512f" in spec.target:
if "avx512er" in spec.target:
args_swr_arches.append("knl")
if "avx512bw" in spec.target:
args_swr_arches.append("skx")
else:
if "swr=avx" in spec:
args_swr_arches.append("avx")
if "swr=avx2" in spec:
args_swr_arches.append("avx2")
if "swr=knl" in spec:
args_swr_arches.append("knl")
if "swr=skx" in spec:
args_swr_arches.append("skx")
if args_swr_arches:
args_gallium_drivers.append("swr")
args.append("--with-swr-archs=" + ",".join(args_swr_arches))
# Add the remaining list args
args.append("--with-platforms=" + ",".join(args_platforms))
args.append("--with-gallium-drivers=" + ",".join(args_gallium_drivers))
args.append("--with-dri-drivers=" + ",".join(args_dri_drivers))
return args
@property
def libs(self):
spec = self.spec
libs_to_seek = set()
if "platform=windows" in spec:
libs_to_seek.add("opengl32")
if "+osmesa" in spec:
libs_to_seek.add("osmesa")
else:
libs_to_seek.add("libGL")
if "+osmesa" in spec:
libs_to_seek.add("libOSMesa")
if "+glx" in spec:
libs_to_seek.add("libGL")
if "+opengles" in spec:
libs_to_seek.add("libGLESv1_CM")
libs_to_seek.add("libGLESv2")
return find_libraries(
list(libs_to_seek), root=self.spec.prefix, shared=True, recursive=True
)
@property
def libglx_headers(self):
return find_headers("GL/glx", root=self.spec.prefix.include, recursive=False)
@property
def libglx_libs(self):
return find_libraries("libGL", root=self.spec.prefix, recursive=True)
@property
def libosmesa_headers(self):
return find_headers("GL/osmesa", root=self.spec.prefix.include, recursive=False)
@property
def libosmesa_libs(self):
if "platform=windows" in self.spec:
lib_name = "osmesa"
else:
lib_name = "libOSMesa"
return find_libraries(lib_name, root=self.spec.prefix, recursive=True)