GNU Make – pierwsze kroki
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:
- 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.
- Target program.o – Plik program.o powstaje z pliku program.cpp z dołączonym lib.h.
- 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.

Dzięki, dokładnie tego szukałam