Make Flashcards
Wie sieht das minimale Gerüst für ein Makefile aus?
prog: main.o foo.o bar.o
gcc -o prog main.o foo.o bar.o
main.o: main.c
gcc -c main.c
foo.o: foo.c
gcc -c foo.c
bar.o: bar.c
gcc -c bar.c
Was macht der -c Befehl in Make?
Es wird nur kompiliert und nicht gelinkt
Was macht der -o Befehl in Make?
Linked die Compiled Sources zu einem Programm
Was ist ein Target?
Ein Makefile ist dazu da, dem Programm make mitzuteilen, was es tun soll (dies ist das “target”)
Was ist eine Regel?
wie es es tun soll (dies ist die zum target gehörige “Regel”)
Was wird zu Beginn eines Makefiles oft als Target definiert und warum?
all
Aufruf von make ohne Parameter baut alle abhängigen Targets von all
Was wird zu Beginn eines Makefiles oft als Target definiert und warum?
all
Aufruf von make ohne Parameter baut alle abhängigen Targets von all
Wie werden Pattern in Regeln verwendet?
Viele Abhängigkeiten -> unpraktikabel für jede Datei Regel einzubauen.
$< die erste Abhängigkeit
$@ Name des targets
$+ eine Liste aller Abhängigkeiten
$^ eine Liste aller Abhängigkeiten, wobei allerdings doppelt vorkommende Abhängigkeiten eliminiert wurden.
Welche Variablen in Makefiles gibt es?
CC Der Compiler
CFLAGS Compiler-Optionen
LDFLAGS Linker-Optionen
Auf den Inhalt dieser Variablen greift man dann mit $(CC), $(CFLAGS) bzw. $(LDFLAGS) zurück.
Was sind Phony targets?
Make erzeugt nur Dateien neu wenn Abhängigkeiten sich ändern > nicht immer erwünscht(z.B Target clean)
Falls sie immer neu erzeugt werden sollen: Phony
OBJ = datei1.o datei2.o datei3.o datei4.o datei5.o BIN = prog
.PHONY: clean
clean:
rm -rf $(BIN) $(OBJ)
Wie werden Abhängigkeiten in Make praktischer definiert?
ohne die Abhängigkeiten jeder Objekt-Datei händisch ins Makefile einbauen zu müssen, definiert man meist ein target namens “dep” für “dependencies”:
SRC = datei1.c datei2.c datei3.c datei4.c datei5.c CC = /usr/bin/gcc DEPENDFILE = .depend
dep: $(SRC)
$(CC) -MM $(SRC) > $(DEPENDFILE)
-include $(DEPENDFILE)
Die Option -MM lässt den Präcompiler Abhängigkeiten auflösen die in Datei .depend umgeschrieben werden.
Wie werden Abhängigkeiten in Make praktischer definiert?
ohne die Abhängigkeiten jeder Objekt-Datei händisch ins Makefile einbauen zu müssen, definiert man meist ein target namens “dep” für “dependencies”:
SRC = datei1.c datei2.c datei3.c datei4.c datei5.c CC = /usr/bin/gcc DEPENDFILE = .depend
dep: $(SRC)
$(CC) -MM $(SRC) > $(DEPENDFILE)
-include $(DEPENDFILE)
Die Option -MM lässt den Präcompiler Abhängigkeiten auflösen die in Datei .depend umgeschrieben werden.
Wie wird in Make recursiv gebautP
Makefile im Top-Level-Verzeichnis
DIRS = dir1 dir2 dir3
compile:
for i in $(DIRS); do make -c $$i; done
Makefile.rules im Top-Level-Verzeichnis
CC = /usr/bin/gcc CFLAGS = -Wall -g
%.o:%.c
$(CC) $(CFLAGS) -c $<
Wichtig hierbei: make -c führt make erst aus wenn cd ausgeführt wurde. Danach wird das Makefile im Untervz verwendet(all Befehl)
# Makefile in einem Unterverzeichnis include ../Makefile.rules
OBJ = datei1.o datei2.o datei3.o datei4.o datei5.o
all: $(OBJ)