Překlad se závislostmi (make a soubor Makefile): Porovnání verzí
(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 === | ||
− | + | 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 | ||
− | + | $(CC) $(ARGS) ahoj.o funkce.o -o ahoj | |
ahoj.o: ahoj.c funkce.h | ahoj.o: ahoj.c funkce.h | ||
− | + | $(CC) $(ARGS) -c ahoj.c | |
funkce.o: funkce.c | funkce.o: 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.