Nächste Seite: Aufruf und Bedienung Aufwärts: Abhängigkeiten verwalten (m2make) Vorherige Seite: Abhängigkeiten verwalten (m2make)

## Aufgabe und Arbeitsweise

unterstützt die getrennte Übersetzung von Moduln mit gleichzeitiger Konsistenzprüfung der Schnittstellen. Dazu muss auf die Reihenfolge der Übersetzung der verschiedenen Moduln geachtet werden. Bei der Compilation eines Moduls müssen alle Definitionen der importierten Moduln in übersetzter Form vorliegen; in also als Symboldatei. Diese Abfolge bestimmt sich aus den Abhängigkeiten zwischen den verschiedenen Moduln.

Abbildung 3.1 zeigt eine mögliche Ausgangssituation: die Definitionen der Moduln M4, M5 und M2 müssen übersetzt werden, bevor die Implementation des Moduls M2 übersetzt werden kann. Ebenso muss die Definition von M6 vor der Definition von M3 übersetzt werden. Ein möglicher Ablauf von Compilationen der Definitionsmoduln wäre also:

> M6, M3, M5, M4, M2

Sind all diese Definitionen übersetzt, können die zugehörigen Implementationen in beliebiger Reihenfolge übersetzt werden.

Abbildung: Abhängigkeiten mehrerer Moduln

Oftmals ist es schwierig , diese Abhängigkeiten genau zu übersehen und die Auswirkungen einer Änderung eines Moduls richtig zu erkennen. Um in einem solchen Fall die erneute Übersetzung aller Moduln zu verhindern, kann m2make 3.1 zur Hilfestellung herangezogen werden. Das Programm `m2make` übernimmt die aufwendige Arbeit, die Aktualität aller Moduln zu überprüfen und die nötigen Übersetzungen in der richtigen Reihenfolge zu veranlassen. Für Programm-Moduln wird nach einer erfolgreichen Übersetzung ausserdem der Linker gestartet und eine ausführbare Datei erzeugt. Der übliche Entwicklungslauf zwischen

> Editor Compiler Linker Ausführung

verkürzt sich mit `m2make` zu

> Editor Make Ausführung

Dabei dürfen Sie beliebig Quelltexte ändern und erhalten schliesslich in jedem Fall eine lauffähige Version. Bei der Übernahme von Quelltexten anderer Programmierer -- denkbar sind etwa Moduln von Public Domain Disketten oder von Freunden -- erspart `m2make` das zeitraubende Ermitteln der Abhängigkeiten zwischen den Moduln. Mit `m2make` sind Sie sicher, dass diese neuen Moduln richtig in Ihr System übernommen werden.

Diese Aufgabe erfordert mehrere Schritte. Als erstes müssen die Abhängigkeiten der betroffenen Moduln festgestellt werden. Dies geschieht durch die Untersuchung der einzelnen Quelltexte. In diesen wird nach `IMPORT`-Anweisungen gesucht. Das jeweils aktuelle Modul ist von allen dort referenzierten Moduln abhängig. Diese werden in einer Liste eingetragen. Sind keine weiteren `IMPORT`-Anweisungen mehr zu finden, wird die Suche im nächsten Modul der Liste fortgesetzt. Der Suchvorgang wird beendet, sobald die Liste keine unbearbeiteten Einträge mehr enthält.

Bei diesem Vorgang werden die Quelltexte sowohl der Definitionen als auch der Implementationen durchsucht. Ausserdem sind die Abhängigkeiten entsprechend markiert, um der besonderen Behandlung der Abhängigkeiten der Definitionsmoduln Rechnung tragen zu können.

Ausserdem wird implizit angenommen, dass jedes Implementationsmodul die Moduln `MathFFP`, `MathReal`, `Mathieeedoubbas`, `Profiler` und `Arts` importiert. Folglich werden diese Compilationszeiten und Schlüssel ebenfalls überprüft.

Um diesen aufwendigen ersten Schritt möglichst selten durchführen zu müssen, legt `m2make` nach diesem eine Abhängigkeitendatei an, die beim nächsten Mal den erheblichen Aufwand sparen kann. Sie ist aber nur dann noch gültig, wenn in der Zwischenzeit keine Abhängigkeiten geändert wurden.

Der zweite Schritt sucht eine gültige Reihenfolge für die Übersetzung der Definitionsmoduln. Wie bereits erwähnt, bestehen mehrere mögliche Ablauffolgen. Ausserdem wird in diesem Schritt geprüft, ob eine Übersetzung überhaupt erfordert ist. Dies ist der Fall, wenn mindestens eine der folgenden Bedingungen wahr ist:

- Eine im Definitionsmodul importierte Definition wurde neu übersetzt.
- Der Quelltext ist neuer als die entsprechende, übersetzte Version oder es besteht gar keine übersetzte Version.
- Das Implementationsmodul importiert eine Definition, die neu übersetzt wurde.
- Das übersetzte Implementationsmodul ist älter als die übersetzte Versions des Definitionsmodul, d.h. die Objektdatei ist älter als die zugehörige Symboldatei.

Bei allen Altersvergleichen wird das Datum der letzten Änderung der entsprechenden Datei verwendet. Es ist deshalb äusserst wichtig, dass die Systemuhr immer die korrekte Zeit angibt. Insbesondere ist eine ,,Zukunftszeit`` zu vermeiden. Ausserdem sollten Dateien ausschliesslich mit `COPY CLONE` oder ähnlichem kopiert werden.

Falls schliesslich alle zu übersetzenden Quelltexte gefunden wurden und auch alle Bibliotheksmoduln in einem konsistenten Zustand erscheinen, wird nun der Compiler aufgerufen. Als Argumente werden die Namen aller neu zu übersetzenden Quelltexte in der ermittelten, korrekten Reihenfolge übergeben. Treten während der Übersetzung keine Fehler auf, ruft `m2make` schliesslich nach der Compilation des Hauptmoduls -- sofern es sich um ein Programm-Modul handelt -- den Linker auf, um eine ausführbare Datei zu erzeugen.

Nächste Seite: Aufruf und Bedienung Aufwärts: Abhängigkeiten verwalten (m2make) Vorherige Seite: Abhängigkeiten verwalten (m2make)