Liten Datorhandbok För Målmedvetna

Academic Computer Club, Umeå Universitet, 2000


UNIX


Make

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.

Vanliga fel

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


Bakåt , Framåt , Upp, Huvudsida
Denna sida ändrades sist av handbok den 27/05 1996 11:12:41.
Last modified Friday, 24-May-1996 08:20:38 CEST