summaryrefslogtreecommitdiff
path: root/var/spack/repos/builtin/packages/dyninst/package.py
diff options
context:
space:
mode:
Diffstat (limited to 'var/spack/repos/builtin/packages/dyninst/package.py')
-rw-r--r--var/spack/repos/builtin/packages/dyninst/package.py155
1 files changed, 86 insertions, 69 deletions
diff --git a/var/spack/repos/builtin/packages/dyninst/package.py b/var/spack/repos/builtin/packages/dyninst/package.py
index 9d9ab52669..177af9bacf 100644
--- a/var/spack/repos/builtin/packages/dyninst/package.py
+++ b/var/spack/repos/builtin/packages/dyninst/package.py
@@ -4,9 +4,10 @@
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
from spack import *
+import os.path
-class Dyninst(Package):
+class Dyninst(CMakePackage):
"""API for dynamic binary instrumentation. Modify programs while they
are executing without recompiling, re-linking, or re-executing."""
@@ -20,78 +21,94 @@ class Dyninst(Package):
version('9.2.0', tag='v9.2.0')
version('9.1.0', tag='v9.1.0')
version('8.2.1', tag='v8.2.1')
- version('8.1.2', tag='v8.1.2')
- version('8.1.1', tag='v8.1.1')
+
+ 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")
-
- # Dyninst depends on libelf and libdwarf prior to @9.3.0
- # Dyninst depends on elfutils and libdwarf from @9.3.0 to but
- # not including @develop
- # Dyninst depends on elfutils and elfutils libdw from @develop forward
- # elf@0 is an abstaction for libelf
- # elf@1 is an abstaction for elfutils
- depends_on("elf@0", type='link', when='@:9.2.99')
- # The sorting algorithm puts numbered releases as newer than alphabetic
- # releases, but spack has special logic in place to ensure that
- # develop is considered newer than all other releases.
- # So, develop is included in the elf@1 line below.
- depends_on("elf@1", type='link', when='@9.3.0:')
- depends_on("libdwarf", when='@:9')
- depends_on("boost@1.42:")
+ description="Patch for STAT's DySectAPI")
+
+ boost_libs = '+atomic+chrono+date_time+filesystem+system+thread+timer'
+
+ depends_on('boost@1.61.0:' + boost_libs)
depends_on('libiberty+pic')
- depends_on("tbb@2018.6:", when='@develop')
- depends_on("tbb@2018.6:", when='@10:')
- depends_on('cmake', type='build')
+
+ # Dyninst uses elf@1 (elfutils) starting with 9.3.0, and used
+ # elf@0 (libelf) before that.
+ depends_on('elf@1', type='link', when='@9.3.0:')
+ depends_on('elf@0', type='link', when='@:9.2.99')
+
+ # Dyninst uses libdw from elfutils (same elf@1) starting with
+ # 10.x, and used libdwarf before that.
+ depends_on('libdwarf', when='@:9.99')
+
+ depends_on('tbb@2018.6:', when='@10.0:')
+
+ depends_on('cmake@3.0:', type='build', when='@10.0:')
+ depends_on('cmake@2.8:', type='build', when='@:9.99')
patch('stat_dysect.patch', when='+stat_dysect')
patch('stackanalysis_h.patch', when='@9.2.0')
- # new version uses cmake
- def install(self, spec, prefix):
- if spec.satisfies('@:8.1'):
- configure("--prefix=" + prefix)
- make()
- make("install")
- return
-
- libelf = spec['elf'].prefix
- if spec.satisfies('@:9'):
- libdwarf = spec['libdwarf'].prefix
-
- with working_dir('spack-build', create=True):
- args = ['..',
- '-DBoost_INCLUDE_DIR=%s' % spec['boost'].prefix.include,
- '-DBoost_LIBRARY_DIR=%s' % spec['boost'].prefix.lib,
- '-DBoost_NO_SYSTEM_PATHS=TRUE',
- '-DLIBELF_INCLUDE_DIR=%s' % join_path(
- libelf.include, 'libelf'),
- '-DLIBELF_LIBRARIES=%s' % join_path(
- libelf.lib, "libelf." + dso_suffix)]
- if spec.satisfies('@:9'):
- args.append('-DLIBDWARF_INCLUDE_DIR=%s' % libdwarf.include)
- args.append('-DLIBDWARF_LIBRARIES=%s' % join_path(
- libdwarf.lib, "libdwarf." + dso_suffix))
- # For @develop + use elfutils libdw, libelf is an abstraction
- # we are really using elfutils here
- if spec.satisfies('@develop') or spec.satisfies('@10:'):
- tbb = spec['tbb'].prefix
- args.append('-DTBB_INCLUDE_DIRS=%s' % tbb.include)
- args.append('-DTBB_LIBRARIES=%s' % join_path(
- tbb.lib, "libtbb." + dso_suffix))
- args.append('-DLIBDWARF_INCLUDE_DIR=%s' % libelf.include)
- args.append('-DLIBDWARF_LIBRARIES=%s' % join_path(
- libelf.lib, "libdw." + dso_suffix))
- if spec.satisfies('arch=linux-redhat7-ppc64le'):
- args.append('-Darch_ppc64_little_endian=1')
- args += std_cmake_args
- cmake(*args)
- make()
- make("install")
-
- @when('@:8.1')
- def install(self, spec, prefix):
- configure("--prefix=" + prefix)
- make()
- make("install")
+ # 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.99')
+ def patch(self):
+ filter_file('USE_COTIRE true', 'USE_COTIRE false',
+ 'cmake/shared.cmake')
+
+ 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