# 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 import spack.build_systems.makefile from spack.package import * class Glvis(MakefilePackage): """GLVis: an OpenGL tool for visualization of FEM meshes and functions""" homepage = "https://glvis.org" git = "https://github.com/glvis/glvis.git" tags = ["radiuss"] maintainers("v-dobrev", "tzanio", "tomstitt", "goxberry") # glvis (like mfem) is downloaded from a URL shortener at request # of upstream author Tzanio Kolev . See here: # https://github.com/mfem/mfem/issues/53 # # The following procedure should be used to verify security when a # new version is added: # # 1. Verify that no checksums on old versions have changed. # # 2. Verify that the shortened URL for the new version is listed at: # https://glvis.org/download/ # # 3. Use http://getlinkinfo.com or similar to verify that the # underling download link for the latest version comes has the # prefix: http://glvis.github.io/releases # # If this quick verification procedure fails, additional discussion # will be required to verify the new version. # # glvis does not need mfem+mpi but will build that by default, to just build # a serial mfem: `spack install glvis ^mfem~mpi~metis' license("BSD-3-Clause") version("develop", branch="master") version( "4.2", sha256="314fb04040cd0a8128d6dac62ba67d7067c2c097364e5747182ee8371049b42a", url="https://bit.ly/glvis-4-2", extension=".tar.gz", ) version( "4.1", sha256="7542c2942167533eec10d59b8331d18241798bbd86a7efbe51dc479db4127407", url="https://bit.ly/glvis-4-1", extension=".tar.gz", ) version( "4.0", sha256="68331eaea8b93968ed6bf395388c2730b27bbcb4b7809ce44277726edccd9f08", url="https://bit.ly/glvis-4-0", extension=".tar.gz", ) version( "3.4", sha256="289fbd2e09d4456e5fee6162bdc3e0b4c8c8d54625f3547ad2a69fef319279e7", url="https://bit.ly/glvis-3-4", extension=".tar.gz", ) version( "3.3", sha256="e24d7c5cb53f208b691c872fe82ea898242cfdc0fd68dd0579c739e070dcd800", url="http://goo.gl/C0Oadw", extension=".tar.gz", ) version( "3.2", sha256="c82cb110396e63b6436a770c55eb6d578441eaeaf3f9cc20436c242392e44e80", url="http://goo.gl/hzupg1", extension=".tar.gz", ) version( "3.1", sha256="793e984ddfbf825dcd13dfe1ca00eccd686cd40ad30c8789ba80ee175a1b488c", url="http://goo.gl/gQZuu9", extension="tar.gz", ) variant( "screenshots", default="png", values=("xwd", "png", "tiff"), description="Backend used for screenshots", ) variant("fonts", default=True, description="Use antialiased fonts via freetype & fontconfig") depends_on("mfem@develop", when="@develop") depends_on("mfem@4.4.0:", when="@4.2") depends_on("mfem@4.3.0:", when="@4.1") depends_on("mfem@4.0.0:", when="@4.0") depends_on("mfem@3.4.0", when="@3.4") depends_on("mfem@3.3", when="@3.3") depends_on("mfem@3.2", when="@3.2") depends_on("mfem@3.1", when="@3.1") with when("@:3"): depends_on("gl") depends_on("glu") depends_on("libx11") with when("@4.0:"): # On Mac, we use the OpenGL framework if sys.platform.startswith("linux"): depends_on("gl") depends_on("sdl2") depends_on("glm") # On Mac, use external glew, e.g. from Homebrew depends_on("glew") # On Mac, use external freetype and fontconfig, e.g. from /opt/X11 depends_on("freetype") depends_on("fontconfig") depends_on("xxd", type="build") with when("+fonts"): depends_on("freetype") depends_on("fontconfig") depends_on("libpng", when="screenshots=png") depends_on("libtiff", when="screenshots=tiff") class MakefileBuilder(spack.build_systems.makefile.MakefileBuilder): @property def build_targets(self): return self.common_args() @property def install_targets(self): return ["install"] + self.common_args() def common_args(self): spec = self.spec result = [ "CC={0}".format(env["CC"]), "PREFIX={0}".format(self.spec.prefix.bin), "MFEM_DIR={0}".format(self.spec["mfem"].prefix), "CONFIG_MK={0}".format(self.spec["mfem"].package.config_mk), ] if self.spec.satisfies("@4.0:"): # Spack will inject the necessary include dirs and link paths via # its compiler wrapper, so we can skip them: result += ["GLM_DIR=", "SDL_DIR=", "GLEW_DIR=", "FREETYPE_DIR=", "OPENGL_DIR="] # Spack will not inject include dirs like /usr/include/freetype2, # so we need to do it ourselves: if spec["freetype"].external: result += ["GL_OPTS={0}".format(spec["freetype"].headers.cpp_flags)] else: gl_libs = spec["glu"].libs + spec["gl"].libs + spec["libx11"].libs result += [ "GL_OPTS=-I{0} -I{1} -I{2}".format( spec["libx11"].prefix.include, spec["gl"].home.include, spec["glu"].prefix.include, ), "GL_LIBS={0}".format(gl_libs.ld_flags), ] result.extend(self.fonts_args()) if self.spec.satisfies("screenshots=png"): result.extend(self.png_args()) elif self.spec.satisfies("screenshots=tiff"): result.extend(self.tiff_args()) else: result.extend(self.xwd_args()) return result def fonts_args(self): if not self.spec.satisfies("+fonts"): return ["USE_FREETYPE=NO"] freetype = self.spec["freetype"] fontconfig = self.spec["fontconfig"] return [ "USE_FREETYPE=YES", "FT_OPTS=-DGLVIS_USE_FREETYPE {0} -I{1}".format( freetype.headers.include_flags, fontconfig.prefix.include ), "FT_LIBS={0} {1}".format(freetype.libs.ld_flags, fontconfig.libs.ld_flags), ] def xwd_args(self): if self.spec.satisfies("@4.0:"): return ["GLVIS_USE_LIBPNG=NO", "GLVIS_USE_LIBTIFF=NO"] return ["USE_LIBPNG=NO", "USE_LIBTIFF=NO"] def png_args(self): prefix_args = ["USE_LIBPNG=YES", "USE_LIBTIFF=NO"] if self.spec.satisfies("@4.0:"): prefix_args = ["GLVIS_USE_LIBPNG=YES", "GLVIS_USE_LIBTIFF=NO"] libpng = self.spec["libpng"] return prefix_args + [ "PNG_OPTS=-DGLVIS_USE_LIBPNG -I{0}".format(libpng.prefix.include), "PNG_LIBS={0}".format(libpng.libs.ld_flags), ] def tiff_args(self): prefix_args = ["USE_LIBPNG=NO", "USE_LIBTIFF=YES"] if self.spec.satisfies("@4.0:"): prefix_args = ["GLVIS_USE_LIBPNG=NO", "GLVIS_USE_LIBTIFF=YES"] libtiff = self.spec["libtiff"] return prefix_args + [ "TIFF_OPTS=-DGLVIS_USE_LIBTIFF -I{0}".format(libtiff.prefix.include), "TIFF_LIBS={0}".format(libtiff.libs.ld_flags), ]