Octave für Linux

Octave wird unter der GPL (GNU Public License) weitergegeben und ist ein bekanntes und erfolgreiches Open Source Produkt. Viele Linux Distributionen (wie z.B. die beliebte SuSE-Distribution) enthalten standardmäßig Octave, allerdings oft in der letzten (stabilen) Version 2.0.16. Octave wird einfach genau so installiert wie auch die anderen Pakete, bei SuSE z.B. über YaST2. Bei Vorhandensein des RPM (RPM Package Manager) wird Octave folgendermaßen installiert:

   su
   rpm -Uhv octave-*-rpm

Häufig ist es besser, Octave selber zu übersetzen. Dieses macht Sinn, wenn eine neuere Version gewünscht ist, oder wenn Octave-forge mitinstalliert werden soll. Im folgenden beschreiben wir die Installation von Octave 2.1.50 und Octave-forge in der Version vom 02.06.2003.

Installationen erfolgen unter Linux meist mittels des bekannten Linux Dreisatzes

  configure; make; make install

Ich bevorzuge alternativ, vorher checkinstall zu installieren, um dann den erweiterten Dreisatz

  configure; make; checkinstall

auszuführen. Durch dieses Vorgehen kann man dann während der Installation RPM- oder deb-Pakete erzeugen, die an Kommilitonen weitergegeben werden können.

Anmerkungen zur Installation

Der folgende Abschnitt beschreibt transparent meine Vorgehensweise bei der Installation von Octave 2.1.50 und Octave-forge in der Version vom 02.06.2003 (und einigen anderen Goodies) auf einer SuSE 9.0 Professional Linux Box und resultiert in einigen RPM Dateien und einer (sehr ausführlichen) Installationsbeschreibung, respektive Installationsanleitung. Da diese Anleitung in voller Länge etwas schwer zu überblicken ist, folgt (bevor es an die Feinheiten geht) eine kurze Zusammenfassung der Vorgehensweise bei der Installation:

Und jetzt meine Erlebnisse bei der Installation.

Installation unter SuSE 9.0

Diese Beispielinstallation beschreibt meine Erlebnisse bei der Installation von Octave 2.1.50 (bleeding-edge) mit Octave-forge (code-freeze vom 2003.06.02) und einigen Zusätzen (GMP, CLN, GiNaC, Qhull, SuperLU, kOctave) und einigen (wohl typischen) Problemen (und auch deren Lösung) unter SuSE 9.0 Professional. Die Schritt für Schritt vorgestellte Installationsanleitung resultierte einerseits in einigen RPM Dateien, die hier zum Download angeboten werden, sollte aber auch genug Informationen bereit stellen, um es jedem zu ermöglichen, selbst alle genannten Pakete (auch unter Verwendung einer anderen Distribution) zu kompilieren und zu installieren.

Aufräumen und Vorsorge treffen

In einem ersten Schritt sollte man eventuell bereits installierte Versionen von Octave deinstallieren, dieses gilt insbesondere für die (aufgrund einer fehlenden Klammer im Makefile) von SuSE bei Version 9.0 mitgelieferten korrupten Octave Version 2.1.49:

  su
  rpm -q octave
  rpm -e octave

Kleine Anmerkug dazu: ausgerechnet in dieser Version (meines Wissens die erste 2.1.x Version, die bei SuSE mitgeliefert wurde) wurde von den Octave Entwicklern eine schließende Klammer in einem Makefile vergessen. Siehe hierzu die Mail mit dem Subject typo in liboctave/Makefile.in for install-lib (shared) von der Mailinglist bug-octave.

Installation von Octave 2.1.50

Jetzt kann die Installation von Octave in der Version 2.1.50 (bleeding-edge) beginnen. Dazu von der Seite ftp://ftp.octave.org/pub/octave/bleeding-edge die Datei octave-2.1.50.tar.bz2 herunterladen, auspacken, in das Verzeichnis wechseln und configure aufrufen wie folgt:

  tar jxvf octave-2.1.50.tar.bz2
  cd octave-2.1.50/
  ./configure --enable-shared --enable-dl

Die Flags sind dazu notwendig, daß anschließend Octave-forge angebunden werden kann.

Dabei stellte sich heraus daß ich einige Pakete nachinstallieren musste, da einige Programme (respektive deren Header) nicht Bestandteil meiner Installation waren. Diese Programme, respektive Pakete waren readline (Paket readline-devel) und runtest (Paket DejaGNU). Nach der Nachinstallation genannter Pakete lief

  ./configure --enable-shared --enable-dl

klaglos durch und erzeugte die folgende Ausgabe:

Octave is now configured for i686-pc-linux-gnu

  Source directory:     .
  Installation prefix:  /usr/local
  C compiler:           gcc  -mieee-fp -g -O2
  C++ compiler:         g++  -mieee-fp -g -O2 -Wall
  Fortran compiler:     g77 -O
  Fortran libraries:    -L/usr/lib/gcc-lib/i586-suse-linux/3.3.1
                        -L/usr/lib/gcc-lib/i586-suse-linux/3.3.1/\
                        ../../../../i586-suse-linux/lib
                        -L/usr/lib/gcc-lib/i586-suse-linux/3.3.1/\
                        ../../..
                        -lfrtbegin -lg2c -lm -lgcc_s
  BLAS libraries:       -llapack -lblas
  FFTW libraries:
  HDF5 libraries:
  MPI libraries:
  LIBS:                 -lreadline  -lncurses -ldl -lm
  Default pager:        less
  gnuplot:              gnuplot

  Do internal array bounds checking:  false
  Build static libraries:             true
  Build shared libraries:             true
  Dynamic Linking:                    true (dlopen)
  Include support for GNU readline:   true

Eine Anmerkung zur Zeile

  Do internal array bounds checking:  false

Diese Einstellung läßt sich zwar auch über ein Flag an

  ./configure

ändern, es ist aber anscheinend besser, dieses nicht zu setzen, ich hatte beim ersten Versuch nämlich Probleme mit main/sparse (verwendet SuperLU, Teil von Octave-forge). Meine Vermutung: Wenn man dieses Flag anders setzt, klappt es anschließend nicht mit der Installation von Octave-forge.

Nach der (hoffentlich) erfolgreichen Konfiguration ruft man

  make

auf (und geht ruhig einen Kaffee oder Tee kochen und trinken). Wenn make durchgelaufen ist, kann man

  make check

aufrufen (dafuer haben wir DejaGNU installiert). Dieser Test erzeugte bei mir die folgende Bildschirmausgabe:

Test Run By zemke on Tue Nov  4 21:03:06 2003
Native configuration is i686-suse-linux

                === octave tests ===

Schedule of variations:
    unix

Running target unix
Using /usr/share/dejagnu/baseboards/unix.exp as board description\
      file for target.
Using /usr/share/dejagnu/config/unix.exp as generic interface\
      file for target.
Using ./config/unix.exp as tool-and-target-specific interface\
      file.
Running ./octave.test/args/args.exp ...
Running ./octave.test/arith/arith.exp ...
Running ./octave.test/audio/audio.exp ...
Running ./octave.test/contin/contin.exp ...
Running ./octave.test/control/control.exp ...
Running ./octave.test/diffeq/diffeq.exp ...
Running ./octave.test/error/error.exp ...
Running ./octave.test/eval-catch/eval-catch.exp ...
FAIL: octave.test/eval-catch/eval-catch-9.m
FAIL: octave.test/eval-catch/eval-catch-10.m
Running ./octave.test/eval/eval.exp ...
Running ./octave.test/for/for.exp ...
Running ./octave.test/global/global.exp ...
Running ./octave.test/if/if.exp ...
Running ./octave.test/image/image.exp ...
Running ./octave.test/index/dfi-f/index.exp ...
Running ./octave.test/index/dfi-t/index.exp ...
Running ./octave.test/infnan/infnan.exp ...
Running ./octave.test/io/io.exp ...
Running ./octave.test/linalg/linalg.exp ...
Running ./octave.test/matrix/matrix.exp ...
Running ./octave.test/nonlin/nonlin.exp ...
Running ./octave.test/number/number.exp ...
Running ./octave.test/optim/optim.exp ...
Running ./octave.test/plot/plot.exp ...
Running ./octave.test/poly/poly.exp ...
Running ./octave.test/prefer/prefer.exp ...
Running ./octave.test/quad/quad.exp ...
Running ./octave.test/recursion/recursion.exp ...
Running ./octave.test/return/return.exp ...
Running ./octave.test/set/set.exp ...
Running ./octave.test/signal/signal.exp ...
Running ./octave.test/stats/stats.exp ...
Running ./octave.test/string/string.exp ...
Running ./octave.test/struct/struct.exp ...
Running ./octave.test/switch/switch.exp ...
Running ./octave.test/system/system.exp ...
Running ./octave.test/transpose/transpose.exp ...
Running ./octave.test/try/try.exp ...
FAIL: octave.test/try/try-9.m
FAIL: octave.test/try/try-10.m
Running ./octave.test/unwind/unwind.exp ...
Running ./octave.test/while/while.exp ...
Running ./octave.test/zero-one/ff/zero-one.exp ...
Running ./octave.test/zero-one/ft/zero-one.exp ...
Running ./octave.test/zero-one/tf/zero-one.exp ...
Running ./octave.test/zero-one/tt/zero-one.exp ...

                === octave Summary ===

# of expected passes            1278
# of unexpected failures        4
../src/octave version 2.1.50 (i686-pc-linux-gnu).
Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002,\
2003 John W. Eaton.
This is free software; see the source code for copying\
conditions.
There is ABSOLUTELY NO WARRANTY; not even for\
MERCHANTIBILITY or
FITNESS FOR A PARTICULAR PURPOSE.

Report bugs to <bug-octave@bevo.che.wisc.edu>.

Anmerkung: Es scheint bei 2.1.50 unumgänglich, viermal FAIL zu bekommen. Nicht wundern, das macht nichts.

Als Abschluss habe ich dann statt make install folgendes initialisiert:

  su
  checkinstall

Die neueste Version von checkinstall ist auf der SuSE DVD (SuSE CD). Als Beschreibung habe ich

  octave - A high level programming language

gewählt. Ich hatte die Konstruktion eines RPM Paketes ausgewählt, welches checkinstall unter

  /usr/src/packages/RPMS/i386/octave-2.1.50-1.i386.rpm

ablegte. Die enstandene RPM Datei octave-2.1.50-1.i386.rpm kann hier heruntergeladen werden. Um diese zu installieren, gebe man als root

  rpm -Uhv octave-2.1.50-1.i386.rpm

ein (diese Variante ist sicherer als ein bloßes rpm -i).

Auspacken von Octave-forge

Jetzt geht es an die Installation von Octave-forge. Dazu habe ich von der Seite http://sourceforge.net/project/showfiles.php?group_id=2888 die Datei octave-forge-2003.06.02.tar.gz heruntergeladen und entpackt,

  tar zxvf octave-forge-2003.06.02.tar.gz
  cd octave-forge-2003.06.02/

Dann habe ich mir die Datei INSTALL zu Gemüte geführt. Dort stand folgendes zu lesen:

Prerequisites

Octave must be installed before building octave-forge.

Some functions in octave-forge depend on external libraries:

  * convhull, voronoi and delaunay need Qhull.  If you need these
    functions, then see main/geometry/README for instructions on
    downloading, building and installing libqhull.so and
    <qhull/*.h>.

  * symbolic expressions and variable precision arithmetic need
    GiNaC, which in turn depends on cln and gmp.  If you need
    these functions, then see http://www.ginac.de for instructions
    for installing GiNaC, cln and gmp.

  * sparse matrices need SuperLU.  A modified version of SuperLU
    is included in octave-forge/main/sparse.  This will be built
    automatically when you build octave-forge.

Also habe ich mich zu erst einmal um Qhull, CLN und GiNaC gekümmert.

Qhull, GMP, CLN, GiNaC, SuperLU ...

Angefangen habe ich mit Qhull. Die Installation von Qhull ist in der Datei README im Octave-forge Verzeichnis main/geometry/ beschrieben, also

  cd main/geometry/
  less README

Die Ausgabe der Datei brachte folgende Informationen zu Tage:

These are some function for computational geometry. They depend on
the qhull library [1].

Build Instructions
------------------

First you need the qhull library.

a.) install the qhull program from [2].

    Add the following target to src/Makefile:

libqhull.so: $(OBJS)
        c++ -shared -Xlinker -soname -Xlinker $@ -o libqhull.so $(OBJS)

    Build the shared library

        make libqhull.so

    Install the lib to place where the linker can find it.
        cp libqhull.so /usr/local/lib
        ldconfig -v.

    Copy all the header files where the C compiler can find them
        mkdir /usr/local/include/qhull
        cp qhull/src/*.h /usr/local/include/qhull

b.) Download a qhull 'lite' package from my homepage. [3]

        make
        make install

    The lite package contains only the files needed to build the
    lib and a adapted Makefile. I have removed all docfiles, too.
    So, if you want to develop with qhull choose the package from [2].

Next you need to build the geometry toolbox.

a.) if you are using this package as part of OctaveSF, return the root
    of the OctaveSF tree and follow the instructions in INSTALL

b.) if you are using this package independently, just type

        make

    and either copy the m-files and oct-files from the current
    directory onto your octave LOADPATH or update your LOADPATH
    to include the current directory.


[1] http://www.geom.umn.edu/software/qhull/
[2] ftp://ftp.geom.umn.edu/pub/software/qhull.tar.Z
[3] http://user.berlin.de/~kai.habel/libqhull.tar.gz

Kai Habel
kai.habel@gmx.de


2001-09-19 Paul Kienzle
* Instructions for build within unified octaveSF tree

2002-11-14 Andy Adler
Note: As of 14 Nov 2002, these links no longer seem to work.
Code is available from here
[1] http://www.geom.umn.edu/software/qhull/qhull2002.1.tgz
[2] ftp://ftp.geom.umn.edu/pub/software/qhull.tar.gz

Eine Anmerkung dazu, da auch ich DAU genug war, um eine Zeile falsch zu lesen. Natürlich ist in ldconfig -v. der Punkt zuviel. Das kommt dabei heraus, wenn man grammatikalisch korrekt sein will. Lange Rede, kurzer Sinn: Qhull besorgen, dann auspacken,

  tar zxvf qhull-2002.1.tgz
  cd qhull2002.1/src/

Dann habe ich das Makefile modifiziert (lokale Kopie des modifizierten Makefiles), Qhull übersetzt und installiert,

  make
  make libqhull.so
  su
  checkinstall

Dabei ist die zweite Zeile make libqhull.so wichtig, denn ich habe das Hauptziel bei make nicht verändert. Bei checkinstall habe ich wieder die Generierung einer RPM Datei ausgewählt, und als Namen den String

  Qhull - Qhull library for computational geometry

gewählt. Wer das alles selber nachvollziehen will, sollte auch noch den Namen zweimal öfter ändern, bei provides und name (Punkte 2 und 10). Die so gebastelte RPM Datei qhull-20031120-2.i386.rpm wird nach /usr/src/packages/RPMS/i386/qhull-20031120-2.i386.rpm geschrieben und kann hier heruntergeladen werden. Die Installation gestaltet sich dann recht einfach,

   rpm -Uhv qhull-20031120-2.i386.rpm

Danach habe ich (in Ermangelung der Erkenntniss, das beide Pakete Teil der SuSE Distribution sind) CLN und GiNaC heruntergeladen und übersetzt, zuerst CLN (hier noch ohne GMP, CLN sollte mit GMP schneller sein, aber naja, man kann nicht alles gleich richtig machen)

   tar zxvf cln-1.1.5.tar.gz
   cd cln-1.1.5/
   ./configure
   make
   make check

Die Ausführung von make dauert mal wieder etwas länger (noch'n Kaffee/Tee gefällig?) und make check erzeugt die folgende Ausgabe:

./tests
Testing test_I_abs...
Testing test_I_compare...
Testing test_I_plus...
Testing test_I_minus...
Testing test_I_plus1...
Testing test_I_minus1...
Testing test_I_mul...
Testing test_I_div...
Testing test_I_gcd...
Testing test_I_xgcd...
Testing test_I_ash...
Testing test_I_evenp...
Testing test_I_oddp...
Testing test_I_lognot...
Testing test_I_logand...
Testing test_I_logandc1...
Testing test_I_logandc2...
Testing test_I_logior...
Testing test_I_logorc1...
Testing test_I_logorc2...
Testing test_I_logxor...
Testing test_I_lognand...
Testing test_I_lognor...
Testing test_I_logeqv...
Testing test_I_boole...
Testing test_I_logbitp...
Testing test_I_logtest...
Testing test_I_ldb...
Testing test_I_ldb_test...
Testing test_I_mask_field...
Testing test_I_dpb...
Testing test_I_deposit_field...
Testing test_I_logcount...
Testing test_I_integer_length...
Testing test_I_ord2...
Testing test_I_power2p...
Testing test_I_isqrt...
Testing test_I_sqrtp...
Testing test_I_GV...
Testing test_MI_canonhom...
Testing test_MI_plus...
Testing test_MI_minus...
Testing test_MI_mul...
Testing test_MI_recip...
Testing test_MI_div...
Testing test_MI_expt...
Testing test_nt_jacobi...
Tests passed.

So lobe ich es mir. Dann folgt die abschließende Installation mittels

  su
  checkinstall

Bei checkinstall Auswahl einer RPM Datei, Beschreibung als

   CLN - CLN Class Library for Numbers

Checkinstall erzeugt die Datei /usr/src/packages/RPMS/i386/cln-1.1.5-1.i386.rpm. Dann habe ich noch GMP von der SuSE DVD installiert, und dann alles nochmal gemacht (Ich kann inzwischen keinen Tee mehr sehen ..)

   make distclean
   ./configure
   make
   make check

Die Ausgabe von make check sah ziemlich ähnlich aus:

./tests
Testing test_I_abs...
Testing test_I_compare...
Testing test_I_plus...
Testing test_I_minus...
Testing test_I_plus1...
Testing test_I_minus1...
Testing test_I_mul...
Testing test_I_div...
Testing test_I_gcd...
Testing test_I_xgcd...
Testing test_I_ash...
Testing test_I_evenp...
Testing test_I_oddp...
Testing test_I_lognot...
Testing test_I_logand...
Testing test_I_logandc1...
Testing test_I_logandc2...
Testing test_I_logior...
Testing test_I_logorc1...
Testing test_I_logorc2...
Testing test_I_logxor...
Testing test_I_lognand...
Testing test_I_lognor...
Testing test_I_logeqv...
Testing test_I_boole...
Testing test_I_logbitp...
Testing test_I_logtest...
Testing test_I_ldb...
Testing test_I_ldb_test...
Testing test_I_mask_field...
Testing test_I_dpb...
Testing test_I_deposit_field...
Testing test_I_logcount...
Testing test_I_integer_length...
Testing test_I_ord2...
Testing test_I_power2p...
Testing test_I_isqrt...
Testing test_I_sqrtp...
Testing test_I_GV...
Testing test_MI_canonhom...
Testing test_MI_plus...
Testing test_MI_minus...
Testing test_MI_mul...
Testing test_MI_recip...
Testing test_MI_div...
Testing test_MI_expt...
Testing test_nt_jacobi...
Tests passed.

Dann mal wieder eine Installation,

  su
  checkinstall

Bei Checkinstall wieder RPM Datei, und Beschreibung

   CLN - CLN Class Library for Numbers

mit der Änderung des Releases auf 2. Damit habe ich dann die RPM Datei /usr/src/packages/RPMS/i386/cln-1.1.5-2.i386.rpm erzeugt und installiert,

   rpm -Uhv cln-1.1.5-2.i386.rpm

Anschließend habe ich GiNaC installiert (dauert, aber macht absolut keine Probleme),

   tar jxvf GiNaC-1.1.4.tar.bz2
   cd GiNaC-1.1.4/
   ./configure
   make
   make check

Die Ausgabe von make check ergab folgenden Text:

GiNaC will now take an exam with specific input (like a pupils' exam):
examining several historic failures just out of paranoia........\
          ....... passed
examining consistency of numeric types...... passed
examining power laws..... passed
examining consistency of symbolic functions.... passed
examining consistency of nestedsums functions. passed
examining symbolic differentiation....... passed
examining polynomial GCD computation......... passed
examining rational function normalization.... passed
examining series expansion............ passed
examining symbolic matrix manipulations....... passed
examining linear solve...... passed
examining indexed objects........ passed
examining color objects... passed
examining clifford objects..... passed
examining archiving system. passed
examining hash maps............ passed
examining miscellaneous other things........ passed
PASS: run_exams
GiNaC will now run through some rather costly random consistency checks:
checking consistency of numeric types.. passed
checking consistency of symbolic functions.... passed
checking symbolic matrix manipulations..... passed
checking linear solve.......... passed
PASS: run_checks
GiNaC will now run through some basic timings:
timing commutative expansion and substitution.... passed
        size:   50      100     200     400
        time/s: 0.029   0.16    0.68    3.14
timing Laurent series expansion of Gamma function.... passed
        order:  10      15      20      25
        time/s: 0.02    0.13    0.589   2.41
timing determinant of univariate symbolic Vandermonde matrices.... passed
        dim:    6x6     8x8     10x10   12x12
        time/s: 0.006   0.059   0.489   4.469
timing determinant of polyvariate symbolic Toeplitz matrices.... passed
        dim:    6x6     7x7     8x8     9x9
        time/s: 0.027   0.119   0.489   1.939
timing hash map operations.... passed
          size: 10000   50000   100000  500000
      insert/s: 0.02    0.11    0.24    1.13
        find/s: 0.01    0.06    0.12    0.64
       erase/s: 0.01    0.04    0.09    0.47
timing Lewis-Wester test A (divide factorials). passed 0.35s
timing Lewis-Wester test B (sum of rational numbers). passed 0.004s
timing Lewis-Wester test C (gcd of big integers). passed 0.059s
timing Lewis-Wester test D (normalized sum of rational fcns). passed 0.14s
timing Lewis-Wester test E (normalized sum of rational fcns). passed 0.11s
timing Lewis-Wester test F (gcd of 2-var polys). passed 0.014s
timing Lewis-Wester test G (gcd of 3-var polys). passed 0.369s
timing Lewis-Wester test H (det of 80x80 Hilbert). passed 1.61s
timing Lewis-Wester test I (invert rank 40 Hilbert). passed 0.49s
timing Lewis-Wester test J (check rank 40 Hilbert). passed 0.26s
timing Lewis-Wester test K (invert rank 70 Hilbert). passed 3.18s
timing Lewis-Wester test L (check rank 70 Hilbert). passed 1.53s
timing Lewis-Wester test M1 (26x26 sparse, det). passed 0.08s
timing Lewis-Wester test M2 (101x101 sparse, det) disabled
timing Lewis-Wester test N (poly at rational fcns) disabled
timing Lewis-Wester test O1 (three 15x15 dets)... passed 10.846s (average)
timing Lewis-Wester test P (det of sparse rank 101). passed 0.38s
timing Lewis-Wester test P' (det of less sparse rank 101). passed 0.989s
timing Lewis-Wester test Q (charpoly(P)). passed 21.17s
timing Lewis-Wester test Q' (charpoly(P')). passed 42.24s
timing computation of antipodes in Yukawa theory...... passed 12.56s (total)
timing Fateman's polynomial expand benchmark. passed 41.869s
PASS: run_times
==================
All 3 tests passed
==================

Die abschliessende Installation von GiNaC:

  su
  checkinstall

Bei Checkinstall: RPM Datei und Beschreibung

GiNaC - GiNaC is Not a CAS (computer algebra system)

erzeugt /usr/src/packages/RPMS/i386/GiNaC-1.1.4-1.i386.rpm. Installation der RPM Datei mittels

   rpm -Uhv GiNaC-1.1.4-1.i386.rpm

Damit gab es dann ein Problem: Octave und GiNaC haben die Top-Info Node dir in /usr/local/info/:

   /usr/local/info/dir  -->

file /usr/local/info/dir from install of GiNaC-1.1.4-1 conflicts with
file from package octave-2.1.50-1 ...

Also habe ich die Installation mittels

   rpm -i --force GiNaC-1.1.4-1.i386.rpm

gewählt, das ist gewiss nicht sehr sauber, ich weiss. Da das Problem sich von selber löst, wenn man die auf der SuSE DVD mitgelieferten RPM Pakete für GMP, CLN und GiNaC verwendet, ist das Interesse an einer Lösung natürlich teilweise rein akademischer Natur. Allerdings hat nicht jeder eine SuSE 9.0 Distribution. Also hat vielleicht ein Leser dieser Seite konstruktive Vorschläge?

SuperLU ist wie oben erwähnt in der Octave-forge Version dabei.

Der Vollständigkeit halber habe ich mir dann die nicht automatisch zur Installation selektierten Pakete anzeigen lassen, und zwar mittels:

   find . -name NOINSTALL -print

Auf meiner Maschine generierte das die folgende Liste:

./extra/NaN/NOINSTALL
./extra/engine/NOINSTALL
./extra/fake-sparse/NOINSTALL
./extra/patches/NOINSTALL
./extra/perl/NOINSTALL
./extra/tk_octave/NOINSTALL
./extra/ver20/NOINSTALL
./main/parallel/NOINSTALL
./nonfree/gpc/NOINSTALL
./nonfree/splines/NOINSTALL

Ich habe selber nichts davon ausgewählt. Vor allem bei den im Verzeichnis nonfree enthaltenen Paketen sollte man sich die jeweiligen Lizenzen durchlesen und in jedem Falle befolgen.

Jetzt kann die eigentliche Installation von Octave-forge beginnen.

Installation von Octave-forge

Octave-forge ist ja schon ausgepackt, und durch die im vorherigen Abschnitt besprochenen Installtionen wurde zusätzliche Funktionalität gewonnen. Jetzt folgt die Konfiguration,

   ./configure

Auf meiner Maschine wurde Octave-forge folgendermassen konfiguriert:

octave-forge is configured with
   octave:      octave (version 2.1.50)
   mkoctfile:   mkoctfile for Octave 2.1.50
   X11 support: yes
   audio capture: yes
   Makeinfo: makeinfo --no-split
   Texi2dvi: texi2dvi --clean
   Texi2html: texi2html -split_chapter -number
   geometry toolbox: yes
   read/write JPEG: yes
   have term.h or termcap.h: yes
   symbolic toolbox: yes

Die Symbolische Toolbox verwendet GiNaC, die Geometrische Toolbox verwendet Qhull. Jetzt folgt die Übersetzung und ein anschließender Test von Octave-forge mittels

  make
  make check

Leider lief zuerst der Test schief, und zwar am Ende in main/sparse:

octave -q batch_test.m
[main/optim]
>leval
[extra/linear-algebra]
>chol
[main/comm]
>comms

<< Random Signals Package >>
  Signal Creation:                          PASSED
  Signal Analysis:                          PASSED

<< Source Coding Package >>
  PCM Functions:                            Not tested
  Quantization Functions:                   PASSED

<< Block Coding Package >>
  Cyclic Coding:                            PASSED
  Hamming Coding:                           PASSED
  BCH Coding:                               PASSED
  Reed-Solomon Coding:                      PASSED

<< Convolutional Coding Package >>
  Utility functions:                        Not tested
  Coding:                                   Not tested
  Viterbi:                                  Not tested

<< Modulation Package >>
  Analog Modulation:                        PASSED
  Digital Mapping:                          PASSED
  Digital Modulation:                       Not tested

<< Special Filters Package >>
  Hankel/Hilbert:                           Not tested
  Raised Cosine:                            Not tested

<< Galois Fields Package >>
  Find primitive polynomials:               PASSED
  Create Galois variables:                  PASSED
  Access Galois structures:                 PASSED
  Miscellaneous functions:                  PASSED
  Unary operators:                          PASSED
  Arithmetic operators:                     PASSED
  Logical operators:                        PASSED
  Polynomial manipulation:                  PASSED
  Linear Algebra:                           PASSED
  Signal Processing functions:              PASSED

[main/signal]
>medfilt
>remez
[main/general]
>bitand
>bitor
>bitxor
>bitmax
[main/image]
>conv2
>cordflt2
>bwlabel
>jpgwrite
>jpgread
[main/splines]
>trisolve(d,e,b)
>trisolve(l,d,u,b)
>trisolve(d,e,b,cl,cu)
>trisolve(l,d,u,b,cl,cu)
[main/strings]
>regexp
>[m,b]=regexp
[main/struct]
>getfield
>setfield
[main/specfun]
>ellipj
[main/sparse]
error: operator -: nonconformant arguments (op1 is 6x1, op2 is 3x1)
error: evaluating binary operator `-' near line 231, column 47
error: evaluating binary operator `<' near line 231, column 63
error: evaluating argument list element number 1
error: evaluating argument list element number 1
error: evaluating binary operator `+' near line 231, column 23
error: evaluating assignment expression near line 231, column 10
error: evaluating for command near line 30, column 1
error: near line 791 of file `main/sparse/sp_test.m'
make: *** [check] Fehler 1

Meine Original Mitschrift lautet: [grftjx. Probleme mit SuperLU ...]. Also habe ich mit verschiedenen Installationen von SuperLU gespielt, u.a. das Paket superlu von der SuSE DVD installiert ... und hatte keine Chance.

Dann habe ich angefangen nachzudenken. Das führte dazu, das ich eine neue Zeile in die Test Routine main/sparse/sp_test.m eingebaut habe, und zwar zwischen Zeile 230 und 231 die neue Zeile

     sp_values= sp_values(~isnan(sp_values) & ~isinf(sp_values));

Dann lief die Übersetzung klaglos durch. Genauer:

zemke@atum:[..]/octave-forge-2003.06.02> make check
octave -q batch_test.m
[main/optim]
>leval
[extra/linear-algebra]
>chol
[main/comm]
>comms

<< Random Signals Package >>
  Signal Creation:                          PASSED
  Signal Analysis:                          PASSED

<< Source Coding Package >>
  PCM Functions:                            Not tested
  Quantization Functions:                   PASSED

<< Block Coding Package >>
  Cyclic Coding:                            PASSED
  Hamming Coding:                           PASSED
  BCH Coding:                               PASSED
  Reed-Solomon Coding:                      PASSED

<< Convolutional Coding Package >>
  Utility functions:                        Not tested
  Coding:                                   Not tested
  Viterbi:                                  Not tested

<< Modulation Package >>
  Analog Modulation:                        PASSED
  Digital Mapping:                          PASSED
  Digital Modulation:                       Not tested

<< Special Filters Package >>
  Hankel/Hilbert:                           Not tested
  Raised Cosine:                            Not tested

<< Galois Fields Package >>
  Find primitive polynomials:               PASSED
  Create Galois variables:                  PASSED
  Access Galois structures:                 PASSED
  Miscellaneous functions:                  PASSED
  Unary operators:                          PASSED
  Arithmetic operators:                     PASSED
  Logical operators:                        PASSED
  Polynomial manipulation:                  PASSED
  Linear Algebra:                           PASSED
  Signal Processing functions:              PASSED

[main/signal]
>medfilt
>remez
[main/general]
>bitand
>bitor
>bitxor
>bitmax
[main/image]
>conv2
>cordflt2
>bwlabel
>jpgwrite
>jpgread
[main/splines]
>trisolve(d,e,b)
>trisolve(l,d,u,b)
>trisolve(d,e,b,cl,cu)
>trisolve(l,d,u,b,cl,cu)
[main/strings]
>regexp
>[m,b]=regexp
[main/struct]
>getfield
>setfield
[main/specfun]
>ellipj
[main/sparse]
208 operations tested sucessfully for 100 iterations
Solving Finite Element sparse eqn, n=725 nnz=9085 density=0.017284
Time per iteration= 0.033029 s
Your machine is 134.729272 faster than a 486dx100!
=====================
all tests completed successfully

Wer sagt's denn .. Allerdings beobachtet man manchmal (eher oft) ein Verhalten der Art

   operation #196 in sp_test.m exceeds error tolerance
   with probability 1.00%

oder ähnlich. Dieses Verhalten verursacht aber keine weiteren Probleme. Damit nicht jeder die Datei main/sparse/sp_test.m selber patchen muss, kann man hier die verbesserte Version von sp_test.m herunterladen.

Da Octave-forge auch (und vor allem) erweiterte Plot Funktionalität hinzufügt, gibt es noch den Test

   make icheck

Allerdings hatte ich bei make icheck folgendes Fehlerverhalten:

   [..snip..]
   click on the graph to place "hello"
   warning: gtext: could not capture button events.
   use left mouse to zoom the graph, right to unzoom, middle to exit
   warning: gzoom: could not capture button events.

Ergo: main/plot/gtext und gzoom funktionieren bei mir nicht. Aber man kann ja nicht alles haben. Hilfreiche Vorschläge?

Die abschliessende Installation mit Checkinstall erzeugte mir die Datei

   /usr/src/packages/RPMS/i386/octave-forge-2003.06.02-1.i386.rpm

welche hier als octave-forge-2003.06.02-1.i386.rpm heruntergeladen werden kann, die Installation erfolgt dann über

   rpm -Uhv octave-forge-2003.06.02-1.i386.rpm

Am Ende müssen eventuell noch die Pfade aktualisiert werden,

   ldconfig
   rehash
   export PATH=$PATH:/usr/local/bin

Das sollte es für Octave, Octave-forge (+Zusätze) gewesen sein. Aber es gibt ja auch noch das graphische Frontend kOctave.

Installation von kOctave

Das graphische Frontend kOctave läßt sich im Internet von http://bubben.homelinux.net/~matti/koctave/ herunterladen. Zur Installation danach auspacken, konfigurieren, übersetzen und installieren:

   tar jxvf koctave3-0.65.tar.bz2
   cd koctave3-0.65/
   ./configure

Bei mir fehlten erst einmal die KDE Header (kdelibs3-devel, kdebase3-devel + dependencies). Also nachinstallieren und nochmal,

   ./configure
   make

Ich bekam den folgenden Fehler beim Übersetzen:

cc1plus: Warnung: "-Wbad-function-cast" is valid for C/ObjC but not for C++

Das scheint aber keine weiteren Auswirkungen zu haben, also weiter im Text,

   make check
   su
   checkinstall

kOctave installiert sich defaultmäßig unter /usr/local/kde/bin/koctave3. Dann muss man eventuell noch den Pfad ändern. Wie man die Dokumentation von Octave von kOctave aus aufruft, habe ich allerdings noch nicht herausgefunden. Ich habe laut Installationsanweisungen die Datei commands.lst nach ~/.commands.lst kopiert, aber das zeigte keinerlei Wirkung. In meine .profile Datei habe ich noch den Pfad für kOctave angepasst:

   export PATH=$PATH:/usr/local/kde/bin

Das war es dann für kOctave. Also noch viel Spass mit Octave + Octave-forge + kOctave.

Die RPM basierte Installation

Diese Installation basiert auf den von SuSE gelieferten und den von mir während meiner Installationsabenteuer erzeugten RPM Dateien. Benötigt werden meine RPM Dateien

Diese müssen dann (in dieser Reihenfolge) mittels

   rpm -Uhv octave-2.1.50-1.i386.rpm
   rpm -Uhv qhull-20031120-2.i386.rpm
   rpm -Uhv octave-forge-2003.06.02-1.i386.rpm

installiert werden. Dieses Bundle läuft stabil unter SuSE 9.0 (wenn die benötigten Pakete wie texinfo alle installiert sind).

RPM Dateien aus dem Internet

Es geht natürlich auch über fertige RPM Pakete anderer aus dem Netz (dabei aber Vorsicht vor Root-Kits und ähnlichen Schweinereien walten lassen), so brachte die Suche über rpmfind.net (http://www.rpmfind.net) eine erkleckliche Anzahl fertiger RPM-Pakete für diverse Distributionen:

Ebenso findet man unter rpmseek.com (http://www.rpmseek.com) viele fertige Pakete.