Purpose: accumulate notes about building, testing and installing Tcl from its source distribution.
Tcl is frequently obtained by getting the C source code and compiling it. Tcl comes with generic code plus modules specifically designed to compile on Unix derived, Windows, and MacOS. [Add something here about platforms other than these 3 do].
The steps one takes to build a fresh copy of Tcl are frequently something like:
[Note that this step is non-trivial to complete successfully on at least the Windows and MacOS platforms. Perhaps someone will add in a reference here regaling us with their horror stories, or even better, with steps that someone could take to be successful at the work.]
With newer versions of bash (>3.0) configure might give an error resembling:
./configure: line 7624: syntax error near unexpected token `)'
refer to bash for the cause and solution of this problem.
Note that Unix users report problems on a regular basis on some platforms and with certain combinations of events. For instance AIX and HP/UX users, I believe, often have problems when using older versions of compilers, or Tcl, etc. Solaris users report configure problems if their $PATH has /usr/ucb in their path, but do not have a C compiler in their environment.
The path of least resistance for building and testing Tcl on Windows is somewhat different, at least if you have VC++6. (It is rumored that a combination of MinGW and Cygwin make also works, but I've not tried it.) On Windows with VC++6, the steps are:
./configure adds very little value on Windows systems, which are fairly homogeneous.
If you have gcc 3.3 or newer, look here on how to Build Tcl with profile based optimization.
HaO 2012-05-04 configure --enable-64bit was installing shared library in /usr/local/lib and not /usr/local/lib64, where it would be in the library path.
Joe English advised on clt to use a site configure configuration file [L1 ].
If one adds a file /usr/local/share/config.site with the contents:
# /usr/local/share/config.site for platforms that prefer # the directory /usr/local/lib64 over /usr/local/lib. test "$libdir" = '${exec_prefix}/lib' && libdir='${exec_prefix}/lib64' # to not stop configure if test fails (sqlite and threads in bundled tcl8.6b3) true
(HaO 2012-10-08: I have added true, as configure stopped with tcl8.6b3 bundled package sqlite as exec_prefix was not defined at all and the test returned 1 and stopped the configure script. Sqlite anyway used already lib64)
The following line will be printed if configure --enable-64bit is executed:
$ configure: loading site script /usr/local/share/config.site
The files will be installed as follows:
If Itcl is installed (as binary extension), scripts and shared libraries go to /usr/local/lib64/itcl4.0b7. This first felt irritating but is necessary, as tcl-only extensions may be shared between 32 and 64 bit, but shared libraries not.
The tcl auto path is:
$ /usr/local/bin/tclsh8.6 % set auto_path /usr/local/lib/tcl8.6 /usr/local/lib /usr/local/lib64
which feels strange to me. IMHO, the lib64 should be before lib. This is also like that in the Makefile.
It was still necessary to put a link in /usr/lib64 that linked packages will find the library (ex: rivet):
# cd /usr/lib64 # ln -s /usr/local/lib64/libtcl.8.6.so
/usr/local/bin/tclsh8.6 does not require this link.
Here is a file list of a freshly compiled tcl/tk8.6b3 on CentOS6.3 64 bit of the (quite empty) folder lib:
drwxr-xr-x. 5 root root 4096 8. Okt 13:40 tcl8 drwxr-xr-x. 6 root root 4096 8. Okt 13:40 tcl8.6 drwxr-xr-x. 6 root root 4096 8. Okt 13:39 tk8.6
and the lib64 folder:
drwxr-xr-x. 2 root root 4096 8. Okt 13:41 itcl4.0b8 -r-xr-xr-x. 1 root root 1715711 8. Okt 13:40 libtcl8.6.so -rwxr-xr-x. 1 root root 8028 8. Okt 13:40 libtclstub8.6.a -r-xr-xr-x. 1 root root 1539775 8. Okt 13:39 libtk8.6.so -rwxr-xr-x. 1 root root 5472 8. Okt 13:39 libtkstub8.6.a drwxr-xr-x. 2 root root 4096 8. Okt 13:40 pkgconfig drwxr-xr-x. 2 root root 4096 8. Okt 13:41 sqlite3.7.14 drwxr-xr-x. 3 root root 4096 8. Okt 13:41 tcl8 -rw-r--r--. 1 root root 7597 8. Okt 13:40 tclConfig.sh -rw-r--r--. 1 root root 786 8. Okt 13:40 tclooConfig.sh drwxr-xr-x. 2 root root 4096 8. Okt 13:41 tdbc1.0b17 drwxr-xr-x. 2 root root 4096 8. Okt 13:41 thread2.7b1 drwxr-xr-x. 2 root root 4096 8. Okt 13:39 tk8.6 -rw-r--r--. 1 root root 3977 8. Okt 13:39 tkConfig.sh
HaO 2013-03-27: One may use :
nmake -f Makefile.vc test OPTS=threads TESTFLAGS="-verbose \"body start error\" -file event.test"
to specify flags to the test run. [L2 ]
The testflags are passed as parameters to the tcltest.tcl script.