Překlad se závislostmi (make a soubor Makefile): Porovnání verzí

Z Milan Kerslager
Přejít na: navigace, hledání
(Založení článku)
 
(Doplnění)
Řádka 1: Řádka 1:
 
'''Překlad se závislostmi''' využívá schopnosti příkazu make, která umožňuje porovnávat časy poslední modifikace souborů a na základě toho rozhodnout, zda budou provedeny výkonné řádky příslušného pravidla. Z tohoto důvodu se do pravidla za dvojtečku zapisuje seznam souborů, na kterých vykonání pravidla závisí. Překlad se závislostmi se používá zejména u větších projektů, které je vhodné překládat po menších částech (do tak zvaného ''object kódu''). Při překladu je pak pomocí závislostí přeložena jen ta část, která se změnila a ostatní části jsou použity z minulého překladu.
 
'''Překlad se závislostmi''' využívá schopnosti příkazu make, která umožňuje porovnávat časy poslední modifikace souborů a na základě toho rozhodnout, zda budou provedeny výkonné řádky příslušného pravidla. Z tohoto důvodu se do pravidla za dvojtečku zapisuje seznam souborů, na kterých vykonání pravidla závisí. Překlad se závislostmi se používá zejména u větších projektů, které je vhodné překládat po menších částech (do tak zvaného ''object kódu''). Při překladu je pak pomocí závislostí přeložena jen ta část, která se změnila a ostatní části jsou použity z minulého překladu.
  
 +
== Příklad ==
 
Mějme větší projekt, který se skládá ze tří souborů: <code>ahoj.c</code> (hlavní program), <code>funkce.c</code> (soubor s funkcemi používanými hlavním programem) a <code>funkce.h</code> (prototypy funkcí ve formě hlavičkového souboru):
 
Mějme větší projekt, který se skládá ze tří souborů: <code>ahoj.c</code> (hlavní program), <code>funkce.c</code> (soubor s funkcemi používanými hlavním programem) a <code>funkce.h</code> (prototypy funkcí ve formě hlavičkového souboru):
  
Řádka 33: Řádka 34:
  
 
=== Makefile ===
 
=== Makefile ===
Soubor Makefile, který bude na základě nadefinovaných závislostí schopen přeložit následující program:
+
Následující soubor Makefile bude na základě nadefinovaných závislostí schopen přeložit výše uvedené programy po jednotlivých částech tak, že z nich nejprve vytvoří polotovary (object kód, tj. soubory s příponou <code>.o</code>). Výsledné polotovary jsou na závěr spojeny dohromady a je vytvořen výsledný spustitelný soubor <code>ahoj</code>.
  
  ARGS = -Wall
+
První pravidlo ''all'' je implicitní a definuje přeložení celého projektu. Jako závislost má definován cíl (soubor) <code>ahoj</code>. Druhé pravidlo (''ahoj'') předepisuje závislost na souborech <code>ahoj.o</code> a <code>funkce.o</code>, ze kterých je následujícím výkonným řádkem vyroben spustitelný soubor. Výkonný řádek bude spuštěn jen v případě, že některý z těchto souborů nebude existovat nebo když bude některý z nich novější, než cílový spustitelný soubor <code>ahoj</code>. Třetí pravidlo <code>ahoj.o</code> definuje výkonný řádek, který bude proveden v závislosti na stavu souborů <code>ahoj.c</code> a <code>funkce.h</code>. Čtvrté pravidlo <code>funkce.o</code> definuje postup pro vytvoření stejnojmenného souboru v závislosti na stavu souboru <code>funkce.c</code>:
 +
 
 +
CC      = gcc
 +
  ARGS   = -Wall
 
   
 
   
 
  all: ahoj
 
  all: ahoj
 
   
 
   
 
  ahoj: ahoj.o funkce.o
 
  ahoj: ahoj.o funkce.o
  gcc $(ARGS) ahoj.o funkce.o -o ahoj
+
  $(CC) $(ARGS) ahoj.o funkce.o -o ahoj
 
   
 
   
 
  ahoj.o: ahoj.c funkce.h
 
  ahoj.o: ahoj.c funkce.h
  gcc $(ARGS) -c ahoj.c
+
  $(CC) $(ARGS) -c ahoj.c
 
   
 
   
 
  funkce.o: funkce.c
 
  funkce.o: funkce.c
  gcc $(ARGS) -c funkce.c
+
  $(CC) $(ARGS) -c funkce.c
 
   
 
   
 
  clean:
 
  clean:
 
  rm -fv *.o ahoj
 
  rm -fv *.o ahoj
 +
 +
Napíšeme-li ''make'' bude projekt podle splnění závislostí přeložen.

Verze z 20. 4. 2010, 11:25

Překlad se závislostmi využívá schopnosti příkazu make, která umožňuje porovnávat časy poslední modifikace souborů a na základě toho rozhodnout, zda budou provedeny výkonné řádky příslušného pravidla. Z tohoto důvodu se do pravidla za dvojtečku zapisuje seznam souborů, na kterých vykonání pravidla závisí. Překlad se závislostmi se používá zejména u větších projektů, které je vhodné překládat po menších částech (do tak zvaného object kódu). Při překladu je pak pomocí závislostí přeložena jen ta část, která se změnila a ostatní části jsou použity z minulého překladu.

Příklad

Mějme větší projekt, který se skládá ze tří souborů: ahoj.c (hlavní program), funkce.c (soubor s funkcemi používanými hlavním programem) a funkce.h (prototypy funkcí ve formě hlavičkového souboru):

Soubor ahoj.c obsahuje direktivu preprocesoru pro vložení hlavičkového souboru funkce.h, protože obsahuje prototyp funkce tiskni(), která je v kódu použita:

#include "funkce.h"

int main()
{
  tiskni();
  return 0;
}

Soubor funkce.c obsahuje výkonný kód funkcí, které používáme v hlavním programu. Je v něm realizována funkce tiskni(). V rámci souboru je nutné volat pomocí direktivy preprocesoru vložení hlavičkového souboru stdio.h, protože obsahuje prototyp funkce printf(), která je ve funkci tiskni() používána:

#include <stdio.h>

void tiskni()
{
  printf("Ahoj!\n");
}

Hlavičkový soubor funkce.h obsahuje prototypy funkcí, které jsou umístěny v souboru tiskni.c:

void tiskni()

Makefile

Následující soubor Makefile bude na základě nadefinovaných závislostí schopen přeložit výše uvedené programy po jednotlivých částech tak, že z nich nejprve vytvoří polotovary (object kód, tj. soubory s příponou .o). Výsledné polotovary jsou na závěr spojeny dohromady a je vytvořen výsledný spustitelný soubor ahoj.

První pravidlo all je implicitní a definuje přeložení celého projektu. Jako závislost má definován cíl (soubor) ahoj. Druhé pravidlo (ahoj) předepisuje závislost na souborech ahoj.o a funkce.o, ze kterých je následujícím výkonným řádkem vyroben spustitelný soubor. Výkonný řádek bude spuštěn jen v případě, že některý z těchto souborů nebude existovat nebo když bude některý z nich novější, než cílový spustitelný soubor ahoj. Třetí pravidlo ahoj.o definuje výkonný řádek, který bude proveden v závislosti na stavu souborů ahoj.c a funkce.h. Čtvrté pravidlo funkce.o definuje postup pro vytvoření stejnojmenného souboru v závislosti na stavu souboru funkce.c:

CC      = gcc
ARGS    = -Wall

all: ahoj

ahoj: ahoj.o funkce.o
	$(CC) $(ARGS) ahoj.o funkce.o -o ahoj

ahoj.o: ahoj.c funkce.h
	$(CC) $(ARGS) -c ahoj.c

funkce.o: funkce.c
	$(CC) $(ARGS) -c funkce.c

clean:
	rm -fv *.o ahoj

Napíšeme-li make bude projekt podle splnění závislostí přeložen.