Um bestimmen zu können, welche Abhängigkeiten insgesamt bestehen, wird zunächst ein Graph konstruiert, der das gesamte Programmsystem beschreibt. Dabei dient die Komponente als Ausgangspunkt des Graphen, die als Zielkomponente (TARGET bei BEGIN-MAKE) angegeben wurde. Der weitere Aufbau des Graphen erfolgt durch die Auswertung der Abhängigkeiten (make-Subanweisung SET-DEPENDENCY).
Abhängigkeiten haben die folgende Struktur:
(target-object1, target-object 2),(from-object1, from-object2,...),
(action1,...)
Diese Notation bedeutet:
die Zielkomponenten (target-objects) sind abhängig von den Ausgangskomponenten (from-objects)
die Aktionen (actions) beschreiben, wie eine Zielkomponente erzeugt wird.
Eine Zielkomponente ist nicht aktuell, wenn eine zugehörige Ausgangskomponente einen neueren Änderungszeitpunkt aufweist, oder die Zielkomponente nicht vorhanden ist.
Die oben dargestellte Abhängigkeit ist äquivalent zu folgender:
target-object1, (from-object1, from-object2,...), (action1,...)
target-object2, (from-object1, from-object2,...), (action1,...)
Am Anfang besteht der Graph allein aus dem Ziel des make-Laufs. Danach wird mit Hilfe der Abhängigkeiten der Graph nach und nach erweitert. Ist eine Komponente im Graphen Zielkomponente und hat noch keinen Nachfolger, werden die zugehörigen Ausgangskom-
ponenten an diesen Knoten gehängt.
Wenn make keine Abhängigkeiten mehr auf den Graphen anwenden kann, ist der Aufbau des Graphen abgeschlossen. Die Komponenten im Graphen, die keine Ausgangskomponenten haben, sind die Sourcen des Programmsystems. Sie müssen real vorhanden sein, um das Ziel des make-Laufs erzeugen zu können. Für eine Zielkomponente müssen alle Sourcen vorhanden sein (nicht nur die geänderten), sonst wird der make-Lauf mit Fehler abgebrochen.
Für jede Zielkomponente darf nur eine eindeutig bestimmte Aktionsfolge existieren. Andernfalls wird der make-Lauf mit Fehler abgebrochen.
Von den Sourcen ausgehend werden die Beziehungen zwischen Zielkomponenten und Ausgangskomponenten im Hinblick auf den Änderungszeitpunkt ausgewertet. Ist eine Zielkomponente nicht aktuell, wird die entsprechende Aktion veranlasst.
Beispiel
Das nachfolgende Beispiel zeigt die Arbeitsweise der make-Funktionalität unter Verwendung von Wildcards. Die Bibliothek, in der die Komponenten stehen, ist die voreingestellte Bibliothek.
Das Phasenelement PROG (Elementtyp C) wird aus den Objektmodulen TEIL1 und TEIL2 (beide vom Elementtyp R) erzeugt. Diese Objekte werden aus Sourcen vom Typ S mit Suffix „.COB“ übersetzt. Die Aktionen sind nur angedeutet.
Die Abhängigkeiten (Bibliothekselemente im Format (,NAME,TYPE)):
(1) TARGET-OBJECT1 = *LIB-ELEM(,PROG,C), - (FROM-OBJECT1=*LIB-ELEM(,TEIL1,R), FROM-OBJECT2=*LIB-ELEM(,TEIL2,R)), - ACTION1 = 'LINK PROG' (2) TARGET-OBJECT2 = *LIB-ELEM(,*,R) , - FROM-OBJECT = *LIB-ELEM(,**.COB,S), - ACTION2 = 'COMPILE'
Wenn die Komponente *LIB-ELEM (,PROG,C) im make-Lauf erzeugt werden soll, ist sie der Anfangsknoten des Graphen..
Der Graph kann nur mit der Abhängigkeit (1) erweitert werden. Das Ergebnis:
Die Zielkomponente der Abhängigkeit (2) passt als make-Auswahlangabe auf *LIB-ELEM(,TEIL1,R), die zugehörige Ausgangskomponente liefert als Ergebnis der Konstruktion *LIB-ELEM(,TEIL1.COB,S), das im Graphen an *LIB-ELEM(,TEIL1,R) gehängt wird.
In gleicher Weise wird (,TEIL2.COB,S) an (,TEIL2,R) gehängt.
*LIB-ELEM(,TEIL1.COB,S) und *LIB-ELEM(,TEIL2.COB,S) sind die Sourcen, die zur Erzeugung von *LIB-ELEM(,PROG,C) nötig sind; sie müssen real vorhanden sein.