Die Installation von Software für module erfordert, dass man einige Feinheiten beachtet, die sich aus
ergeben. Gott sei dank benutzen fast all Softwareentwickler heutzutage GNU automake basierte Installationsmechanismen, so dass die Installation gut geschriebener Software (leider keine Selbstverständlichkeit) nahezu automatisiert ablaufen kann.
Im Folgenden beschreibe ich die Installation des Programmpaketes xxx in der Version a.bb.
kogs1>/home/utcke%
mkdir /software/xxx-a.bb
kogs1>/home/utcke%
cd /software/xxx-a.bb
# pack das Tar-file aus,
normalerweise nach /software/xxx-a.bb/xxx-a.bb
kogs1>/software/xxx-a.bb%
gtar -xzvf ../inst/xxx-a.bb.tgz
# benenne das gerade erzeugte
Verzeichnis um
kogs1>/software/xxx-a.bb%
mv * src
#!/usr/bin/tcsh -f
set symlinks=expand
module purge
# Hier kann man Module laden, die das Programm benötigt
# module add zlib libpng-1.2 ...
set PLATFORM=`/software/Modules/bin/platform`
set DIR=`pwd`
set PKG=$DIR:t
# Falls das Programmpaket dies unterstützt, kann man für mehrere
# Platformen gleichzeitig übersetzen.
mkdir -p $PLATFORM/objs
cd $PLATFORM/objs
make distclean
$DIR/src/configure --prefix=$DIR --exec-prefix=$DIR/$PLATFORM --disable-rpath |& tee /tmp/$PKG-conf.$$
make |& tee /tmp/$PKG-comp.$$
if ( $? == 0 ) then
make check |& tee /tmp/$PKG-check.$$
if ( $? == 0 ) then
make install |& tee /tmp/$PKG-inst.$$
if ( -d $DIR/include ) then
ln -s $DIR/include $DIR/$PLATFORM/include
endif
endif
endif
kogs1>/software/xxx-a.bb%
source build
| Plattform | Maschine |
|---|---|
| SunOS-5.8 | kogs2 |
| SuSE-9.0 | kogspc2 |
| SuSE-10.0 | kogspc30 |
# Falls das Programmpaket dies unterstützt, kann man für mehrere
# Platformen gleichzeitig übersetzen.
mkdir -p $PLATFORM/objs
cd $PLATFORM/objs
# Das Programmpaket unterstützt es nicht, für mehrere
# Platformen gleichzeitig zu übersetzen.
mkdir -p $PLATFORM
cd src
module
purge in das build Skript
eingetragen werden.
kogs1>/software/xxx-a.bb%
src/configure --help
Nachdem der Installationsprozess auf der kogs2 reibungslos durchläuft, kann man sich dann auch an die anderen Plattformen machen; Erfahrungsgemäß werden auf den Linux-Rechnern jetzt keine weiteren Probleme mehr auftauchen.
Nachdem die Software nun für alle Plattformen installiert ist, gilt es als nächstes, entsprechende Beschreibungen für module zu schreiben, ein so genanntes Modulefile. Modulefiles sind in Tcl geschrieben, ein klassisches Modulefile sieht z.B. so aus:
#%Module1.0#####################################################################
##
# Diese Datei wird von einem Tcl Interpreter gelesen.
# Mehr Informationen bekommt man mit
#
# module add modules
# man modulefile
#
set PLATFORM [exec /software/Modules/bin/platform]
# Dieser Text wird bei 'module help' angezeigt. Typische Quellen sind
# die ersten paar Zeilen der man-pages, des info-files oder der
# README. Sinn dieses Blocks ist es zu erklären was das Programm
# macht und wie man es benutzt.
proc ModulesHelp { } {
puts stderr "\tThe XXX is the foo bar Manipulation Program, a layer-capable,"
puts stderr "\tPhotshop(TM)-like software for such tasks as photo retouching, image"
puts stderr "\tcomposition and image authoring. It works on many operating systems,"
puts stderr "\tin many languages.\n"
}
# Dieser Text wird bei 'module whatis' angezeigt. kann maximal 56
# Zeichen lang sein. Eine gute Quelle ist die kurz-Beschreibung aus
# den man-pages.
module-whatis "the GNU foo bar Program."
# Module, die nicht gleichzeitig geladen werden können. Jedes Modul
# hat normalerweise mindestens einen Konflikt mit anderen Versionen
# des gleichen Moduls
conflict xxx
# Include-Datei, in der all KOGS::* Funktionen definiert sind ---
# sollte nur geladen werden, wenn man sie auch braucht!
source /software/Modules/lib/KOGS.tcl
# Abhängigkeiten. Ein guter Startpunkt sind die Module, die zur
# Compile-Zeit (vom build Skript) geladen waren. Genaueres (und man
# sollte das so genau wie möglich machen) findet man mit
#
# ldd /software/xxx-a.bb/$PLATFORM/bin/* | sort -u
#
# raus
KOGS::dep zlib
# falls bestimmte Versionen benötigt werden (letzte ist default):
KOGS::dep qt-3 {2.3 3.3}
# Environment Variabeln. Natürlich sollten nur die gesetzt werden,
# die es auch gibt.
prepend-path PATH /software/xxx-a.bb/$PLATFORM/bin
prepend-path LD_LIBRARY_PATH /software/xxx-a.bb/$PLATFORM/lib
prepend-path MANPATH /software/xxx-a.bb/man
prepend-path INFOPATH /software/xxx-a.bb/info
prepend-path PKG_CONFIG_PATH /software/xxx-a.bb/$PLATFORM/lib/pkgconfig
KOGS::prepend-flags CPPFLAGS -I/software/xxx-a.bb/include
KOGS::prepend-flags LDFLAGS -L/software/xxx-a.bb/$PLATFORM/lib
# Alternativ kann man auch die (zur Zeit noch experimentelle) Funktion
#
# KOGS::scan-prefix /software/xxx-a.bb
#
# verwenden, die PLATFORM und alle obigen Variablen setzt.
Als letztes sollte man noch einen Test durchführen, ob das Modulefile wirklich alle Abhängigkeiten berücksichtigt:
# Alle Module entladen.
kogs1>/home/utcke%
module purge
# Das neue Module testen:
# Funktioniert die Hilfe?
kogs1>/home/utcke%
module help xxx
# Funktioniert die Kurzbeschreibung?
kogs1>/home/utcke%
module whatis xxx
# Funktioniert das Module?
kogs1>/home/utcke%
module add xxx
kogs1>/home/utcke%
xxx
# Fehlen wirklich keine Abhängigkeiten?
kogs1>/home/utcke%
ldd /software/xxx-a.bb/$PLATFORM/bin/* | sort -u | grep "file not found"
Wenn jetzt alles geklappt hat, dann sollte man ganz zum Schluss noch das frisch installierte Paket in /software/DONE eintragen und von Zeit zu Zeit die dort eingetragenen Pakete an kogs-alle mailen.
Sven Utcke last modified: 11-Aug-2006