
* 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
131 lines
5.5 KiB
Python
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]))
|