Rekompilation Welche Source-Files müssen mit welcher Option übersetzt werden? Welche Object-Files müssen zu welchen Programmen gelinkt werden? Welche Librar ies in welcher Reihenfolge dazu? Welches besondere Pre-Processing ist für einzelne Files nötig? Nach Änderung: Welche Kommandos sind für ein Rebuild nötig? run-file: Zuviel rekompilieren: Zeitverschwendung Manuelle Rekompilation: Zuwenig rekompilieren: Schwierig zu findende Bugs Falsche Rekompilation: Noch schwieriger zu findende Bugs Automatisier ung erforder t Infor mation file: Konfigurationsdokument 2005 AG Rechner netze 3-make.1
Benutzung von Aufr uf: make think edit make test Verfügbarkeit UNIX (seit Version 7, 1978) Auch auf Mainframes PC: Hunderte von -Var iationen Evolution der -Versionen V7 Sys5 SunOS GNU- 2005 AG Rechner netze 3-make.2
GNU- Kompatibel zu allen älteren -Versionen Standard- (IEEE POSIX.2) Solar is: /usr/local/bin/gmake Linux: /usr/bin/make Dokumentation: Info-File (C-h C-i m make RET) Achtung: Man-Page nicht für GNU- man/info gmake man/info make file Enthält Abhängigkeitsregeln: target : dependencies... command...... 2005 AG Rechner netze 3-make.3
Basisoperation Herstellung eines Targets Executable, Object-File, etc. Dependencies sind Input Alle Dependencies existieren und sind aktuell Target älter als Dependencies rebuild Kommandos an Shell übergeben Input für file Inhalt des aktuellen Verzeichnisses Eingebaute Regeln 2005 AG Rechner netze 3-make.4
files Beispiel-file edit: main.o input.o display.o buf.o g++ -o edit main.o input.o display.o \ buf.o -lx11 main.o: main.cc defs.hh buf.hh g++ -c main.c input.o: input.cc defs.hh g++ -c input.c display.o: display.cc defs.hh buf.hh g++ -c display.cc buf.o: buf.cc buf.hh defs.hh g++ -c buf.c clean: rm edit main.o input.o display.o buf.o core 2005 AG Rechner netze 3-make.5
files -Parameter Default-Target: erster Eintrag im file Alter native: make main.o make clean Variablen Definition im file: NAME=value Inder Kommandozeile: NAME=value (overr ide) Benutzung: $(NAME) 2005 AG Rechner netze 3-make.6
files Beispiel OBJECTS= main.o input.o buf.o LIBS= -lx11 edit: $(OBJECTS) g++ -o edit $(OBJECTS) $(LIBS) main.o: main.cc defs.hh buf.hh g++ -c main.c input.o: input.cc defs.hh g++ -c input.c buf.o: buf.cc buf.hh defs.hh g++ -c buf.c clean: rm edit $(OBJECTS) core Overr ide beim Aufr uf: make LIBS="-lX11R6" 2005 AG Rechner netze 3-make.7
-Aufruf Alternatives file make -f mymakefile Targ et make clean Variablen make LIBS="-lm -lx11" Unbeobachtetes Massen- make -k Testen make -n Parallelausführung make -j make -j3 2005 AG Rechner netze 3-make.8
: Details Syntax Kommentar : # Zeilenfor tsetzung: \<newline> Var iablen-definitionen: Zeilen mit [ˆ:\t] = xyz = x.cc y.cc z.cc OPTIONS = Default-Wer t für Var iablen: Leerstring := statt = kein Rescan bei Benutzung Rules: target [target...] : [:] [dependencies...] [ ;command] [TAB command]... Alle Targets hängen von allen Dependencies ab Shell-style Wildcards:? [ ] 2005 AG Rechner netze 3-make.9
: Details Syntax Target.DEFAULT gibt Default-Kommandofolge an für Targets ohne Regeln Phony Target : Target kein Filename.PHONY: clean clean: rm *.o temp core Kommandos Wichtig: Einrücken mit TAB Jedes Kommando wird mit /bin/sh -ce ausgeführ t Alter native: $(SHELL) Kommando-Echo abschalten: @ @echo Making object files... 2005 AG Rechner netze 3-make.10
: Details Fehler (Exit-Code 0) Stop Fehler ignorieren: clean: -rm *.o core Abbruch (Ctrl-C): aktuelles Target wird gelöscht Rekursives make: SUBDIRS= src lib doc test all: @for i in $(SUBDIRS); do \ echo Making in $$i...; \ (cd $$i && $(MAKE) $(MAKEFLAGS); \ done Implizite Regeln Schreibarbeit sparen eingebaut oder benutzerdefinier t 2005 AG Rechner netze 3-make.11
: Details Implizite Regel zum Übersetzen von.cc-files: file.o wird aus file.cc generier t Aufr uf von g++ file.cc ist Dependency für file.o Ermöglicht kürzeres file: OBJECTS= main.o input.o buf.o LIBS= -lx11 edit: $(OBJECTS) g++ -o edit $(OBJECTS) $(LIBS) main.o: defs.hh buf.hh input.o: defs.hh buf.o: buf.hh defs.hh Alter native Schreibweise: $(OBJECTS): defs.hh main.o buf.o: buf.hh 2005 AG Rechner netze 3-make.12
: Details Pattern Rules Eingebaute Regel für file.cc file.o %.o: %.cc $(CXX) $(CXXFLAGS) -c $< -o $@ CXX= g++ CXXFLAGS= Automatische Var iablen in impliziten Regeln: $@= herzustellendes Target $<=Dependency $?= Dependencies jünger als Target $ˆ = alle Dependencies $*= Filenamen-Präfix (dir/file) Overr ide: make CXX=CC CXXFLAGS=-O 2005 AG Rechner netze 3-make.13
: Implizite Regeln Selbstdefinier te Patter n-rules: GROFF= FOL= groff -t -mde /home/net/fol/folx PS/%.ps: %.tr $(FOL) < $< $(GROFF) -mgfol - > $@.new mv $@.new $@ Te xtfunktionen $(subst.c,.o,$(wildcard *.c)) $(sort $(wildcard PS/*.ps)) $(word 3, main.c buf.c kbd.c) subdirs= src lib doc allfiles= $(foreach dir,$(subdirs),\ $(wildcard $(dir)/*)) contents= $(shell cat file) 2005 AG Rechner netze 3-make.14
: Implizite Regeln Bedingte Ausführung ifeq ($(CXX),g++) LIBS= $(libs_for_g++) else LIBS= $(normal_libs) endif... prog: $(OBJECTS) $(CXX) -o $@ $(OBJECTS) $(LIBS) Substitution references ofiles= main.o kbd.o buf.o cfiles= $(ofiles:%.o=%.cc) 2005 AG Rechner netze 3-make.15