5.10. Brug af oversættelsesfiler ("makefiles")

Næste eksempel er to filer hvor den ene kalder funktioner i den anden. I eksemplet der er skrevet i C, er det igen det største af to tal der skal findes og skrives ud.

Følgende fil kan gemmes som ceks2.c.


#include <stdio.h>
#include <math.h>

float v1,v2,retval;

float max(float,float);

int main(void)
{
  v1=sin(2.34);
  v2=tan(4.4);

  retval=max(v1,v2);

  printf("Af %f og %f er %f stoerst\n",v1,v2,retval);
  return 0;
}

Følgende fil kan gemmes som cfkt.c.


float max(float f1,float f2)
{
  float f3;

  if (f1>f2)
    f3=f1;
  else
    f3=f2;

  return f3;
}

hven% gcc -o ceks2 ceks2.c cfkt.c -lm

En langt mere elegant metode er at lave en oversættelsesfil. Herefter skrives blot make, og C-oversætteren vil kun oversætte de filer der er nyere end de oversatte filer. Oversættelsesfiler kan også bruges til at styre oversættelse af andet end regulære programmer. For eksempel LaTeX-kode. En oversættelsesfil (med navnet Makefile) kunne være følgende.


# Makefile til GNU C-oversætteren - dette er en kommentar
# I dette eksempel oversættes to filer.
# ceks2.c og cfkt.c oversættes til den kørbare fil ceks2

# Kommandoen til at oversætte C-programmer er "gcc":
CC = gcc

# Navn paa koerbar fil
OUTPUT   = ceks2

# Kildefilnavne, bemærk der er ingen mellemrum efter \ tegnet.
sources  = ceks2.c \
           cfkt.c

# Automatisk navngivning af objektfiler hvor .c laves om til .o
OBJS        = $(sources:.c=.o)

# Oring niveau 2
CFLAGS      = -O2

#Linkerflag: Inkluderer matematik-bibliotek
LDFLAGS      = -lm

# Foelgende linje tjekker om en .o fil er nyere end den koerbare fil. Hvis
# dette er tilfaeldet, linkes disse. Dvs. kun nye elementer oversættes.
$(OUTPUT): $(OBJS)
        $(CC) $(CFLAGS) -o $(OUTPUT) $(OBJS) $(LDFLAGS)

Bemærk at indrykninger i oversættelsesfiler skal være tabulatortegn! Det fungerer ikke med mellemrum.

Oversættelsesfilen består af en masse definitioner af variable og en eller flere opskrifter. Opskriften fortæller at $(OUTPUT) (ceks2) afhænger af objektkodefilerne $(OBJS) (ceks2.o og cfkt.o), og at ceks2-programmet kan laves med opskriften gcc -O2 -o ceks2 ceks2.o cfkt.o -lm. Make-programmet gætter selv hvordan .c-filer skal oversættes for at danne objektfiler .o.

Når oversættelsesfilen er skrevet, kan programmet bare oversættes ved at skrive


hven% make
i det katalog hvor oversættelsesfilen findes. En oversættelsesfil kan være meget lang og indeholde mange opskrifter der indbyrdes kan afhænge af hinanden. Make-programmet undersøger datoen på alle filer, og hvis datoen på kildeteksten er nyere end datoen på den tilsvarende objektfil, så er objektfilen forældet, og make oversætter automatisk kildeteksten igen og samler programmet med den nye objektfil.