From 604b75c1f9d53e0f094a22d1167558aa4df566af Mon Sep 17 00:00:00 2001 From: Gregory Lee Date: Thu, 9 Mar 2017 10:36:32 -0800 Subject: created elf virtual package and updated dependent packages (#3317) * created elf virtual package and updated dependent packages * added `hide_files` context manager to handle moving files. --- lib/spack/llnl/util/filesystem.py | 13 +++++ .../repos/builtin/packages/callpath/package.py | 7 ++- .../repos/builtin/packages/dyninst/package.py | 13 ++--- .../repos/builtin/packages/elfutils/package.py | 2 +- var/spack/repos/builtin/packages/extrae/package.py | 21 ++++++- .../repos/builtin/packages/launchmon/package.py | 3 + .../repos/builtin/packages/libdwarf/package.py | 65 ++++++++++++++-------- var/spack/repos/builtin/packages/libelf/package.py | 2 +- .../builtin/packages/openspeedshop/package.py | 4 +- var/spack/repos/builtin/packages/stat/package.py | 5 +- 10 files changed, 91 insertions(+), 44 deletions(-) diff --git a/lib/spack/llnl/util/filesystem.py b/lib/spack/llnl/util/filesystem.py index 7f6773266d..f456a5edf1 100644 --- a/lib/spack/llnl/util/filesystem.py +++ b/lib/spack/llnl/util/filesystem.py @@ -50,6 +50,7 @@ __all__ = [ 'fix_darwin_install_name', 'force_remove', 'force_symlink', + 'hide_files', 'install', 'install_tree', 'is_exe', @@ -257,6 +258,18 @@ def working_dir(dirname, **kwargs): os.chdir(orig_dir) +@contextmanager +def hide_files(*file_list): + try: + baks = ['%s.bak' % f for f in file_list] + for f, bak in zip(file_list, baks): + shutil.move(f, bak) + yield + finally: + for f, bak in zip(file_list, baks): + shutil.move(bak, f) + + def touch(path): """Creates an empty file at the specified path.""" with open(path, 'a'): diff --git a/var/spack/repos/builtin/packages/callpath/package.py b/var/spack/repos/builtin/packages/callpath/package.py index f8227fa49e..27a04393f5 100644 --- a/var/spack/repos/builtin/packages/callpath/package.py +++ b/var/spack/repos/builtin/packages/callpath/package.py @@ -35,7 +35,7 @@ class Callpath(Package): version('1.0.2', 'b1994d5ee7c7db9d27586fc2dcf8f373') version('1.0.1', '0047983d2a52c5c335f8ba7f5bab2325') - depends_on("libelf") + depends_on("elf", type="link") depends_on("libdwarf") depends_on("dyninst") depends_on("adept-utils") @@ -44,6 +44,9 @@ class Callpath(Package): def install(self, spec, prefix): # TODO: offer options for the walker used. - cmake('.', "-DCALLPATH_WALKER=dyninst", *std_cmake_args) + cmake_args = std_cmake_args + if spec.satisfies("^dyninst@9.3.0:"): + cmake_args.append("-DCMAKE_CXX_FLAGS='-std=c++11 -fpermissive'") + cmake('.', "-DCALLPATH_WALKER=dyninst", *cmake_args) make() make("install") diff --git a/var/spack/repos/builtin/packages/dyninst/package.py b/var/spack/repos/builtin/packages/dyninst/package.py index 420ab0fc68..8f9a2ffb4a 100644 --- a/var/spack/repos/builtin/packages/dyninst/package.py +++ b/var/spack/repos/builtin/packages/dyninst/package.py @@ -33,13 +33,7 @@ class Dyninst(Package): url = "https://github.com/dyninst/dyninst/archive/v9.2.0.tar.gz" list_url = "http://www.dyninst.org/downloads/dyninst-8.x" - # version 9.2.1b was the latest git commit when trying to port to a - # ppc64le system to get fixes in computeAddrWidth independent of - # endianness. This version can be removed if the next release includes - # this change. The actual commit was - # b8596ad4023ec40ac07e669ff8ea3ec06e262703 - version('9.2.1b', git='https://github.com/dyninst/dyninst.git', - commit='859cb778e20b619443c943c96dd1851da763142b') + version('9.3.0', 'edde7847dc673ca69bd59412af572450') version('9.2.0', 'ad023f85e8e57837ed9de073b59d6bab', url="https://github.com/dyninst/dyninst/archive/v9.2.0.tar.gz") version('9.1.0', '5c64b77521457199db44bec82e4988ac', @@ -54,7 +48,8 @@ class Dyninst(Package): variant('stat_dysect', default=False, description="patch for STAT's DySectAPI") - depends_on("libelf") + depends_on("elf@0", type='link', when='@:9.2.99') + depends_on("elf@1", type='link', when='@9.3.0:') depends_on("libdwarf") depends_on("boost@1.42:") depends_on('cmake', type='build') @@ -70,7 +65,7 @@ class Dyninst(Package): make("install") return - libelf = spec['libelf'].prefix + libelf = spec['elf'].prefix libdwarf = spec['libdwarf'].prefix with working_dir('spack-build', create=True): diff --git a/var/spack/repos/builtin/packages/elfutils/package.py b/var/spack/repos/builtin/packages/elfutils/package.py index 4a91c7db30..15ae077bea 100644 --- a/var/spack/repos/builtin/packages/elfutils/package.py +++ b/var/spack/repos/builtin/packages/elfutils/package.py @@ -43,7 +43,7 @@ class Elfutils(AutotoolsPackage): git='git://git.fedorahosted.org/git/elfutils.git', tag='elfutils-0.163') - provides('elf') + provides('elf@1') def configure_args(self): return ['--enable-maintainer-mode'] diff --git a/var/spack/repos/builtin/packages/extrae/package.py b/var/spack/repos/builtin/packages/extrae/package.py index 2a2b4df5bf..5a596ab9f7 100644 --- a/var/spack/repos/builtin/packages/extrae/package.py +++ b/var/spack/repos/builtin/packages/extrae/package.py @@ -62,8 +62,12 @@ class Extrae(Package): depends_on("boost") depends_on("libdwarf") depends_on("papi") - depends_on("libelf") + depends_on("elf", type="link") depends_on("libxml2") + + # gettext dependency added to find -lintl + # https://www.gnu.org/software/gettext/FAQ.html#integrating_undefined + depends_on("gettext") depends_on("binutils+libiberty") def install(self, spec, prefix): @@ -74,6 +78,16 @@ class Extrae(Package): elif 'mvapich2' in spec: mpi = spec['mvapich2'] + extra_config_args = [] + + # This was added due to configure failure + # https://www.gnu.org/software/gettext/FAQ.html#integrating_undefined + extra_config_args.append('LDFLAGS=-lintl') + + if spec.satisfies("^dyninst@9.3.0:"): + make.add_default_arg('CXXFLAGS=-std=c++11') + extra_config_args.append('CXXFLAGS=-std=c++11') + configure("--prefix=%s" % prefix, "--with-mpi=%s" % mpi.prefix, "--with-unwind=%s" % spec['libunwind'].prefix, @@ -83,10 +97,11 @@ class Extrae(Package): "--with-papi=%s" % spec['papi'].prefix, "--with-dyninst-headers=%s" % spec[ 'dyninst'].prefix.include, - "--with-elf=%s" % spec['libelf'].prefix, + "--with-elf=%s" % spec['elf'].prefix, "--with-xml-prefix=%s" % spec['libxml2'].prefix, "--with-binutils=%s" % spec['binutils'].prefix, - "--with-dyninst-libs=%s" % spec['dyninst'].prefix.lib) + "--with-dyninst-libs=%s" % spec['dyninst'].prefix.lib, + *extra_config_args) make() make("install", parallel=False) diff --git a/var/spack/repos/builtin/packages/launchmon/package.py b/var/spack/repos/builtin/packages/launchmon/package.py index c2b289da4f..c7b44e35df 100644 --- a/var/spack/repos/builtin/packages/launchmon/package.py +++ b/var/spack/repos/builtin/packages/launchmon/package.py @@ -38,6 +38,9 @@ class Launchmon(Package): depends_on('libtool', type='build') depends_on('libgcrypt') depends_on('libgpg-error') + depends_on("elf", type='link') + depends_on("boost") + depends_on("spectrum-mpi", when='arch=ppc64le') def install(self, spec, prefix): configure( diff --git a/var/spack/repos/builtin/packages/libdwarf/package.py b/var/spack/repos/builtin/packages/libdwarf/package.py index 594271f655..fe131a842c 100644 --- a/var/spack/repos/builtin/packages/libdwarf/package.py +++ b/var/spack/repos/builtin/packages/libdwarf/package.py @@ -48,37 +48,54 @@ class Libdwarf(Package): version('20130729', '4cc5e48693f7b93b7aa0261e63c0e21d') version('20130207', '64b42692e947d5180e162e46c689dfbf') version('20130126', 'ded74a5e90edb5a12aac3c29d260c5db') - depends_on("libelf") + depends_on("elf", type='link') parallel = False def install(self, spec, prefix): - # dwarf build does not set arguments for ar properly - make.add_default_arg('ARFLAGS=rcs') - # Dwarf doesn't provide an install, so we have to do it. - mkdirp(prefix.bin, prefix.include, prefix.lib, prefix.man1) + # elfutils contains a dwarf.h that conflicts with libdwarf's + # TODO: we should remove this when we can modify the include order + hide_list = [] + if spec.satisfies('^elfutils'): + dwarf_h = join_path(spec['elfutils'].prefix, 'include/dwarf.h') + hide_list.append(dwarf_h) + with hide_files(*hide_list): + # dwarf build does not set arguments for ar properly + make.add_default_arg('ARFLAGS=rcs') - with working_dir('libdwarf'): - configure("--prefix=" + prefix, "--enable-shared") - make() + # Dwarf doesn't provide an install, so we have to do it. + mkdirp(prefix.bin, prefix.include, prefix.lib, prefix.man1) - install('libdwarf.a', prefix.lib) - install('libdwarf.so', prefix.lib) - install('libdwarf.h', prefix.include) - install('dwarf.h', prefix.include) + with working_dir('libdwarf'): + extra_config_args = [] - if spec.satisfies('@20130126:20130729'): - dwarfdump_dir = 'dwarfdump2' - else: - dwarfdump_dir = 'dwarfdump' - with working_dir(dwarfdump_dir): - configure("--prefix=" + prefix) + # this is to prevent picking up system /usr/include/libelf.h + if spec.satisfies('^libelf'): + libelf_inc_dir = join_path(spec['libelf'].prefix, + 'include/libelf') + extra_config_args.append('CFLAGS=-I{0}'.format( + libelf_inc_dir)) + configure("--prefix=" + prefix, "--enable-shared", + *extra_config_args) + make() - # This makefile has strings of copy commands that - # cause a race in parallel - make(parallel=False) + install('libdwarf.a', prefix.lib) + install('libdwarf.so', prefix.lib) + install('libdwarf.h', prefix.include) + install('dwarf.h', prefix.include) - install('dwarfdump', prefix.bin) - install('dwarfdump.conf', prefix.lib) - install('dwarfdump.1', prefix.man1) + if spec.satisfies('@20130126:20130729'): + dwarfdump_dir = 'dwarfdump2' + else: + dwarfdump_dir = 'dwarfdump' + with working_dir(dwarfdump_dir): + configure("--prefix=" + prefix) + + # This makefile has strings of copy commands that + # cause a race in parallel + make(parallel=False) + + install('dwarfdump', prefix.bin) + install('dwarfdump.conf', prefix.lib) + install('dwarfdump.1', prefix.man1) diff --git a/var/spack/repos/builtin/packages/libelf/package.py b/var/spack/repos/builtin/packages/libelf/package.py index 5af4ab705d..68db7b99c2 100644 --- a/var/spack/repos/builtin/packages/libelf/package.py +++ b/var/spack/repos/builtin/packages/libelf/package.py @@ -37,7 +37,7 @@ class Libelf(AutotoolsPackage): version('0.8.13', '4136d7b4c04df68b686570afa26988ac') version('0.8.12', 'e21f8273d9f5f6d43a59878dc274fec7') - provides('elf') + provides('elf@0') def configure_args(self): args = ["--enable-shared", diff --git a/var/spack/repos/builtin/packages/openspeedshop/package.py b/var/spack/repos/builtin/packages/openspeedshop/package.py index ae2655735a..c4b150f56c 100644 --- a/var/spack/repos/builtin/packages/openspeedshop/package.py +++ b/var/spack/repos/builtin/packages/openspeedshop/package.py @@ -60,7 +60,7 @@ class Openspeedshop(Package): """ homepage = "http://www.openspeedshop.org" - url = "https://github.com/OpenSpeedShop" + url = "https://github.com/OpenSpeedShop" version('2.2', '16cb051179c2038de4e8a845edf1d573') # Use when the git repository is available version('2.3', branch='master', @@ -115,6 +115,8 @@ class Openspeedshop(Package): depends_on("bison", type='build') depends_on("flex", type='build') depends_on("binutils@2.24+krellpatch", type='build') + # TODO: when using dyninst@9.3.0:, we will need to use elf + # depends_on("elf", type="link") depends_on("libelf") depends_on("libdwarf") depends_on("sqlite") diff --git a/var/spack/repos/builtin/packages/stat/package.py b/var/spack/repos/builtin/packages/stat/package.py index c511fcee70..aacebfd8c8 100644 --- a/var/spack/repos/builtin/packages/stat/package.py +++ b/var/spack/repos/builtin/packages/stat/package.py @@ -31,11 +31,11 @@ class Stat(Package): homepage = "http://paradyn.org/STAT/STAT.html" url = "https://github.com/lee218llnl/stat/archive/v2.0.0.tar.gz" + version('3.0.0', 'a97cb235c266371c4a26329112de48a2', + url='https://github.com/LLNL/STAT/releases/download/v3.0.0/STAT-3.0.0.tar.gz') version('2.2.0', '26bd69dd57a15afdd5d0ebdb0b7fb6fc') version('2.1.0', 'ece26beaf057aa9134d62adcdda1ba91') version('2.0.0', 'c7494210b0ba26b577171b92838e1a9b') - version('3.0.0', 'a97cb235c266371c4a26329112de48a2', - url='https://github.com/LLNL/STAT/releases/download/v3.0.0/STAT-3.0.0.tar.gz') # TODO: dysect requires Dyninst patch for version 3.0.0b variant('dysect', default=False, description="enable DySectAPI") @@ -44,7 +44,6 @@ class Stat(Package): depends_on('autoconf', type='build') depends_on('automake', type='build') depends_on('libtool', type='build') - depends_on('libelf') depends_on('libdwarf') depends_on('dyninst', when='~dysect') depends_on('dyninst@8.2.1+stat_dysect', when='+dysect') -- cgit v1.2.3-70-g09d2