# Copyright 2013-2024 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 os
import llnl.util.tty as tty
from spack.package import *
from spack.util.environment import EnvironmentModifications
class Heasoft(AutotoolsPackage):
"""A Unified Release of the FTOOLS and XANADU Software Packages.
XANADU: High-level, multi-mission tasks for X-ray astronomical spectral,
timing, and imaging data analysis. FTOOLS: General and mission-specific
tools to manipulate FITS files. FITSIO: Core library responsible for reading
and writing FITS files. fv: General FITS file browser/editor/plotter with a
graphical user interface. XSTAR: Tool for calculating the physical
conditions and emission spectra of photoionized gases"""
homepage = "https://heasarc.gsfc.nasa.gov/docs/software/lheasoft/"
url = "https://heasarc.gsfc.nasa.gov/FTP/software/lheasoft/lheasoft6.29/heasoft-6.29src.tar.gz"
license("BSD-3-Clause")
version("6.30", sha256="7f828f6050809653319f94d715c1b6815fbc09adfdcb61f2f0f1d7a6af10684a")
version("6.29", sha256="534fec04baa2586326fd7240805f2606620f3b7d7078a80fdd95c9c1177c9e68")
variant("X", default=True, description="Enable X11 support")
depends_on("zlib-api")
depends_on("ncurses")
depends_on("curl")
depends_on("libxt", when="+X")
depends_on("libx11", when="+X")
depends_on("readline")
depends_on("libpng")
depends_on("perl-extutils-makemaker")
depends_on("py-numpy")
extends("python")
conflicts("%gcc@:4,10:")
# Do not create directory in $HOME during environment sourcing and use a
# predictable name for the file to be sourced.
patch("setup.patch")
# tcltk-configure: Remove redundant X11 header test because spack has X11
# headers in different directories
#
# xspec: The HEASOFT project provides a tarball of replacement files for
# Xspec, along with a Tcl patch utility. This is meant for updating a
# source tree in place with minimal rebuilding. This does not fit Spack's
# model so convert those to patches. These are kept in sync with what is on
# https://heasarc.gsfc.nasa.gov/docs/software/lheasoft/xanadu/xspec/issues/issues.html
with when("@6.29"):
patch("heasoft-6.29_tcltk-configure.patch")
patch("heasoft-6.29_xspec-12.12.0a.patch")
patch("heasoft-6.29_xspec-12.12.0b.patch")
patch("heasoft-6.29_xspec-12.12.0c.patch")
patch("heasoft-6.29_xspec-12.12.0d.patch")
patch("heasoft-6.29_xspec-12.12.0e.patch")
patch("heasoft-6.29_xspec-12.12.0f.patch")
patch("heasoft-6.29_xspec-12.12.0g.patch")
patch("heasoft-6.29_xspec-12.12.0ver.patch")
with when("@6.30"):
patch("heasoft-6.30_tcltk-configure.patch")
configure_directory = "BUILD_DIR"
parallel = False
def patch(self):
filter_file(
r"(--with-readline-library=)\\\$READLINE_DIR",
r"\1{0}".format(self.spec["readline"].libs.directories[0]),
join_path("tcltk", "BUILD_DIR", "hd_config_info"),
)
filter_file(
r"(--with-readline-includes=)\\\$READLINE_DIR",
r"\1{0}".format(join_path(self.spec["readline"].headers.directories[0], "readline")),
join_path("tcltk", "BUILD_DIR", "hd_config_info"),
)
if "+X" in self.spec:
filter_file(
r"(\s+XDIR => ).*",
r"\1'{0}',".format(self.spec["libx11"].libs.directories[0]),
join_path("tcltk", "PGPLOT-perl", "Makefile.PL"),
)
def configure_args(self):
config_args = [
"--with-png={0}".format(self.spec["libpng"].prefix),
"CPPFLAGS={0}".format(self.spec["zlib-api"].headers.include_flags),
"LDFLAGS={0}".format(self.spec["zlib-api"].libs.search_flags),
]
config_args += self.enable_or_disable("x", variant="X")
if "+X" in self.spec:
config_args.extend(
[
"--x-includes={0}".format(self.spec["libx11"].headers.directories[0]),
"--x-libraries={0}".format(self.spec["libx11"].libs.directories[0]),
]
)
return config_args
@run_after("install")
def generate_environment(self):
host_family = self.spec.target.family
host_platform = self.spec.platform
host_libc = os.confstr("CS_GNU_LIBC_VERSION").split()[1]
target = "{0}-pc-{1}-gnu-libc{2}".format(host_family, host_platform, host_libc)
headas_setup_file = join_path(self.spec.prefix, target, "BUILD_DIR", "headas-setup")
filter_file(
r"(^headas_config=).*",
r"\1{0}".format(join_path(self.prefix, "headas-config_spack")),
headas_setup_file,
)
filter_file(
r"(^flavor.*\n)",
r"\1HEADAS={0}".format(join_path(self.spec.prefix, target)) + "\n",
headas_setup_file,
)
headas_setup = Executable(headas_setup_file)
headas_setup("sh")
def setup_run_environment(self, env):
try:
env.extend(
EnvironmentModifications.from_sourcing_file(
join_path(self.spec.prefix, "headas-config_spack.sh"), clean=True
)
)
except Exception as e:
msg = "unexpected error when sourcing HEASOFT setup [{0}]"
tty.warn(msg.format(str(e)))