为 macOS 查找预编译或编译 Tcl/Tk 个框架
Find precompiled or compile Tcl/Tk Frameworks for macOS
我是 Tcl/Tk 的初学者,但我已经需要部署一个带有 Tcl/Tk 框架的 .app(因为 .app 需要依赖它自己的 Tcl/Tk 版本,而不是 macOS 标准版和旧版 Tcl/Tk)。有人能告诉我在哪里可以找到预编译的框架或有关如何在 macOS 上编译它们的分步指南吗?
这方面找了半天也没什么收获。我想我的需求一点也不特别,因为我看到许多 .apps 发布了他们自己的 Tcl/Tk 框架。 (PS:我需要从 Perl 访问这些框架,但这应该没有任何区别。)
这是我的构建脚本。您将需要进行修改以适应
您的需求。
- 我对 init.tcl 进行了修改,以便 Tcl 将在正确的位置进行搜索
并且不会首先在 MacOS 标准位置查找。这部分的
脚本将从 Tcl/Tk 8.7 开始中断。它还有一条路径是
非常针对我的安装('darwin 64 tcl lib' 部分)。
保留它不会有任何伤害,或者您可以根据需要修改路径。
- 我将应用程序设置为可重定位,以便它可以从任何位置 运行。
这可能是一个安全问题。建议额外处理
安装后完成,将库路径设置为静态位置。
我个人此时推荐Tcl/Tk8.6.8,但是必须用
较早的 XCode 版本(我在 Sierra 上使用 XCode 命令行工具 9.2)。
MacOS Mojave 的各种错误修复仍在进行中。
其他人可能会另外推荐。
变量:
- macosxminver : Tcl/Tk 将为其编译的最早版本的 MacOS。
- INSTLOC:安装位置。将此指向目标以外的地方
目录,然后将文件复制到目标目录。
请注意,INSTLOC 目录已被脚本完全删除。
- 服务器:短 Tcl 版本。唯一使用它的地方是在 SRCDIR 定义中。
根据您的 SRCDIR 目录结构,您可能不需要它。
- ver : Tcl 版本号。
- mver : Tcl 主版本号。
- SRCDIR :Tcl/Tk 源代码树所在的位置。为此目的
脚本,我有一个具有以下结构的目录:
目录结构:
tcl868/
tcl8.6.8/
tk8.6.8/
tclbuild.sh:
#!/bin/bash
macosxminver=10.9
sver=868cp
ver=8.6.8
mver=8.6
tclmver=$mver
tkmver=$mver
SRCDIR=$HOME/t/tcl${sver}
INSTLOC=$HOME/t/localB
if [[ != "" ]]; then
INSTLOC=
fi
if [[ -d $INSTLOC ]]; then
rm -rf $INSTLOC
fi
mkdir $INSTLOC
cd $SRCDIR
test -d build && rm -rf build
cd $SRCDIR
cd tcl${ver}
if [[ $? -eq 0 ]]; then
f=library/init.tcl
if [[ ! -f $f-orig ]]; then
cp -pf $f $f-orig
fi
cp -pf $f-orig $f
ed $f << _HERE_
/issafe/
i
foreach Dir [list $::tcl_library [file dirname $::tcl_library]] {
if { [string match *Tcl.framework* $Dir] } {
regsub Tcl.framework $Dir Tk.framework Dir
if {$Dir ni $::auto_path} {
lappend ::auto_path $Dir
}
}
}
# This needs to be at the end
# The real wish executable is in an odd place.
# Find the tcl directory in the path.
set Dir [file dirname [info nameofexecutable]]
if { [string match *MacOS* $Dir] } {
regsub {MacOS.*} $Dir {MacOS} Dir
set Dir [file join $Dir darwin 64 tcl lib]
lappend ::auto_path $Dir
} else {
set Dir [file join [file dirname [file dirname \
[info nameofexecutable]]] lib]
}
.
?catch
?set Dir
.,.+4 s/^/#/
/catch
.+1,.+5 s/^/#/
w
q
_HERE_
make -C macosx \
PREFIX="" \
CFLAGS_OPTIMIZE="-O2 -mmacosx-version-min=${macosxminver}" \
INSTALL_ROOT=$INSTLOC install
cd $SRCDIR
chmod u+w $INSTLOC/bin/tclsh${tclmver}
install_name_tool -change \
"/Library/Frameworks/Tcl.framework/Versions/${tclmver}/Tcl" \
@executable_path/../Library/Frameworks/Tcl.framework/Versions/${tclmver}/Tcl \
$INSTLOC/bin/tclsh${tclmver}
fi
cd $SRCDIR
cd tk${ver}
if [[ $? -eq 0 ]]; then
make -C macosx \
PREFIX="" \
CFLAGS_OPTIMIZE="-O2 -mmacosx-version-min=${macosxminver}" \
INSTALL_ROOT=$INSTLOC install
cd $SRCDIR
chmod u+w $INSTLOC/Library/Frameworks/Tk.framework/Versions/${tkmver}/Resources/Wish.app/Contents/MacOS/Wish
install_name_tool -change \
"/Library/Frameworks/Tk.framework/Versions/${tkmver}/Tk" \
@executable_path/../../../../Tk \
$INSTLOC/Library/Frameworks/Tk.framework/Versions/${tkmver}/Resources/Wish.app/Contents/MacOS/Wish
install_name_tool -change \
"/Library/Frameworks/Tcl.framework/Versions/${tclmver}/Tcl" \
@executable_path/../../../../../../../Tcl.framework/Versions/${tclmver}/Tcl \
$INSTLOC/Library/Frameworks/Tk.framework/Versions/${tkmver}/Resources/Wish.app/Contents/MacOS/Wish
fi
cd $SRCDIR
find $INSTLOC -type f -print0 | xargs -0 chmod u+w
exit 0
在编译几分钟后,建议的脚本在 Mojave 上对我来说失败了,并出现以下错误:
ERROR: version conflict for package "Tcl": have 8.5.9, need 8.6-
If running this script from 'make html', set the NATIVE_TCLSH environment
variable to point to an installed tclsh8.6 (or the equivalent tclsh86.exe
on Windows).
make[3]: *** [html-tcl] Error 1
make[2]: *** [install-strip] Error 2
make[1]: *** [install-tcl] Error 2
make: *** [install-deploy] Error 2
tclbuild.sh: line 74: cd: /Users/xl/t/tcl869cp: No such file or directory
tclbuild.sh: line 83: cd: /Users/xl/t/tcl869cp: No such file or directory
tclbuild.sh: line 84: cd: tk8.6.9: No such file or directory
tclbuild.sh: line 103: cd: /Users/xl/t/tcl869cp: No such file or directory
我有最新的 Tcl/Tk (8.6.9) 资源和与上述相同的文件夹结构。
我是 Tcl/Tk 的初学者,但我已经需要部署一个带有 Tcl/Tk 框架的 .app(因为 .app 需要依赖它自己的 Tcl/Tk 版本,而不是 macOS 标准版和旧版 Tcl/Tk)。有人能告诉我在哪里可以找到预编译的框架或有关如何在 macOS 上编译它们的分步指南吗?
这方面找了半天也没什么收获。我想我的需求一点也不特别,因为我看到许多 .apps 发布了他们自己的 Tcl/Tk 框架。 (PS:我需要从 Perl 访问这些框架,但这应该没有任何区别。)
这是我的构建脚本。您将需要进行修改以适应 您的需求。
- 我对 init.tcl 进行了修改,以便 Tcl 将在正确的位置进行搜索 并且不会首先在 MacOS 标准位置查找。这部分的 脚本将从 Tcl/Tk 8.7 开始中断。它还有一条路径是 非常针对我的安装('darwin 64 tcl lib' 部分)。 保留它不会有任何伤害,或者您可以根据需要修改路径。
- 我将应用程序设置为可重定位,以便它可以从任何位置 运行。 这可能是一个安全问题。建议额外处理 安装后完成,将库路径设置为静态位置。
我个人此时推荐Tcl/Tk8.6.8,但是必须用
较早的 XCode 版本(我在 Sierra 上使用 XCode 命令行工具 9.2)。
MacOS Mojave 的各种错误修复仍在进行中。
其他人可能会另外推荐。
变量:
- macosxminver : Tcl/Tk 将为其编译的最早版本的 MacOS。
- INSTLOC:安装位置。将此指向目标以外的地方 目录,然后将文件复制到目标目录。 请注意,INSTLOC 目录已被脚本完全删除。
- 服务器:短 Tcl 版本。唯一使用它的地方是在 SRCDIR 定义中。 根据您的 SRCDIR 目录结构,您可能不需要它。
- ver : Tcl 版本号。
- mver : Tcl 主版本号。
- SRCDIR :Tcl/Tk 源代码树所在的位置。为此目的 脚本,我有一个具有以下结构的目录:
目录结构:
tcl868/
tcl8.6.8/
tk8.6.8/
tclbuild.sh:
#!/bin/bash
macosxminver=10.9
sver=868cp
ver=8.6.8
mver=8.6
tclmver=$mver
tkmver=$mver
SRCDIR=$HOME/t/tcl${sver}
INSTLOC=$HOME/t/localB
if [[ != "" ]]; then
INSTLOC=
fi
if [[ -d $INSTLOC ]]; then
rm -rf $INSTLOC
fi
mkdir $INSTLOC
cd $SRCDIR
test -d build && rm -rf build
cd $SRCDIR
cd tcl${ver}
if [[ $? -eq 0 ]]; then
f=library/init.tcl
if [[ ! -f $f-orig ]]; then
cp -pf $f $f-orig
fi
cp -pf $f-orig $f
ed $f << _HERE_
/issafe/
i
foreach Dir [list $::tcl_library [file dirname $::tcl_library]] {
if { [string match *Tcl.framework* $Dir] } {
regsub Tcl.framework $Dir Tk.framework Dir
if {$Dir ni $::auto_path} {
lappend ::auto_path $Dir
}
}
}
# This needs to be at the end
# The real wish executable is in an odd place.
# Find the tcl directory in the path.
set Dir [file dirname [info nameofexecutable]]
if { [string match *MacOS* $Dir] } {
regsub {MacOS.*} $Dir {MacOS} Dir
set Dir [file join $Dir darwin 64 tcl lib]
lappend ::auto_path $Dir
} else {
set Dir [file join [file dirname [file dirname \
[info nameofexecutable]]] lib]
}
.
?catch
?set Dir
.,.+4 s/^/#/
/catch
.+1,.+5 s/^/#/
w
q
_HERE_
make -C macosx \
PREFIX="" \
CFLAGS_OPTIMIZE="-O2 -mmacosx-version-min=${macosxminver}" \
INSTALL_ROOT=$INSTLOC install
cd $SRCDIR
chmod u+w $INSTLOC/bin/tclsh${tclmver}
install_name_tool -change \
"/Library/Frameworks/Tcl.framework/Versions/${tclmver}/Tcl" \
@executable_path/../Library/Frameworks/Tcl.framework/Versions/${tclmver}/Tcl \
$INSTLOC/bin/tclsh${tclmver}
fi
cd $SRCDIR
cd tk${ver}
if [[ $? -eq 0 ]]; then
make -C macosx \
PREFIX="" \
CFLAGS_OPTIMIZE="-O2 -mmacosx-version-min=${macosxminver}" \
INSTALL_ROOT=$INSTLOC install
cd $SRCDIR
chmod u+w $INSTLOC/Library/Frameworks/Tk.framework/Versions/${tkmver}/Resources/Wish.app/Contents/MacOS/Wish
install_name_tool -change \
"/Library/Frameworks/Tk.framework/Versions/${tkmver}/Tk" \
@executable_path/../../../../Tk \
$INSTLOC/Library/Frameworks/Tk.framework/Versions/${tkmver}/Resources/Wish.app/Contents/MacOS/Wish
install_name_tool -change \
"/Library/Frameworks/Tcl.framework/Versions/${tclmver}/Tcl" \
@executable_path/../../../../../../../Tcl.framework/Versions/${tclmver}/Tcl \
$INSTLOC/Library/Frameworks/Tk.framework/Versions/${tkmver}/Resources/Wish.app/Contents/MacOS/Wish
fi
cd $SRCDIR
find $INSTLOC -type f -print0 | xargs -0 chmod u+w
exit 0
在编译几分钟后,建议的脚本在 Mojave 上对我来说失败了,并出现以下错误:
ERROR: version conflict for package "Tcl": have 8.5.9, need 8.6-
If running this script from 'make html', set the NATIVE_TCLSH environment
variable to point to an installed tclsh8.6 (or the equivalent tclsh86.exe
on Windows).
make[3]: *** [html-tcl] Error 1
make[2]: *** [install-strip] Error 2
make[1]: *** [install-tcl] Error 2
make: *** [install-deploy] Error 2
tclbuild.sh: line 74: cd: /Users/xl/t/tcl869cp: No such file or directory
tclbuild.sh: line 83: cd: /Users/xl/t/tcl869cp: No such file or directory
tclbuild.sh: line 84: cd: tk8.6.9: No such file or directory
tclbuild.sh: line 103: cd: /Users/xl/t/tcl869cp: No such file or directory
我有最新的 Tcl/Tk (8.6.9) 资源和与上述相同的文件夹结构。