Tcl/Tk 8.5.10, compilation et utilisation sur Sun Solaris 10 x86

Logo

Introduction

Tcl (Tool Command Language) est un langage de script conçu à l’Université de Berkeley. Il s’inspire des langages C, Lisp, Shell et Awk. Ce langage à typage à dynamique est multi-plateformes. Tcl s’interface très aisément avec le langage C, ce qui lui permet de servir d’interprète embarqué dans de nombreux programmes.

Avec le temps, le langage Tcl a vu naître son compagnon Tk. Tk est une extension du langage Tcl pour créer des interfaces graphiques portables. Sous Sun Solaris, Tk permet le développement d’interfaces graphiques X11. Sous Macintosh, des interfaces Aqua, etc.

Tcl/tk est souvent utilisé par les moteurs de bases de données, qu’il s’agisse de clients développés en Tcl/Tk ou du langage Tcl embarqué et utilisé dans des routines (procédures stockées…) :

  • PostgreSQL : utilisation possible du langage Tcl dans des procédures stockées.
  • Oracle Berkeley DB et SQLite : suite de tests.
  • Oracle : oractl, client Tcl/tk pour Oracle…

Cet article présente donc la compilation de Tcl/Tk 8.5.10 en 64 bits avec SunStudio 12.1 sur une plateforme Solaris 10 x86 64 bits, pour plus d’informations sur l’installation des compilateurs SunStudio 12.1 : Installation de Sun Studio 12 sur Sun Solaris 10 X86 pour les compilations.

Une description de l’arborescence Tcl/Tk est également proposée pour une première prise en main rapide de Tcl/Tk : binaires tclsh et wish, librairies, scripts tclConfig.sh et tkConfig.sh, exécutions des démos graphiques Tk.

Téléchargement

Tcl/Tk se présente sous la forme de 2 archives compressées disponibles en téléchargement à cette adresse : Tcl/Tk - Download. Lors de la rédaction de cet article, la version 8.5.10 est la version stable de Tcl/Tk (NB : les versions avec le mot clé b sont des versions en phase beta, à éviter dans un environnement de production).

  • tcl8.5.10-src.tar.gz
  • tk8.5.10-src.tar.gz

Le 2 archives tcl8.5.10-src.tar.gz et tk8.5.10-src.tar.gz sont transférées avec ftp sur la machine cible dans le répertoire /Software/tools/temp puis décompressées et désarchivées avec les utilitaires gunzip et tar :

Tcl
% cd /Software/tools/temp
% gunzip -c tcl8.5.10-src.tar.gz | tar xvf -
Tk
% cd /Software/tools/temp
% gunzip -c tk8.5.10-src.tar.gz | tar xvf -

Avec la commande tar, les codes sources sont alors respectivement désarchivés dans les sous répertoires ./tcl8.5.10 et ./tk8.5.10.

Préparation de l’environnement pour la compilation de Tcl/Tk 8.5.10 avec SunStudio 64 bits

La variable PATH est mise à jour avant la compilation pour référencer /usr/ccs/bin, répertoire qui contient le binaire ld, indispensable pour la génération des liens.

% PATH=/usr/ccs/bin:$PATH
% export PATH

Si les liens de SunStudio n’ont pas été installés dans /usr/bin lors de l’installation, la variable PATH doit référencer également le répertoire <répertoire de sunstudio 12.1>/bin pour trouver les compilateurs.

% PATH=/opt/sunstudio12.1/bin:$PATH
% export PATH

Il s’agit d’une compilation en 64 bits, la variable CFLAGS peut être mise à jour à -m64 mais c’est inutile pour Tcl/Tk, l’option de compilation en 64 bits doit obligatoirement être spécifiée à la configuration de la compilation.

% CFLAGS=-m64
% export CFLAGS

Compilations de Tcl 8.5.10 et Tk 8.5.10

Configuration de la compilation

Une fois l’environnement préparé (variables $PATH, $CFLAGS), la configuration de la compilation peut être déclenchée. Le script configure est disponible dans le répertoire correspondant à sa plateforme (unix ici).

L’option --help du script configure renvoie les options de configuration.

Tcl Tk
% cd /Software/tools/temp/tcl8.5.10/unix

% ./configure --help

`configure' configures tcl 8.5 to adapt 
to many kinds of systems.

Usage: ./configure [OPTION]... [VAR=VALUE]...

 ...

Installation directories:
 --prefix=PREFIX        install architecture
                        independent 
                        files in PREFIX 
                        [/usr/local]
 --exec-prefix=EPREFIX  install architecture
                        dependent 
                        files in EPREFIX 
                        [PREFIX]

By default, `make install' will install all 
the files in '/usr/local/bin', 
`/usr/local/lib' etc.
 ...
You can specify an installation prefix 
other than `/usr/local' using `--prefix',
for instance `--prefix=$HOME'.

 ...

 --enable-64bit     enable 64bit support 
                    (default: off)
 --enable-dtrace    build with DTrace support
                    (default: off)
 ...
% cd /Software/tools/temp/tk8.5.10/unix

% ./configure --help

`configure' configures tk 8.5 to adapt 
to many kinds of systems.

Usage: ./configure [OPTION]... [VAR=VALUE]...

 ...

Installation directories:
 --prefix=PREFIX        install architecture
                        independent 
                        files in PREFIX
                        [/usr/local]
 --exec-prefix=EPREFIX  install architecture
                        dependent 
                        files in EPREFIX
                        [PREFIX]

By default, `make install' will install all 
the files in '/usr/local/bin', 
`/usr/local/lib' etc.
 ...
You can specify an installation prefix 
other than `/usr/local' using `--prefix',
for instance `--prefix=$HOME'.

 ...

 --enable-64bit     enable 64bit support
                    (default: off)
 --enable-aqua      use Aqua windowingsystem 
                    on Mac OS X 
                    (default: off)
 ...

 --enable-framework  package shared libraries 
                     in MacOSX frameworks
                     (default: off)

Les options --prefix sont spécifiées ici dans cet article afin de délocaliser l’installation de Tcl/Tk en dehors des répertoires systèmes /usr.

L’installation des binaires et librairies n’est pas réalisée dans son répertoire par défaut /usr/local et dans l’architecture choisie, le répertoire /Software/tools/misc est le répertoire alternatif à /usr/local : la configuration est donc réalisée avec l’option --prefix=/Software/tools/misc (DIR).

La compilation des librairies de Tcl/Tk est réalisée par défaut en 32 bits. Si l’option --enable-64bit n’est pas spécifiée dans la configuration alors que la variable d’environnement CFLAGS comprend l’option de compilation -m64, la génération des librairies tombe en échec :

ld: fatal: file tk3d.o: wrong ELF class: ELFCLASS64
ld: fatal: File processing errors. No output written to libtk8.5.so
*** Error code 1
make: Fatal error: Command failed for target `libtk8.5.so'

Les configurations de la compilation de tcl 8.5.10 et tk 8.5.10 sont donc les suivantes dans cet exemple pratique :

Tcl Tk
% cd /Software/tools/temp/tcl8.5.10/unix

% ./configure --prefix=/Software/tools/misc 
              --enable-64bit
% cd3 /Software/tools/temp/tk8.5.10/unix

% ./configure --prefix=/Software/tools/misc 
              --enable-64bit

La configuration de la compilation n’a pas posé de problème particulier ici.

Compilation et installation

La compilation et l’installation de Tcl/Tk 8.5.10 sont réalisées avec les commandes make et make install.

Tcl Tk
% cd /Software/tools/temp/tcl8.5.10/unix
% make
% make install
% cd /Software/tools/temp/tk8.5.10/unix
% make
% make install

À la compilation, des avertissements assez nombreux peuvent être générés :

cc: Warning: -xarch=amd64 is deprecated, use -m64 to create 64-bit programs

Il est envisageable de modifier les fichiers config et Makefile afin de remplacer l’option de compilation -xarch=amd64 par -m64, options qui indiquent une compilation en 64 bits, mais c’est optionnel, voire du superflu. Sous Sun Solaris 10 avec Sun Studio 12.1, l’option de compilation -xarch=amd64 est obsolète (deprecated) mais encore utilisable pour une compilation 64 bits, elle sera définitivement retirée dans de futures versions.

Makefile
...
# CFLAGS    = $(CFLAGS_OPTIMIZE) -xarch=amd64
CFLAGS      = $(CFLAGS_OPTIMIZE) -m64
 ...
# Flags to pass to the linker
# LDFLAGS   = $(LDFLAGS_OPTIMIZE)  -xarch=amd64
LDFLAGS     = $(LDFLAGS_OPTIMIZE)  -m64
 ...

Architecture et prise en main de Tcl/Tk 8.5.10

Dans la suite de cet article, $DIR correspond au répertoire d’installation de Tcl/Tk (/Software/tools/misc). À la fin de la compilation, l’arborescence créée pour Tcl/Tk 8.5.10 est la suivante :

  • $DIR/bin
  • $DIR/lib
  • $DIR/lib/tcl8
  • $DIR/lib/tcl8.5
  • $DIR/lib/tk8.5

Variables d’environnement

Pour utiliser pleinement Tcl/Tk, les variables d’environnement PATH et LD_LIBRARY_PATH sont mises à jour pour référencer $DIR/bin et $DIR/lib. La variable d’environnement DISPLAY est également modifiée pour utiliser les graphismes X11 avec Tk : DISPLAY=<votre adresse IP>:0.0.

% PATH=/Software/tools/misc/bin:$PATH
% export PATH

% LD_LIBRARY_PATH=/Software/tools/misc/lib:$PATH
% export LD_LIBRARY_PATH

% DISPLAY=10.128.148.144:0.0
% export DISPLAY

Binaires tclsh et winsh

2 binaires sont créés dans le répertoire $DIR/bin : tclsh8.5 et wish8.5. Pour s’affranchir de la version de Tcl/Tk, des liens tclsh et wish peuvent être ajoutés :

% cd /Software/tools/misc/bin

% ln -fs tclsh8.5  tclsh
% ln -fs wish8.5   wish

% ls -ll
tclsh8.5
tclsh -> tclsh8.5
wish8.5
wish -> wish8.5

tclsh

tclsh est l’interpréteur de commandes tcl en mode interactif ou en donnant un fichier tcl en entrée. Un exemple classique : l’affichage de "Hello world"

Mode interactif Avec fichier en entrée
%> tclsh
%> puts Hello world
Hello world
%> tclsh <fichier> arg arg ...

En mode interactif, à l’ouverture, tclsh recherche un fichier .tclshrc dans le répertoire $HOME du compte Unix utilisé et évalue ce dernier si il existe. Ce n’est pas le cas lorsqu’un fichier tcl est donné en entrée, cependant on peut forcer le fichier tcl de sourcer .tclshrc.

wish

wish est l’interpréteur de commandes tcl/tk pour les développements graphiques en mode interactif ou en donnant un script tcl en entrée. wish ouvre une fenêtre graphique (X11 pour Solaris) pour exécuter, développer et tester les interfaces avec Tk.

En exemple : la création d’un bouton avec le libellé "Hello world"

Bouton Hello Work avec Tcl/Tk

Mode interactif Avec fichier en entrée
%> wish
% button .b1 -text "Hello world"
 .b1
% pack .b1
%> wish <fichier> arg arg ...

Comme pour tclsh, en mode interactif, à l’ouverture, wish recherche un fichier .wishrc dans le répertoire $HOME du compte Unix utilisé et évalue ce dernier si il existe. Ce n’est pas le cas lorsqu’un fichier tcl est donné en entrée, .wishrc doit être sourcé dans le script tcl/tk si nécessaire.

Librairies, tclConfig.sh et tkConfig.sh

Outre les librairies statiques (archives *.a) et librairies dynamiques (*.so) créées lors de la compilation dans le répertoire $DIR/lib :

  • libtcl8.5.so
  • libtclstub8.5.a
  • libtk8.5.so
  • libtkstub8.5.a

2 scripts shell sont également créés dans $DIR/lib : tclConfig.sh et tkConfig.sh. Ces 2 scripts rassemblent respectivement pour Tcl et Tk les informations sur la configuration de la compilation.

tclConfig.sh tkConfig.sh
...
# Tcl's version number.
TCL_VERSION='8.5'
TCL_MAJOR_VERSION='8'
TCL_MINOR_VERSION='5'
TCL_PATCH_LEVEL='.10'
 ...

# C compiler to use for compilation.
TCL_CC='cc'
 ...

# The name of the Tcl library 
# (may be either a .a file 
# or a shared library):
TCL_LIB_FILE='libtcl8.5.so'

# Additional libraries to use
# when linking Tcl.
TCL_LIBS='-ldl  -lsocket -lnsl -lsunmath -lm'

# Top-level directory in which 
# Tcl's platform-independent files are
# installed.
TCL_PREFIX='/Software/tools/misc'

 ...
...
# Tk's version number.
TK_VERSION='8.5'
TK_MAJOR_VERSION='8'
TK_MINOR_VERSION='5'
TK_PATCH_LEVEL='.10'
 ...

# The name of the Tk library 
# (may be either a .a file 
# or a shared library):
TK_LIB_FILE='libtk8.5.so'

# Additional libraries to use 
# when linking Tk.
TK_LIBS='-lX11 -lXext -ldl ...'

# Top-level directory in which 
# Tk's platform-independent files are
# installed.
TK_PREFIX='/Software/tools/misc'

 ...

Ces 2 scripts importants sont généralement inclus dans les scripts configure des produits (PostgreSQL, Oracle Berkeley DB…) qui embarquent ou utilisent les extensions Tcl/Tk. Ils facilitent la détection de l’environnement Tcl/Tk.

  • Pour PostgreSQL : --with-tclconfig= DIRECTORY (Sets this directory to hold tcl or tk Config.sh files.)
  • Pour Oracle Berkeley DB : --with-tcl=DIR (Directory location of tclConfig.sh).

Exécuter une démo graphique Tcl/Tk

Des démos graphiques, pour découvrir le code Tcl/Tk et vérifier la bonne exécution de Tcl/Tk avec X11 sous Solaris, sont disponibles dans le répertoire $DIR/lib/tk8.5/demos.

% cd /Software/tools/misc/lib/tk8.5/demos

% tcolor

demo graphique Tcl/Tk Color