17 stycznia 2011 ~ 1 Komentarz

GNU Make – pierwsze kroki

{lang: 'pl'}

Make jest powszechnie używanym programem służącym do automatyzacji kompilacji programów pisanych w języku C++. Świetnie sprawdza się zarówno jako narzędzie konsolowe jak i komponent używany w IDE takich jak Eclipse czy Borland. Istnieje wiele odmian programu make działających na różnych platformach. Przykłady zamieszone w tym wpisie zostały przetestowane na najbardziej popularnej wersji w systemie Linux – GNU Make.

Po co to komu?

Istotą programu make jest możliwość określenia zależności między wieloma plikami źródłowymi. Dzięki temu kompilacja każdego, nawet ogromnego, programu ogranicza się do otwarcia terminala, wejścia do katalogu projektu i wpisania następującej komendy :)

make

Wpisanie tej samej komendy drugi raz powoduje natychmiastowe zakończenie działania, ponieważ program make wie, że nie ma nic do zrobienia.

Wpisanie tej samej komendy po zmianie w plikach źródłowych powoduje rekompilację jedynie tych plików, które się zmieniły, lub których zależności się zmieniły.

Prosty przykład

Mamy program składający się z dwóch plików źródłowych program.cpp, lib.cpp i jednego nagłówkowego lib.h. Plik lib.h jest dołączany do obu plików źródłowych. Ręczna kompilacja i konsolidacja tego programu wygląda tak:

g++ -c -o lib.o lib.cpp            # kompilacja lib.cpp
g++ -c -o program.o program.cpp    # kompilacja program.cpp
g++ -o program program.o lib.o     # konsolidacja

W wyniku kompilacji otrzymujemy wykonywalny plik o nazwie program. Aby zautomatyzować kompilację programu należy utworzyć plik o nazwie Makefile i wpisać do niego następującą zawartość:

program: program.o lib.o
	g++ -o program program.o lib.o

program.o: program.cpp lib.h
	g++ -c -o program.o program.cpp

lib.o: lib.cpp lib.h
	g++ -c -o lib.o lib.cpp

W pliku znajdują się 3 reguły:

  1. Target program – reguła dotyczy konsolidacji. Plikiem wynikowym tej reguły jest plik wykonywalny. Do utworzenia tego pliku kompilator potrzebuje plików program.o i lib.o.
  2. Target program.o – Plik program.o powstaje z pliku program.cpp z dołączonym lib.h.
  3. Target lib.o – Powstaje z pliku lib.cpp z dołączonym lib.h.

Trochę teorii

W przytoczonym przykładzie można zauważyć następującą składnię pojedyńczej reguły:

plik-wynikowy(target): pliki-zależności
    wykonywane-instrukcje

Jeżeli czas modyfikacji chociaż jednego z plików zależności jest nowszy niż czas modyfikacji pliku wynikowego, to wykonywane są instrukcje.

Podczas tworzenia pliku Makefile bardzo ważne jest określenie wszystkich zależności. Ominięcie jednej może spowoduje linkowanie starych plików podczas rekompilacji.

Sprzątanie

W pliku Makefile istnieje możliwość tworzenia targetów, które nie są nazwami plików wynikowych, a jedynie nazwami akcji do wykonania. Najpopularniejszą z takich akcji jest clean, którego zadaniem jest usunięcie wszystkich kompilatów pośrednich.

Realizuje się to poprzez wpisanie w pliku Makefile następującej reguły:

.PHONY: clean
clean:
	rm -f *.o

a następnie wpisywanie w terminalu komendy:

make clean

Wiele kompilatów

Dosyć często spotykamy się z sytuacją, gdzie w jednym projekcie występuje kilka plików wykonywalnych. Aby zbudować kilka binarek za pomocą jednego pliku Makefile należy zdefiniować target all i uzależnić go od wszystkich plików wykonywalnych.

all: program1 program2

po wpisaniu w terminal komendy:

make

zbudują się wszystkie pliki.

Literatura

Zainteresowanych zgłębianiem tematu szerzej niż przedstawione zostało w przewodniku odsyłam do manuala GNU Make.

Podobne wpisy

  • Nie znaleziono

Komentarze dla “GNU Make – pierwsze kroki”

  1. Sylwia 17 stycznia 2011 at 12:52 Permalink

    Dzięki, dokładnie tego szukałam :)


Dodaj komentarz