Tcl/Tk Mac OS X README ---------------------- RCS: @(#) $Id: README,v 1.16 2005/12/01 05:47:17 das Exp $ This is the README file for the Mac OS X/Darwin version of Tcl/Tk. 1. Where to go for support -------------------------- - The tcl-mac mailing list on sourceforge is the best place to ask questions specific to Tcl & Tk on Mac OS X: http://lists.sourceforge.net/lists/listinfo/tcl-mac (this page also has a link to searchable archives of the list, please check them before asking on the list, many questions have already been answered). - For general Tcl/Tk questions, the newsgroup comp.lang.tcl is your best bet: http://groups.google.com/group/comp.lang.tcl/ - The Tcl'ers Wiki also has many pages dealing with Tcl & Tk on Mac OS X, see http://wiki.tcl.tk/references/3753! http://wiki.tcl.tk/references/8361! - Please report bugs with Tcl or Tk on Mac OS X to the sourceforge bug trackers: Tcl: http://sf.net/tracker/?func=add&group_id=10894&atid=110894 Tk: http://sf.net/tracker/?func=add&group_id=12997&atid=112997 please make sure that your report Tk specific bugs to the tktoolkit project bug tracker rather than the tcl project bug tracker. Mac OS X specific bugs should usually be assigned to 'das' or 'wolfsuit'. 2. Using Tcl/Tk on Mac OS X --------------------------- - There are two versions of Tk available on Mac OS X: TkAqua using the native aqua widgets and look&feel, and TkX11 using the traditional unix X11 wigets. TkX11 requires an X11 server to be installed, such as Apple's X11 (which is available as an optional install on recent Mac OS X retail disks). TkAqua and TkX11 can be distinguished at runtime via [tk windowingsystem]. - At a minimum, Mac OS X 10.1 is required to run Tcl and TkX11, and OS X 10.2 is required to run TkAqua. However OS X 10.3 or higher is recommended (certain [file] operations behave incorrectly on earlier releases). - Tcl/Tk built on Mac OS X 10.x will not run on 10.y for y < x, on the other hand Tcl/Tk built on 10.y will run on 10.x for y < x (but without any of the fixes and optimizations that would be available in a binary built on 10.x). - Wish checks the Resources/Scripts directory in its application bundle for a file called AppMain.tcl, if found it is used as the startup script and the Scripts folder is added to the auto_path. This can be used to emulate the old OS9 TclTk droplets. - If standard input is a special file of zero length (e.g. /dev/null), Wish brings up the Tk console window at startup. This is the case when double clicking Wish in the Finder (or using 'open Wish.app' from the Terminal). - Tcl extensions can be installed in any of: $HOME/Library/Tcl /Library/Tcl /Network/Library/Tcl /System/Library/Tcl $HOME/Library/Frameworks /Library/Frameworks /Network/Library/Frameworks /System/Library/Frameworks (searched in that order). Given a potential package directory $pkg, Tcl on OSX checks for the file $pkg/Resources/Scripts/pkgIndex.tcl as well as the usual $pkg/pkgIndex.tcl. This allows building extensions as frameworks with all script files contained in the Resources/Scripts directory of the framework. - [load]able binary extensions can linked as either ordinary shared libraries (.dylib) or as MachO bundles (since 8.4.10/8.5a3); only bundles can be unloaded, and bundles are also loaded more efficiently from VFS (no temporary copy to the native filesystem required). - The 'deploy' target of macosx/Makefile installs the html manpages into the standard documentation location in the Tcl/Tk frameworks: Tcl.framework/Resources/Documentation/Reference/Tcl Tk.framework/Resources/Documentation/Reference/Tk No nroff manpages are installed by default by the Makefiles. - The Tcl and Tk frameworks can be installed in any of the system's standard framework directories: $HOME/Library/Frameworks /Library/Frameworks /Network/Library/Frameworks /System/Library/Frameworks - /usr/bin/wish8.x is a script that calls a copy of 'Wish' contained in Tk.framework/Resources - if 'Wish' is started from the Finder or via 'open', $argv contains a "-psn_XXXX" argument. This is the Wish's carbon process serial number, you may need to filter it out for cross platform compatibility of your scripts. - the env array is different when Wish is started from the Finder than when it (or tclsh) is invoked from the Terminal, in particular PATH may not be what you expect. (Wish started from the Finder inherits the Finder's environment variables, which are essentially those set in $HOME/.MacOSX/environment.plist and not those set by your shell configuration files). - As of Tk 8.4.7, TkAqua has a version of the low-level drawing primitives using the CoreGraphics routines - the code is primarily due to James Tittle. There were numerous problems with the QD version, mostly due to the different drawing model of QD & Tk. CG also trivially supports dashed lines, and the various end caps & miters. So this is a great improvement. The old QD code is retained for now, just in case there are any compatibility problems. To switch back to the QD drawing, just put: set tk::mac::useCGDrawing 0 in your script before you do drawing. Also the CG drawing can anti-alias line drawing. However, anti-aliased thin lines look washed out, so the threshold for antialiasing is set to 3 pixel width lines. You can change this if you want by putting: set tk::mac::CGAntialiasLimit in your script before drawing, in which case only lines thinner that pixels will not be antialiased. - Quickdraw text antialiasing is enabled by default when available (from 10.1.5 onwards). Changing the global boolean variable '::tk::mac::antialiasedtext' allows to dis/enable antialiasing on the fly from Tcl (even for existing text). - Scrollbars: There are two scrollbar variants in Aqua, normal & small. The normal scrollbar has a small dimension of 16, the small variant 12. Access to the small variant was added in Tk 8.4.2. - Cursors: You can now put up and spin the Classic MacOS spinner, and the counting hands and watch cursor. The way this is done is each of the spinners have a base name: spinning: The circular B&W circular spinner countinguphand: The counting up hand countingdownhand: The counting down hand countingupanddownhand: The counting up then down hand watch: The watch cursor Then to get the sequential variants, add an integer to the end of the base name. So, for instance this code will spin the spinner: proc spinCursor {widget count} { $widget configure -cursor spinning$count after 100 spinCursor [incr count] } This was added in Tk 8.4.2 - If you want to use Remote Debugging with Xcode 1.5 or 2.2, then you need to set the environment variable XCNOSTDIN to 1 in the Executable editor for Wish. That will cause us to force closing stdin & stdout. Otherwise, given how Xcode launches Wish remotely, they will be left open and then Wish & gdb will fight for stdin... 3. Building Tcl/Tk on Mac OS X ------------------------------ - At least Mac OS X 10.1 is required to build Tcl and TkX11 and OS X 10.2 is required to build TkAqua. Apple's Developer Tools need to be installed (only the most recent version matching your OS release is supported). The Developer Tools installer is available on Mac OS X retail disks or is present in /Applications/Installers on Macs that came with OS X preinstalled. The most recent version can be downloaded from the ADC website http://connect.apple.com (after you register for free ADC membership). - Tcl/Tk are most easily built as Mac OS X frameworks via Makefile in tcl/macosx and tk/macosx (see below for details), but can also be built with the standard unix configure and make buildsystem in tcl/unix resp. tk/unix as on any other unix platform (indeed, the Makefiles are just wrappers around the unix buildsystem). The Mac OS X specifc configure flags are --enable-aqua, --enable-framework and --disable-corefoundation (which disables CF and notably reverts to the standard select based notifier, you will only need this if your require use of naked fork (i.e. not followed by execve) in an unthreaded core). Note that --enable-aqua is incompatible with --disable-corefoundation (for both Tcl and Tk configure). - It is also possible to build with Apple's IDE via the projects in tk/macosx, take care to only use the project matching your DevTools and OS version: * Wish.pbproj for ProjectBuilder on 10.2 and earlier, this has a 'Tk' target that simply calls through to the tcl/macosx/GNUMakefile. It requires a build of the 'Tcl' target of the tcl/macosx/Tcl.pbproj project. * Wish.xcode for Xcode 1.5 on 10.3, this additionally has a native 'tktest' target useful for debugging, this target's 'Development' buildstyle has ZeroLink and Fix&Continue enabled, use the 'DevelNoFixZL' buildstyle if you need a debug build without these features. * Wish.xcodeproj for Xcode 2.2 on 10.4, this additionally has a 'ReleaseUniversal'configuration which builds both the 'Tk' and the 'tktest' targets as universal binaries for ppc and i386. Notes about the native targets of the Xcode projects: * the Xcode projects refer to the tcl and tk source dirs with a relative path of ../../tcl and ../../tk to the project location, if your source directories are named differently you'll need to enter the correct path in the info panel of the 'Tcl Sources' and 'Tk Sources' groups. * XCode 1.5 has a bug that causes Fix&Continue and the Build menu items Compile/Preprocess/ShowAssembly to fail in presence of relative paths to source files, as a workaround change the Path Type of the 'Tcl Sources' and 'Tk Sources' groups to 'Absolute Path' in the groups' Info panel. (fixed in Xcode 2.2) * the native targets need a version of the unix configure scripts with config headers enabled, this is automatically generated as tcl/macosx/configure and tk/macosx/configure by the project but this requires 2.59 versions of autoconf & autoheader, which are not available on on Mac OS X 10.3 by default, and so need to be installed manually. By default they are assumed to be installed as /usr/local/bin/autoconf-2.59 and /usr/local/bin/autoheader-2.59, set the env vars AUTOCONF and AUTOHEADER to their true locations if necessary. - To build universal binaires outside of Wish.xcodeproj, set CFLAGS as follows: export CFLAGS="-arch ppc -arch i386 \ -isysroot /Developer/SDKs/MacOSX10.4u.sdk -mmacosx-version-min=10.4" This requires Mac OS X 10.4 and Xcode 2.2 (_not_ Xcode 2.1) and will work on any of the architectures (on i386 DTKs, the -isysroot is not required). Note that it is not possible to configure correctly if the current architecture is not present in CFLAGS (i.e. -arch `arch` must always be there). Universal builds of Tk TEA extensions are also possible with CFLAGS set as above, they will be [load]able by universal as well as thin binaries of Tk. Note that while Tcl can be built for the ppc64 architecture, neither TkAqua nor TkX11 can be built with -arch ppc64 as the corresponding GUI libraries are not available for 64bit at present. However, linking a universal 'ppc i386' Tk binary against a universal 'ppc ppc64 i386' Tcl binary works just fine. The Tk configure script automatically removes '-arch ppc64' from CFLAGS to facilitate universal building of both Tcl and Tk with the same CFLAGS setting. Detailed Instructions for building with macosx/Makefile ------------------------------------------------------- - Unpack the Tcl and Tk source release archives and place the tcl and tk source trees in a common parent directory. [ If you don't want have the two source trees in one directory, you'll need to ] [ create the following symbolic link for the build to work as setup by default ] [ ln -fs /path_to_tcl/build /path_to_tk/build ] [ (where /path_to_{tcl,tk} is the directory containing the tcl resp. tk tree) ] [ or you can pass an argument of BUILD_DIR=/somewhere to the tcl and tk make. ] - The following instructions assume the Tcl and Tk source trees are named "tcl${ver}" and "tk${ver}", respectively, where ${ver} is a shell variable containing the Tcl and Tk version number (for example '8.4.12'). Setup the shell variable as follows: set ver="8.4.12" ;: if your shell is csh ver="8.4.12" ;: if your shell is sh The source trees will be named this way only if you are building from a release archive, if you are building from CVS, the version numbers will be missing; so set ${ver} to the empty string instead: set ver="" ;: if your shell is csh ver="" ;: if your shell is sh - The following steps will build Tcl and Tk from the Terminal, assuming you are located in the directory containing the tcl and tk source trees: make -C tcl${ver}/macosx make -C tk${ver}/macosx and the following will then install Tcl and Tk onto the root volume (admin password required): sudo make -C tcl${ver}/macosx install sudo make -C tk${ver}/macosx install if you don't have the admin password, you can install into your home directory, instead by passing an INSTALL_ROOT argument to make: make -C tcl${ver}/macosx install INSTALL_ROOT="${HOME}/" make -C tk${ver}/macosx install INSTALL_ROOT="${HOME}/" - The default Makefile targets will build _both_ debug and optimized versions of the Tcl and Tk frameworks with the standard convention of naming the debug library Tcl.framework/Tcl_debug resp. Tk.framework/Tk_debug. This allows you to dynamically link to the debug libraries at runtime by setting setenv DYLD_IMAGE_SUFFIX _debug (c.f. man dyld for more details) If you only want to build and install the debug or optimized build, use the 'develop' or 'deploy' target variants of the Makefiles, respectively. For example, to build and install only the optimized versions: make -C tcl${ver}/macosx deploy make -C tk${ver}/macosx deploy sudo make -C tcl${ver}/macosx install-deploy sudo make -C tk${ver}/macosx install-deploy - The Makefiles can also build a version of 'Wish' that has the Tcl and Tk frameworks embedded in its application package. This allows for standalone deployment of the application with no installation required, e.g. from read-only media. To build & install in this manner, use the 'embedded' target variants of the Makefiles. For example, to build a standalone 'Wish.app' in ./embedded/Applications/Utilities: make -C tcl${ver}/macosx embedded make -C tk${ver}/macosx embedded sudo make -C tcl${ver}/macosx install-embedded INSTALL_ROOT=`pwd`/embedded/ sudo make -C tk${ver}/macosx install-embedded INSTALL_ROOT=`pwd`/embedded/ Notes: * if you've already built standard TclTkAqua, building embedded does not require any new compiling or linking, so you can skip the first two makes. (making relinking unnecessary was added in 8.4.2) * the embedded frameworks include only optimized builds and no documentation. * the standalone Wish has the directory Wish.app/Contents/lib in its auto_path. Thus you can place tcl extensions in this directory (i.e. embed them in the app package) and load them with [package require]. - It is possible to build Tk against an installed Tcl.framework; but you will still need a tcl sourcetree in the location specified in TCL_SRC_DIR in Tcl.framework/tclConfig.sh. Also, linking with Tcl.framework has to work exactly as indicated in TCL_LIB_SPEC in Tcl.framework/tclConfig.sh. If you used non-default install locations for Tcl.framework, specify them as make overrides to the tk/macosx Makefile, e.g. make -C tk${ver}/macosx \ TCL_FRAMEWORK_DIR=$HOME/Library/Frameworks TCLSH_DIR=$HOME/usr/bin sudo make -C tk${ver}/macosx install \ TCL_FRAMEWORK_DIR=$HOME/Library/Frameworks TCLSH_DIR=$HOME/usr/bin The Makefile variables TCL_FRAMEWORK_DIR and TCLSH_DIR were added in Tk 8.4.3.