diff options
Diffstat (limited to 'var/spack/repos/builtin/packages/tcl')
-rw-r--r-- | var/spack/repos/builtin/packages/tcl/package.py | 123 |
1 files changed, 98 insertions, 25 deletions
diff --git a/var/spack/repos/builtin/packages/tcl/package.py b/var/spack/repos/builtin/packages/tcl/package.py index 219c63e62b..7e2d57c764 100644 --- a/var/spack/repos/builtin/packages/tcl/package.py +++ b/var/spack/repos/builtin/packages/tcl/package.py @@ -1,27 +1,11 @@ -############################################################################## -# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. -# Produced at the Lawrence Livermore National Laboratory. +# Copyright 2013-2018 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. # -# This file is part of Spack. -# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved. -# LLNL-CODE-647188 -# -# For details, see https://github.com/spack/spack -# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as -# published by the Free Software Foundation) version 2.1, 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 Lesser 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 -############################################################################## +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +import os + +from spack.util.environment import is_system_path from spack import * @@ -36,12 +20,15 @@ class Tcl(AutotoolsPackage): homepage = "http://www.tcl.tk" url = "http://prdownloads.sourceforge.net/tcl/tcl8.6.5-src.tar.gz" + version('8.6.8', '81656d3367af032e0ae6157eff134f89') version('8.6.6', '5193aea8107839a79df8ac709552ecb7') version('8.6.5', '0e6426a4ca9401825fbc6ecf3d89a326') version('8.6.4', 'd7cbb91f1ded1919370a30edd1534304') version('8.6.3', 'db382feca91754b7f93da16dc4cdad1f') version('8.5.19', '0e6426a4ca9401825fbc6ecf3d89a326') + extendable = True + depends_on('zlib') configure_directory = 'unix' @@ -49,17 +36,103 @@ class Tcl(AutotoolsPackage): def setup_environment(self, spack_env, run_env): # When using Tkinter from within spack provided python+tk, python # will not be able to find Tcl/Tk unless TCL_LIBRARY is set. - run_env.set('TCL_LIBRARY', join_path(self.prefix.lib, 'tcl{0}'.format( - self.spec.version.up_to(2)))) + run_env.set('TCL_LIBRARY', join_path(self.prefix, self.tcl_lib_dir)) def install(self, spec, prefix): with working_dir(self.build_directory): make('install') + # http://wiki.tcl.tk/17463 + if self.spec.satisfies('@8.6:'): + make('install-headers') + # Some applications like Expect require private Tcl headers. make('install-private-headers') + # Copy source to install tree + # A user-provided install option might re-do this + # https://github.com/spack/spack/pull/4102/files + installed_src = join_path( + self.spec.prefix, 'share', self.name, 'src') + stage_src = os.path.realpath(self.stage.source_path) + install_tree(stage_src, installed_src) + + # Replace stage dir -> installed src dir in tclConfig + filter_file( + stage_src, installed_src, + join_path(self.spec.prefix, 'lib', 'tclConfig.sh')) + + # Don't install binaries in src/ tree + with working_dir(join_path(installed_src, self.configure_directory)): + make('clean') + @run_after('install') def symlink_tclsh(self): with working_dir(self.prefix.bin): symlink('tclsh{0}'.format(self.version.up_to(2)), 'tclsh') + + # ======================================================================== + # Set up environment to make install easy for tcl extensions. + # ======================================================================== + + @property + def libs(self): + return LibraryList([]) + + @property + def command(self): + """Returns the tclsh command. + + :returns: The tclsh command + :rtype: Executable + """ + return Executable(os.path.realpath(self.prefix.bin.tclsh)) + + @property + def tcl_lib_dir(self): + """The Tcl version-specific library directory where all extensions are + installed.""" + return 'lib' + + @property + def tcl_builtin_lib_dir(self): + """The Tcl version-specific library directory where all builtin + extensions are installed.""" + return join_path(self.tcl_lib_dir, + 'tcl{0}'.format(self.version.up_to(2))) + + def setup_dependent_environment(self, spack_env, run_env, dependent_spec): + """Set TCLLIBPATH to include the tcl-shipped directory for + extensions and any other tcl extension it depends on. + For further info see: https://wiki.tcl.tk/1787""" + + # If we set TCLLIBPATH, we must also ensure that the corresponding + # tcl is found in the build environment. This to prevent cases + # where a system provided tcl is run against the standard libraries + # of a Spack built tcl. See issue #7128 that relates to python but + # it boils down to the same situation we have here. + path = os.path.dirname(self.command.path) + if not is_system_path(path): + spack_env.prepend_path('PATH', path) + + tcl_paths = [join_path(self.prefix, self.tcl_builtin_lib_dir)] + + for d in dependent_spec.traverse(deptype=('build', 'run', 'test')): + if d.package.extends(self.spec): + tcl_paths.append(join_path(d.prefix, self.tcl_lib_dir)) + + # WARNING: paths in $TCLLIBPATH must be *space* separated, + # its value is meant to be a Tcl list, *not* an env list + # as explained here: https://wiki.tcl.tk/1787: + # "TCLLIBPATH is a Tcl list, not some platform-specific + # colon-separated or semi-colon separated format" + tcllibpath = ' '.join(tcl_paths) + spack_env.set('TCLLIBPATH', tcllibpath) + + # For run time environment set only the path for + # dependent_spec and prepend it to TCLLIBPATH + if dependent_spec.package.extends(self.spec): + dependent_tcllibpath = join_path(dependent_spec.prefix, + self.tcl_lib_dir) + run_env.prepend_path('TCLLIBPATH', dependent_tcllibpath, + separator=' ') |