spack/var/spack/repos/builtin/packages/tk/package.py
Adam J. Stewart 92be358582
Python: fix +tkinter+tix support (#23980)
* Tcl: fix TCLLIBPATH

* Fix TCL|TK|TIX_LIBRARY paths

* Fix TCL_LIBRARY, no tcl8.6 subdir

* Don't rely on os.listdirs sorting

For tcl and tk, we also install the source directory, so there are
two init.tcl and tk.tcl locations. We want the one in lib/lib64,
which should come before the one in share.

* Add more patches

* Fix dylib on macOS

* Tk: add smoke tests

* Tix: add smoke test
2021-06-08 12:45:04 -05:00

131 lines
5.5 KiB
Python

# Copyright 2013-2021 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
from spack import *
class Tk(AutotoolsPackage, SourceforgePackage):
"""Tk is a graphical user interface toolkit that takes developing desktop
applications to a higher level than conventional approaches. Tk is the standard GUI
not only for Tcl, but for many other dynamic languages, and can produce rich, native
applications that run unchanged across Windows, Mac OS X, Linux and more."""
homepage = "https://www.tcl.tk"
sourceforge_mirror_path = "tcl/tk8.6.5-src.tar.gz"
version('8.6.11', sha256='5228a8187a7f70fa0791ef0f975270f068ba9557f57456f51eb02d9d4ea31282')
version('8.6.10', sha256='63df418a859d0a463347f95ded5cd88a3dd3aaa1ceecaeee362194bc30f3e386')
version('8.6.8', sha256='49e7bca08dde95195a27f594f7c850b088be357a7c7096e44e1158c7a5fd7b33')
version('8.6.6', sha256='d62c371a71b4744ed830e3c21d27968c31dba74dd2c45f36b9b071e6d88eb19d')
version('8.6.5', sha256='fbbd93541b4cd467841208643b4014c4543a54c3597586727f0ab128220d7946')
version('8.6.3', sha256='ba15d56ac27d8c0a7b1a983915a47e0f635199b9473cf6e10fbce1fc73fd8333')
version('8.5.19', sha256='407af1de167477d598bd6166d84459a3bdccc2fb349360706154e646a9620ffa')
variant('xft', default=True, description='Enable X FreeType')
variant('xss', default=True, description='Enable X Screen Saver')
extends('tcl', type=('build', 'link', 'run'))
depends_on('tcl@8.6:', type=('build', 'link', 'run'), when='@8.6:')
depends_on('libx11')
depends_on('libxft', when='+xft')
depends_on('libxscrnsaver', when='+xss')
configure_directory = 'unix'
# https://core.tcl-lang.org/tk/tktview/3598664fffffffffffff
# https://core.tcl-lang.org/tk/info/8b679f597b1d17ad
# https://core.tcl-lang.org/tk/info/997b17c343444e48
patch('https://raw.githubusercontent.com/macports/macports-ports/master/x11/tk/files/patch-unix-Makefile.in.diff',
sha256='54bba3d2b3550b7e2c636881c1a3acaf6e1eb743f314449a132864ff47fd0010',
level=0, when='@:8.6.11 platform=darwin')
patch('https://raw.githubusercontent.com/macports/macports-ports/master/x11/tk/files/patch-dyld_fallback_library_path.diff',
sha256='9ce6512f1928db9987986f4d3540207c39429395d5234bd6489ba9d86a6d9c31',
level=0, when='platform=darwin')
def configure_args(self):
spec = self.spec
config_args = [
'--with-tcl={0}'.format(spec['tcl'].libs.directories[0]),
'--x-includes={0}'.format(spec['libx11'].headers.directories[0]),
'--x-libraries={0}'.format(spec['libx11'].libs.directories[0])
]
config_args += self.enable_or_disable('xft')
config_args += self.enable_or_disable('xss')
return config_args
def install(self, spec, prefix):
with working_dir(self.build_directory):
make('install')
# Some applications like Expect require private Tk headers.
make('install-private-headers')
# Copy source to install tree
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 tkConfig
filter_file(
stage_src, installed_src,
join_path(self.spec['tk'].libs.directories[0], 'tkConfig.sh'))
@run_after('install')
def symlink_wish(self):
with working_dir(self.prefix.bin):
symlink('wish{0}'.format(self.version.up_to(2)), 'wish')
def test(self):
self.run_test(self.spec['tk'].command.path, ['-h'],
purpose='test wish command')
test_data_dir = self.test_suite.current_test_data_dir
test_file = test_data_dir.join('test.tcl')
self.run_test(self.spec['tcl'].command.path, test_file,
purpose='test that tk can be loaded')
@property
def command(self):
"""Returns the wish command.
Returns:
Executable: the wish command
"""
# Although we symlink wishX.Y to wish, we also need to support external
# installations that may not have this symlink, or may have multiple versions
# of Tk installed in the same directory.
return Executable(os.path.realpath(self.prefix.bin.join(
'wish{0}'.format(self.version.up_to(2)))))
@property
def libs(self):
return find_libraries(['libtk{0}'.format(self.version.up_to(2))],
root=self.prefix, recursive=True)
def setup_run_environment(self, env):
"""Set TK_LIBRARY to the directory containing tk.tcl.
For further info, see:
* https://www.tcl-lang.org/man/tcl/TkCmd/tkvars.htm
"""
# When using tkinter from within spack provided python+tkinter,
# python will not be able to find Tk unless TK_LIBRARY is set.
env.set('TK_LIBRARY', os.path.dirname(sorted(find(self.prefix, 'tk.tcl'))[0]))
def setup_dependent_build_environment(self, env, dependent_spec):
"""Set TK_LIBRARY to the directory containing tk.tcl.
For further info, see:
* https://www.tcl-lang.org/man/tcl/TkCmd/tkvars.htm
"""
env.set('TK_LIBRARY', os.path.dirname(sorted(find(self.prefix, 'tk.tcl'))[0]))