Programmpaketverwaltung mit Imake
CIP Index Up Left Right

Programmpaketverwaltung mit Imake

Sourcen von großen X Anwendungen kommen meist mit einem Imakefile anstelle eines Makefiles. Mit imake kann man das systemunabhängige Imakefile in ein Makefile wandeln, lokale Pfade und Systemparameter werden dabei automatisch eingesetzt.

Möchte man die C-Source eines solchen X Programmpakets übersetzen, braucht man i.a. nur xmkmf (erstellt das Makefile) und make (startet die Compilation) einzugeben. Das funktioniert so auf jeder Architektur, wenn das Programm sauber geschrieben wurde.

Bei der Generation des Makefile aus dem Imakefile werden zuerst lokale Konfigurationsdateien geladen (bei uns aus /local/X11R5/lib/X11/config), wo z.B. die Pfade die wichtigen Programmen und Bibliotheken stehen, oder Variablen für bestimmte Grundfunktionen definiert werden (z.B. $(RM) als rm). Diese Definitionen werden an den Anfang des Makefiles geschrieben.

Danach wird das eigenliche Imakefiles bearbeitet. Zuerst wird es durch einen Präprozessor geschickt (genau wie C, d.h. dieselbe Art Macros zu definieren) mit den vorher eingelesenen Definitionen wie z.B. der Architektur (Je nach Architektur ist SunArchitecture, HPArchitecture oder SGIArchitecture definiert und kann mit #ifdef abgefragt werden).

Diesen Schritt benutzt man hauptsächlich auch dazu, die im Imakefile enthaltenen Regeln aufzulösen. Diese Regeln sind eine verallgemeinerte Form der Abhängigkeitsdefinitionen des späteren Makefile. Die Liste aller definierten Regeln steht in der Datei Imake.rules.

Beispiel: Folgende Zeile im Imakefile

NormalProgramTarget(program,objects,deplibs,locallibs,syslibs)
wird im Makefile aufgelöst zu
program: objects deplibs
  $(RM) program
  $(CC) -o $@ objects $(LDOPTIONS) locallibs $(LDLIBS) syslibs $(EXTRA_LOAD_FLAGS)

clean::
  $(RM) program

Am Schluß werden noch einige Standardregeln angehängt, wie etwa clean zum Löschen der compilierten Binaries. Dabei wird übrigens heftig vom :: Operator des make gebrauch gemacht, d.h. es ist möglich mehrere Regeln zu einem target zu haben, diese werden dann alle nacheinander ausgeführt (wenn die Abhängigkeiten dafür sprechen).