home *** CD-ROM | disk | FTP | other *** search
- Spezifikation zu einem neuen Install-Programm
- =============================================
-
- Autoren : Lutz Birkhahn, Stefan Lindner
-
- History:
- Version| Datum | Erläuterung
- -------|----------|---------------------------------------------------------
- 0.0 | 16/05/90 | Urfassung (Lutz Birkhahn, Stefan Lindner)
- 0.5 | 90-91 | Prototyp (Stefan Steffens)
- 0.9 | 27/06/91 | Testversion (Lutz Birkhahn = LB)
- 0.99 | 05/07/91 | β-Test (LB)
- 0.991| 12/07/91 | Filevariable source-dir eingeführt (LB)
- 0.992| 22/08/91 | #setdir funktioniert jetzt auch im Root-Directory (LB)
- | | TOS-Fehlermeldungen bei #execute werden beim Namen genannt
- 0.993| 28/08/91 | bei #extract und #copy kann nun "alles ersetzt" werden,
- | | #copy achtet nun auch auf bereits vorhandene Dateien
- | | Datum/Uhrzeit und Attribute werden jetzt mitkopiert (LB)
- 1.0 | 11/09/91 | In #pathrequest kann nun ein Ordner (als Filename) ein-
- | | gegeben und damit erzeugt werden. (LB)
- | | Die Pfade sind nun alle in klein geschrieben (auch in
- | | #replace-Strings). (LB)
- -------|----------|---------------------------------------------------------
-
-
- (Anmerkung: Wie der Titel sagt, handelt es sich bei dieser Datei um eine
- Spezifikation bzw. eine daraus entstandene Dokumentation. Es ist möglich,
- daß die eine oder andere Beschreibung nicht komplett auf den momentanen
- Zustand des Programmes zutrifft. In diesem Fall ist die entsprechende
- Beschreibung als Wunsch für zukünftige Versionen aufzufassen.)
-
-
- 1. Ziele
- ========
-
- ⇨ Das neue Install-Programm soll das bisher existierende Install-Programm
- vollständig ersetzen.
- ⇨ Die Install-Datei soll wesentlich besser lesbar und damit auch leichter
- vom Benutzer an eigene Bedürfnisse anpaßbar sein.
- ⇨ Der Benutzer soll die Möglichkeit haben, die Installation nach seinen
- Wünschen auch ohne Änderung der Install-Datei modifizieren zu können
- (sog. Teilinstallationen).
- ⇨ Die Installation soll insgesamt noch sicherer werden, z.B. durch Abfrage
- des vorhandenen Speicherplatzes auf der Festplatte und durch Überprüfung,
- ob die eingelegte Diskette auch die richtige ist.
- ⇨ Das Install-Programm soll unabhängig vom zu installierenden Paket sein;
- prinzipiell sollte jedes beliebige Programm mit einer geeigneten Install-
- Datei installiert werden können.
-
-
- 2. Prinzipieller Programmablauf
- ===============================
- Nach dem Starten des Install-Programmes wird zunächst (per Fileselektorbox)
- eine Install-Datei ausgewählt. Die Install-Datei muß dort stehen, wo auch die
- ganzen zu installierenden Dateien (bzw. deren Verzeichnisse) sich befinden,
- im Normalfall also im Root-Verzeichnis auf der Diskette. Alternativ kann man
- sich die Dateien aber auch auf die Festplatte oder in eine Ramdisk kopieren,
- dann muß aber auch die Install-Datei von dort ausgewählt werden.
- Grund: alle "Source"-Dateien werden mit einem relativem Pfad
- angegeben (z.B. "tex\tex.ttp"). Das Install-Prg. hängt dann
- noch den Pfad, wo es die Install-Datei gefunden hat (z.B. "a:\"
- oder "c:\tmp\"), davor und lädt von dort alle zu kopierenden
- Dateien.
- Install-Dateien haben im allgemeinen den Namen des zu installierenden Pakets
- (TeX, METAFONT, Preview, NECP6, SLM804, NL10 ...) und als Extension die
- Zeichenfolge ".INS", also z.B. "TEX.INS".
-
- Nun wird die Installdatei eingelesen (die komplette Datei wird zunächst in
- einen Puffer gelesen, damit die Diskette auch gewechselt werden kann, falls
- von Diskette installiert wird), und Befehl für Befehl abgearbeitet. Im
- Normalfall wird am Anfang der Datei eine Folge von #banner-, #menu- und
- #showmenu-Befehlen stehen, woraufhin der Benutzer eine GEM-Dialogbox mit
- dem beschriebenen Inhalt bekommt, in der er den gewünschten Umfang der
- Installation auswählen kann. Abhängig von den selektierten Optionen werden
- boolesche Variablen gesetzt, die von den #if/#then/#else-Befehlen ausgewer-
- tet werden können. Wenn ein Diskettenwechsel nötig ist, erscheint eine
- Alertbox mit entsprechendem Inhalt (natürlich nur, wenn von Laufwerk A:
- oder B: installiert wird). Wenn Fehler auftreten, wird dies vom Install-
- Programm automatisch in Alertboxen mitgeteilt, z.B. "Prüfsummenfehler
- beim Kopieren der Datei metafont\inimf.prg. [Nochmal versuchen][Ignorieren]
- [Abbruch]" und entsprechend des angeklickten Buttons weiterverfahren.
-
- Sobald die Installation beendet ist, wird die Anzahl der aufgetretenen Fehler,
- Probleme oder Warnungen bzw. eine Erfolgsmeldung ausgegeben. Schließlich kann
- der Benutzer auswählen, ob er ein weiteres Paket installieren oder das Install-
- Programm beenden möchte.
-
-
- 3. Syntax der Install-Datei
- ===========================
- Die Install-Datei ist formatfrei, d.h. es können an jeder Stelle zwischen
- den syntaktischen Elementen ("Wörtern") beliebig viele Leerzeichen, TABs,
- Zeilenschaltungen (CR/LF) und Kommentare stehen; das Zeilenende wird nicht
- ausgewertet. Sie besteht aus beliebig vielen Befehlen mit entsprechender
- Parameteranzahl. Kommentare werden mit einem Prozentzeichen ("%") eingeleitet
- und gelten bis zum Zeilenende (genau wie bei TeX, METAFONT etc.).
-
- Die Syntaxbeschreibung erfolgt in EBNF in ähnlicher Form wie die Beschreibung
- der Setup-Datei in Stefan Lindners TeX-Beschreibung:
-
- ::= das nichtterminale Symbol auf der linken Seite wird durch die
- rechte Seite definiert
- <name> nichtterminales Symbol
- | Alternative ("oder")
- [ausdruck] Ausdruck ist optional
- (ausdruck)* Ausdruck darf beliebig oft (auch gar nicht) auftreten
- (ausdruck)+ Ausdruck darf ein- oder mehrmal auftreten
-
- Terminale Symbole werden ohne schmückendes Beiwerk hingeschrieben. Kommentare
- und mehrfach auftretende Leerzeichen etc. werden nicht mit aufgeführt, siehe
- oben. Die Semantik der einzelnen Befehle wird nach der Syntaxbeschreibung
- erläutert.
-
-
- <install file> ::= <commands>
- <commands> ::= (<command>)+
- <command> ::= #banner "<string>"
- | #menu "<string>" <boolean var>
- | #showmenu
- | #print "<string>"
- | #pathrequest "<string>" <file var>
- | #request "<string>" [<boolean var>]
- | #if <boolean var> <commands> [#else <commands>] #fi
- | #requiredspace <abspath> <size>
- | #setdir <abspath>
- | #copy <relfile> [<checksum>]
- | #extract <relfile> <pattern>
- | #replace "<string>" "<string>" <absfile>
- | #checkdisklabel <filename>
- | #execute <abspath> (<parameter>)*
- | #end
- <absfile> ::= <drive>:\<path>\<filename>
- | <file var>[\<path>][\<filename>]
- <abspath> ::= <drive>:\<path>
- | <file var>[\<path>]
- <relfile> ::= <path>\<filename>
- <path> ::= [<filename>](\<filename>)*
- <checksum> ::= <hex digit><hex digit><hex digit><hex digit>
- <size> ::= <integer>
- | <integer>k | <integer>K
- | <integer>m | <integer>M
- <boolean var> ::= <variable>
- <file var> ::= <variable>
-
- Der Rest sollte sich ziemlich von selbst erklären, aber der Vollständigkeit
- halber noch die informellen Definitionen (Puristen und Masochisten dürfen
- sich die restlichen Definitionen auch formal auf ein Schmierblatt notieren):
-
- <drive> ein Buchstabe von 'a' bis 'p' (groß oder klein geschrieben)
- <filename> sind maximal 8 Zeichen und optional ein Punkt ('.') und
- bis zu drei weitere Zeichen. Zeichen ist in diesem Zusammen-
- hang alles außer '.', ':', '\', '?' und '*' (TOS verkraftet
- ziemlich viel)
- <pattern> ist ein <filename>, der auch '?' und '*' enthalten darf (an
- den bei TOS erlaubten Stellen)
- <string> ist alles außer doppelte Anführungszeichen ('"'). Letztere
- werden als '\"' geschrieben (wie in C üblich). Ein Zeilen-
- ende, das nicht im String auftauchen soll, wird durch ein
- vorangestelltes '\' eingegeben (also '\' am Zeilenende).
- '\\' wird durch ein einzelnes '\' ersetzt. Wenn der Anfang
- des Strings den Namen einer Filevariablen <file var> angibt,
- wird deren Inhalt in den String eingefügt
- <variable> ist eine Folge von Zeichen außer '\', '.', ':', '#' und
- den verschiedenen "Leerzeichen"
- <hex digit> ist eine Ziffer (0-9) oder (a-f) oder (A-F)
- <integer> ist eine ganze positive Zahl (das muß nicht weiter erklärt
- werden, oder?!)
-
-
- Nun zur Semantik der einzelnen Befehle:
-
- #banner "<string>"
- <string> wird in der bei #showmenu erscheinenden Dialogbox als Überschrift
- angezeigt. Wenn vor einem #showmenu mehrere #banner angegeben sind, so wird
- nur der letzte verwendet.
-
- Bsp.: #banner "TeX-Installation"
-
-
- #menu "<string>" <boolean var>
- Gibt eine auszuwählende Option in der bei #showmenu erscheinenden Dialog-
- box an. Mit Hilfe von <string> wird ein erklärender Text und maximal zwei
- Buttons angegeben. Buttons werden durch Umschließen des Button-Textes mit
- eckigen Klammern eingegeben. Wenn ein Button-Text mit einem Ausrufezeichen
- anfängt, so ist dieser Button bereits zu Beginn des Dialogs selektiert.
- Wenn zwei Buttons spezifiziert werden, so werden diese als Radio-Buttons
- dargestellt, von denen der erste (linke) Button defaultmäßig selektiert
- ist, wenn kein '!' angegeben wurde. Ein einzelner Button ist defaultmäßig
- nicht selektiert. Wenn das Zeichen '[', ']' oder '!' selbst ausgegeben
- werden soll, so kann dies an den betreffenden Stellen durch Voranstellen
- eines Backslash ('\') erfolgen. Die boolesche Variable <boolean var>
- erhält den Wert true, wenn der linke (bzw. einzige) Button selektiert
- wurde.
-
-
- #showmenu
- Bringt die bisher angesammelten #banner- und #menu-Befehle in einer Dialog-
- box auf den Bildschirm und wartet auf die Auswahl des Benutzers. Die selek-
- tierten Optionen werden in den bei #menu angegebenen booleschen Variablen
- als true eingetragen, die restlichen boolschen Variablen werden auf false
- gesetzt.
-
-
- #print "<string>"
- Gibt <string> als Text auf dem Bildschirm aus.
-
-
- #pathrequest "<string>" <file var>
- Öffnet eine Fileselektorbox und speichert den ausgewählten Filenamen in
- der File-Variable <file var>. Falls TOS 1.4 oder neuer installiert ist,
- wird <string> als Überschrift der Fileselektorbox ausgegeben. Falls in
- <file var> bereits etwas eingetragen ist, wird dieser Name als Default-
- Pfad in der Fileselektorbox gesetzt, ansonsten der Pfad der Install-Datei.
- Der vorgewählte Filename ist '*.*'. Wird zusätzlich zum Pfad ein Dateiname
- eingegeben, zählt dies als neu zu erzeugender Ordner.
-
-
- #request "<string>" [<boolean var>]
- Bringt via form_alert() eine Alarmbox auf den Bildschirm. <string> hat
- ab dem zweiten Zeichen das bei form_alert() übliche Format, das erste
- Zeichen ist eine Ziffer, die den Default-Button angibt ('0' = kein
- Default, '1' = erster Button ist Default, ...). Das Format von <string>
- ist also:
-
- "<default-button>[<icon>][<text>][<buttons>]"
-
- Falls <boolean var> angegeben wurde, wird das Ergebnis von form_alert()
- dort abgespeichert, wobei 1 als false und alle Zahlen größer als 1 als
- true gespeichert werden.
-
- Daraus folgt, daß es nicht sinnvoll ist, in einer mit #request
- erzeugten Alarmbox mehr als zwei Buttons anzugeben. Man wird diesen
- Befehl also nur entweder als Hinweis (1 Button "OK", keine <boolean
- var> angegeben) oder als Frage, die mit ja oder nein beantwortet
- werden kann (2 Buttons, Ergebnis wird in <boolean var> abgespeichert),
- verwenden.
-
-
- #if <boolean var> <commands> [#else <commands>] #fi
- Wenn der Wert von <boolean var> true ist, werden die <commands> vor dem
- #else oder #fi ausgeführt. Ist der Wert false, werden die ersten
- <commands> übersprungen und entweder die Befehle zwischen #else und
- #fi ausgeführt, oder gar nichts, wenn der #else-Teil fehlt. Es dürfen
- mehrere #if-#else-#fi-Konstrukte verschachtelt werden.
-
-
- #requiredspace <abspath> <size>
- Fragt den noch vorhandenen Speicherplatz auf dem Gerät, das durch <abspath>
- angegeben wird, ab (wichtig ist nur der Laufwerksname im ersten Zeichen
- von <abspath>, der restliche Pfad wird ignoriert). Falls der vorhandene
- Speicherplatz kleiner als <size> ist, gibt es eine Fehlermeldung. Der
- Benutzer kann dann entscheiden, ob er die Meldung ignorieren oder die
- Installation abbrechen will (ignorieren kann z.B. nützlich sein, wenn man
- das Paket auf einer komprimierenden RAM-Disk installieren will).
-
-
- #setdir <abspath>
- Setzt das aktuelle Direktory auf <abspath>. Dabei werden alle Ordner
- in <abspath>, die noch nicht existieren, erzeugt. Nachfolgende #copy-
- und #extract-Befehle erzeugen die Dateien im aktuellen Directory.
-
-
- #copy <relfile> [<checksum>]
- Kopiert die in <relfile> angegebene Datei in das aktuelle Directory.
- Falls eine <checksum> angegeben ist, wird diese mit der Prüfsumme
- der zu kopierenden Datei verglichen und im Fehlerfall eine Fehlermeldung
- (Abbruch/ignorieren/nochmal) erzeugt. Die Prüfsumme entspricht der
- von ARC verwendeten CRC-ähnlichen Prüfsumme.
-
- Da im #copy-Befehl nur ein Pfad angegeben wird, müssen daraus sowohl
- der Quell- als auch der Zielpfad gewonnen werden. Dazu wird <relfile>
- in einen relativen Pfad <relpath> und einen Dateinamen <filename>
- zerlegt. Das aktuelle Directory wird als <current dir> bezeichnet.
- <install dir> sei das Directory, von dem die Install-Datei gelesen
- wurde. Dann wird die Datei <install dir>\<relpath>\<filename> nach
- <current dir>\<filename> kopiert, entspricht also dem Unix-Befehl
- (für MS-DOS muss nur cp durch copy ersetzt werden)
-
- cp <install dir>\<relpath>\<filename> <current dir>\<filename>
-
-
- #extract <relfile> <pattern>
- Extrahiert aus dem Archiv <relfile> die mit <pattern> angegebenen
- Dateien. Mit den Definitionen beim #copy-Befehl ist der vollständige
- Name des Archivs dann <install dir>\<relfile>, die in <pattern>
- angegebenen Dateien werden in das <current dir> extrahiert. Das Format
- des Archivs ist kompatibel zu LHARC (LZH-Dateien).
-
- #replace "<string1>" "<string2>" <absfile>
- Ersetzt in der durch <absfile> angegebenen Datei alle Vorkommen von
- <string1> durch <string2>. In allen drei Parametern kann eine Filevaria-
- ble vorkommen.
-
- Dieser Befehl wird vor allem dazu benutzt, um bestimmte Setup-
- Dateien (z.B. texsetup) zu installieren. Dort kann dann z.B.
- "K:\TEX\" durch den Wert der Variablen target ersetzt werden:
-
- #replace "K:\\TEX\\" "target" target\texsetup
-
- Achtung: Filevariablen hören immer mit einem '\' auf. Es ist also sinn-
- voller, "ROOT\\" durch "target" zu ersetzen, als "ROOT", weil im letzteren
- Fall noch ein '\' angehängt würde.
-
-
- #checkdisklabel <filename>
- Falls die Installation von Diskette erfolgt (<install dir> ist auf
- A: oder B:), wird das Diskettenlabel überprüft. Wenn es nicht mit
- <filename> übereinstimmt, wird der Benutzer ermahnt, doch bitte die
- richtige Diskette einzulegen. Es ist möglich, diesen Hinweis zu ignorieren.
-
-
- #execute <abspath> (<parameter>)*
- <abspath> gibt den Namen des zu startenden Programmes an, parameter sind
- die zu übergebenden Parameter, wobei diese als Pfade interpretiert werden.
- Wenn also am Anfang eines Parameters eine Filevariable steht, so wird
- diese expandiert.
-
-
- #end
- Beendet die Installation (und damit auch das Ausführen der Install-Datei)
- und gibt die Abschlußmeldung ("erfolgreich" oder Anzahl der aufgetretenen
- Probleme) aus. Anschließend wird der Benutzer gefragt, ob er weitere
- Software installieren möchte oder das Programm verlassen möchte.
-
-
-
- 4. Sonstiges
- ============
-
- Es gibt eine spezielle Filevariable mit dem Namen source-dir, die mit dem
- Pfad der Install-Datei und damit der Quelle aller zu kopierenden Dateien
- vorbelegt ist. Eine Änderung dieser Variable führt *nicht* zu einer Änderung
- des Verhaltens der #copy-Funktion, weil diese Variable bei Programmstart
- lediglich initialisiert wird, später aber intern weder abgefragt noch ver-
- wendet wird.
-