UNIX
Då man vill kompilera ett program som består av flera filer eller som kräver ett flertal kompileringsdirektiv kan det vara bra att använda kommandot make. Till kommandot make hör en kommandofil Makefile som kan innehålla varibeldefinitioner, information om beroenden mellan källkodsfiler och hur dessa filer skall kompileras.
Nedan är ett exempel på en enkel Makefile:# Kommenterad rad börjas med ett #-tecken program: main.o fil1.o fil2.o cc -o progam main.o fil1.o fil2.o main.o: main.c header.h cc -c main.c fil1.o: fil1.c header.h cc -c fil1.c fil2.o: fil2.c header.h cc -c fil2.c
Raden program: main.o fil1.o fil2.o definerar att den exekverbara filen program beror på objektfilerna main.o, fil1.o och fil2.o. Om någon av objektfilerna är yngre än den exekverbara filen så måste en ny exekverbar fil skapas. Denna nya fil skapas med hjälp av den nästkommande raden cc -o program main.o fil1.o fil2.o. Denna rad fungerar på samma sätt som ett vanligt UNIX kommando - även eventuella kommentarer kommer med. Observera ett denna rad måste börja med ett tabulatortecken för att fungera korrekt. På de efterföljande raderna följer fler beroenden och åtgärder om beroendena inte skulle vara uppfyllda.
Om alla filer (Makefile, main.c, fil1.c, fil2.c och header.h) finns i samma katalog, och dessa är yngre än alla eventuella objektfiler, kommer följande kommandosekvens att utföras då man kör make:
cc -c main.c cc -c fil1.c cc -c fil2.c cc -o progam main.o fil1.o fil2.o
varvid programmet program kommer att skapas.
Skulle exempelvis fil1.o och fil2.o vara av samma ålder som sina källkodsfiler och main.c är yngre än sin objektfil kommer endast följande kommandosekvens att utföras då man kör make:
cc -c main.c cc -o progam main.o fil1.o fil2.o
Detta gör att programmet program görs om i en ny version.
Nedan följer ett större exempel på en Makefile som innehåller bl.a. variabeldeklarationer och olika direktiv:
EXEFILE = program # Definitioner av CFILES = main.c fil1.c fil2.c # filer som ingår HFILES = header.h # i programmet. OFILES = main.o fil1.o fil2.o # CC = cc # Definition av kompilator - en mängd # olika kompilatorer för en mängd olika # språk kan användas. CCFLAGS = -O # Definition av kompilerings flaggor prog: $(OFILES) $(CC) $CCFLAGS) -o $(EXEFILE) $(OFILES) main.o: main.c header.h fil1.o: fil1.c header.h fil2.o: fil2.c header.h clean: rm $(OFILES) $(EXEFILE) printfiles: $(HFILES) $(CFILES) print $? touch printfiles
Med denna Makefile kan följande kommandon ges:
make clean - tar bort alla objektfiler samt den exekverbara filen program.
make printfiles - Skriver ut de filer printfiles beror på som ändrats sedan senaste utskriften.
make CCFLAGS=-g - byter kompileringsdirektiv till avlusning (det tidigare var i det här fallet optimering) och kompilerar med detta.
Observera att blanktecken inte skall användas i början av rader som anger kommandon. Dessa rader skall startas med tabulatortecken för att fungera korrekt.
Då långa rader sträcker sig över mer än en rad måste varje rad avslutas med ett \-tecken, annars kommer make att behandla varje rad för sig.
Författat av Arnold Johansson