Files
spack/var/spack/repos/builtin/packages/dyninst/package.py
Massimiliano Culpo 0139288ced Add a "requires" directive, extend functionality of package requirements (#36286)
Add a "require" directive to packages, which functions exactly like
requirements specified in packages.yaml (uses the same fact-generation
logic); update both to allow making the requirement conditional.

* Packages may now use "require" to add constraints. This can be useful
  for something like "require(%gcc)" (where before we had to add a
  conflict for every compiler except gcc).
* Requirements (in packages.yaml or in a "require" directive) can be
  conditional on a spec, e.g. "require(%gcc, when=@1.0.0)" (version
  1.0.0 can only build with gcc).
* Requirements may include a message which clarifies why they are needed.
  The concretizer assigns a high priority to errors which generate these
  messages (in particular over errors for unsatisfied requirements that
  do not produce messages, but also over a number of more-generic
  errors).
2023-05-08 10:12:26 -07:00

186 lines
7.3 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 os.path
from spack.package import *
class Dyninst(CMakePackage):
"""API for dynamic binary instrumentation. Modify programs while they
are executing without recompiling, re-linking, or re-executing."""
homepage = "https://dyninst.org"
url = "https://github.com/dyninst/dyninst/archive/refs/tags/v12.2.0.tar.gz"
git = "https://github.com/dyninst/dyninst.git"
maintainers("hainest")
tags = ["e4s"]
version("master", branch="master")
version("12.3.0", sha256="956b0378d2badb765a7e677c0b66c0b8b8cacca7631222bfe7a27b369abf7dd4")
version("12.2.1", sha256="c304af3c6191e92acd27350fd9b7b02899767a0e38abb3a08a378abe01d1ef01")
version("12.2.0", sha256="84c37efc1b220110af03f8fbb6ab295628b445c873b5115db91b64443e445a5d")
version("12.1.0", sha256="c71c0caed12b0b65bbbd09896d0b25dde3b9062b5b2eb8426c86baa50e7af2fb")
version("12.0.1", sha256="0d940dffd73711eb973e90d2a6ecaeb368b2b025c7db9a1cfa61716e73909041")
version("12.0.0", sha256="829f9340cb1550efa0b69a7b4db36975ede9c70d7c0ecbad2fda91ffcec0609a")
version("11.0.1", sha256="e80c7c786b25f931890145dd349c576f49b6031c2cad4d4c722cbcc7e9550b73")
version("11.0.0", sha256="3b3fd2743d9312e9cb9770c8c520dd3d0730dc90584e28024664cda50f00e3b9")
version("10.2.1", sha256="8077c6c7a12577d2ffdcd07521c1eb1b7367da94d9a7ef10bf14053aeaae7ba1")
version("10.2.0", sha256="4212b93bef4563c7de7dce4258e899bcde52315a571087e87fde9f8040123b43")
version("10.1.0", sha256="4a121d70c1bb020408a7a697d74602e18250c3c85800f230566fcccd593c0129")
version("10.0.0", sha256="542fccf5c57c4fe784b1a9a9e3db01d40b16ad04e7174dc6f7eb23440485ba06")
version("9.3.2", tag="v9.3.2", deprecated=True)
version("9.3.0", tag="v9.3.0", deprecated=True)
version("9.2.0", tag="v9.2.0", deprecated=True)
version("9.1.0", tag="v9.1.0", deprecated=True)
version("8.2.1", tag="v8.2.1", deprecated=True)
variant(
"openmp",
default=True,
description="Enable OpenMP support for ParseAPI " "(version 10.0.0 or later)",
)
variant("static", default=False, description="Build static libraries")
variant("stat_dysect", default=False, description="Patch for STAT's DySectAPI")
boost_libs = "+atomic+chrono+date_time+filesystem+system+thread+timer"
"+container+random+exception"
depends_on("boost@1.61.0:" + boost_libs, when="@10.1.0:")
depends_on("boost@1.61.0:1.69" + boost_libs, when="@:10.0")
depends_on("boost@1.67.0:" + boost_libs, when="@11.0.0:")
depends_on("boost@1.70.0:" + boost_libs, when="@12:")
depends_on("libiberty+pic")
# Dyninst uses elfutils starting with 9.3.0, and used libelf
# before that.
# NB: Parallel DWARF parsing in Dyninst 10.2.0 requires a thread-
# safe libdw
depends_on("elfutils@0.186:", type="link", when="@12.0.1:")
depends_on("elfutils@0.178:", type="link", when="@10.2.0:")
depends_on("elfutils", type="link", when="@9.3.0:10.1")
depends_on("libelf", type="link", when="@:9.2")
# Dyninst uses libdw from elfutils starting with 10.0, and used
# libdwarf before that.
depends_on("libdwarf", when="@:9")
# findtbb.cmake in the dynist repo does not work with recent tbb
# package layout. Need to use tbb provided config instead.
conflicts("intel-tbb@2021.1:")
conflicts("intel-oneapi-tbb@2021.1:")
conflicts("intel-parallel-studio", when="@12.0.0:")
depends_on("tbb@2018.6.0:", when="@10.0.0:")
depends_on("cmake@3.4.0:", type="build", when="@10.1.0:")
depends_on("cmake@3.0.0:", type="build", when="@10.0.0:10.0")
depends_on("cmake@2.8:", type="build", when="@:9")
patch("stat_dysect.patch", when="+stat_dysect")
patch("stackanalysis_h.patch", when="@9.2.0")
patch("v9.3.2-auto.patch", when="@9.3.2 %gcc@:4.7")
patch("tribool.patch", when="@9.3.0:10.0.0 ^boost@1.69:")
requires("%gcc", msg="dyninst builds only with GCC")
# No Mac support (including apple-clang)
conflicts("platform=darwin", msg="macOS is not supported")
# Version 11.0 requires a C++11-compliant ABI
conflicts("%gcc@:5", when="@11.0.0:")
# Versions 9.3.x used cotire, but have no knob to turn it off.
# Cotire has no real use for one-time builds and can break
# parallel builds with both static and shared libs.
@when("@9.3.0:9.3")
def patch(self):
filter_file("USE_COTIRE true", "USE_COTIRE false", "cmake/shared.cmake")
# New style cmake args, starting with 10.1.
@when("@10.1.0:")
def cmake_args(self):
spec = self.spec
args = [
"-DBoost_ROOT_DIR=%s" % spec["boost"].prefix,
"-DElfUtils_ROOT_DIR=%s" % spec["elf"].prefix,
"-DLibIberty_ROOT_DIR=%s" % spec["libiberty"].prefix,
"-DTBB_ROOT_DIR=%s" % spec["tbb"].prefix,
self.define("LibIberty_LIBRARIES", spec["libiberty"].libs),
]
if "+openmp" in spec:
args.append("-DUSE_OpenMP=ON")
else:
args.append("-DUSE_OpenMP=OFF")
if "+static" in spec:
args.append("-DENABLE_STATIC_LIBS=YES")
else:
args.append("-DENABLE_STATIC_LIBS=NO")
# Make sure Dyninst doesn't try to build its own dependencies
# outside of Spack
if spec.satisfies("@10.2.0:"):
args.append("-DSTERILE_BUILD=ON")
return args
# Old style cmake args, up through 10.0.
@when("@:10.0")
def cmake_args(self):
spec = self.spec
# Elf -- the directory containing libelf.h.
elf = spec["elf"].prefix
elf_include = os.path.dirname(find_headers("libelf", elf.include, recursive=True)[0])
# Dwarf -- the directory containing elfutils/libdw.h or
# libdwarf.h, and the path to libdw.so or libdwarf.so.
if spec.satisfies("@10.0.0:"):
dwarf_include = elf.include
dwarf_lib = find_libraries("libdw", elf, recursive=True)
else:
dwarf_include = spec["libdwarf"].prefix.include
dwarf_lib = spec["libdwarf"].libs
args = [
"-DPATH_BOOST=%s" % spec["boost"].prefix,
"-DIBERTY_LIBRARIES=%s" % spec["libiberty"].libs,
"-DLIBELF_INCLUDE_DIR=%s" % elf_include,
"-DLIBELF_LIBRARIES=%s" % spec["elf"].libs,
"-DLIBDWARF_INCLUDE_DIR=%s" % dwarf_include,
"-DLIBDWARF_LIBRARIES=%s" % dwarf_lib,
]
# TBB include and lib directories, version 10.x or later.
if spec.satisfies("@10.0.0:"):
args.extend(
[
"-DTBB_INCLUDE_DIRS=%s" % spec["tbb"].prefix.include,
"-DTBB_LIBRARY=%s" % spec["tbb"].prefix.lib,
]
)
# Openmp applies to version 10.x or later.
if spec.satisfies("@10.0.0:"):
if "+openmp" in spec:
args.append("-DUSE_OpenMP=ON")
else:
args.append("-DUSE_OpenMP=OFF")
# Static libs started with version 9.1.0.
if spec.satisfies("@9.1.0:"):
if "+static" in spec:
args.append("-DENABLE_STATIC_LIBS=1")
else:
args.append("-DENABLE_STATIC_LIBS=NO")
return args