diff options
Diffstat (limited to 'var/spack/packages/tau/package.py')
-rw-r--r-- | var/spack/packages/tau/package.py | 122 |
1 files changed, 115 insertions, 7 deletions
diff --git a/var/spack/packages/tau/package.py b/var/spack/packages/tau/package.py index 048fac80aa..69f00ae4ea 100644 --- a/var/spack/packages/tau/package.py +++ b/var/spack/packages/tau/package.py @@ -1,32 +1,140 @@ +############################################################################## +# Copyright (c) 2013, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Written by Todd Gamblin, tgamblin@llnl.gov, All rights reserved. +# LLNL-CODE-647188 +# +# For details, see https://github.com/llnl/spack +# Please also see the LICENSE file for our notice and the LGPL. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License (as published by +# the Free Software Foundation) version 2.1 dated February 1999. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the IMPLIED WARRANTY OF +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the terms and +# conditions of the GNU General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +############################################################################## + from spack import * import os +import os.path + from llnl.util.filesystem import join_path class Tau(Package): - """A portable profiling and tracing toolkit for performance - analysis of parallel programs written in Fortran, C, C++, UPC, - Java, Python.""" + """ + A portable profiling and tracing toolkit for performance + analysis of parallel programs written in Fortran, C, C++, UPC, + Java, Python. + """ homepage = "http://www.cs.uoregon.edu/research/tau" - url = "http://www.cs.uoregon.edu/research/paracomp/tau/tauprofile/dist/tau-2.23.1.tar.gz" + url = "https://www.cs.uoregon.edu/research/tau/tau_releases/tau-2.25.tar.gz" + version('2.25', '46cd48fa3f3c4ce0197017b3158a2b43') + version('2.24.1', '6635ece6d1f08215b02f5d0b3c1e971b') + version('2.24', '57ce33539c187f2e5ec68f0367c76db4') version('2.23.1', '6593b47ae1e7a838e632652f0426fe72') + # FIXME : shmem variant missing + variant('download', default=True, description='Downloads and builds various dependencies') + variant('openmp', default=True, description='Use OpenMP threads') + variant('mpi', default=True, description='Specify use of TAU MPI wrapper library') + variant('phase', default=True, description='Generate phase based profiles') + variant('comm', default=True, description=' Generate profiles with MPI communicator info') + + depends_on('pdt') # Required for TAU instrumentation + depends_on('scorep') + #depends_on('otf2', when='%gcc') # FIXME : still missing logic for intel and other compilers + depends_on('binutils', when='~download') + depends_on('mpi', when='+mpi') + + def set_compiler_options(self): + + name = self.compiler.name # Name of the current toolchain + useropt = ["-O2", self.rpath_args] + + ########## + # Selecting a compiler with TAU configure is quite tricky: + # 1 - compilers are mapped to a given set of strings (and spack cc, cxx, etc. wrappers are not among them) + # 2 - absolute paths are not allowed + # 3 - the usual environment variables seems not to be checked ('CC', 'CXX' and 'FC') + # 4 - if no -cc=<compiler> -cxx=<compiler> is passed tau is built with system compiler silently + # (regardless of what %<compiler> is used in the spec) + # + # In the following we give TAU what he expects and put compilers into PATH + compiler_path = os.path.dirname(self.compiler.cc) + os.environ['PATH'] = ':'.join([compiler_path, os.environ['PATH']]) + compiler_options = ['-c++=%s' % self.compiler.cxx_names[0], + '-cc=%s' % self.compiler.cc_names[0]] + if self.compiler.fc: + compiler_options.append('-fortran=%s' % self.compiler.fc_names[0]) + # It turns out that some parts of the OTF support library in TAU are non-conformant, so if we want + # to compile them we must suppress some warnings. With Clang it seems impossible to do so, so OTF + # support is not built + #if name == 'gcc': + # useropt.append("-fpermissive") + ########## + + # Construct the string of custom compiler flags and append it to compiler related options + useropt = ' '.join(useropt) + useropt = "-useropt=%s" % useropt + compiler_options.append(useropt) + return compiler_options + def install(self, spec, prefix): # TAU isn't happy with directories that have '@' in the path. Sigh. change_sed_delimiter('@', ';', 'configure') change_sed_delimiter('@', ';', 'utils/FixMakefile') change_sed_delimiter('@', ';', 'utils/FixMakefile.sed.default') - # After that, it's relatively standard. - configure("-prefix=%s" % prefix) + # TAU configure, despite the name , seems to be a manually written script (nothing related to autotools). + # As such it has a few #peculiarities# that make this build quite hackish. + options = ["-prefix=%s" % prefix, + "-iowrapper", + "-pdt=%s" % spec['pdt'].prefix, + "-scorep=%s" % spec['scorep'].prefix] + # FIXME : I give up trying to compile OTF support with clang, as it seems there is no easy way to ignore errors + #if 'otf2' in spec: + # options.append("-otf=%s" % spec['otf2'].prefix) + # If download is active, download and build suggested dependencies + if '+download' in spec: + options.extend(['-bfd=download', + '-unwind=download', + '-asmdex=download']) + else: + options.extend(["-bfd=%s" % spec['binutils'].prefix]) + # TODO : unwind and asmdex are still missing + + if '+openmp' in spec: + options.append('-openmp') + + if '+mpi' in spec: + options.append('-mpi') + + if '+phase' in spec: + options.append('-PROFILEPHASE') + + if '+comm' in spec: + options.append('-PROFILECOMMUNICATORS') + + compiler_specific_options = self.set_compiler_options() + options.extend(compiler_specific_options) + configure(*options) make("install") # Link arch-specific directories into prefix since there is # only one arch per prefix the way spack installs. self.link_tau_arch_dirs() - def link_tau_arch_dirs(self): for subdir in os.listdir(self.prefix): for d in ('bin', 'lib'): |