niedziela, 7 lutego 2010

Co nieco o make

Pamiętać należy, że pliki dla make, to nie skrypty wykonywane jak w interpreterze linia po linii. Polecenie make na podstawie pliku tworzy drzewo wykonania (a właściwie odwrócone drzewo).

make release WERR=0 -s
Build wynikowy (release), warningi traktowane jak błędy, cichy - wyświetlane tylko błędy, ostrzeżenia itp.

make release -k
Opcja -k (keep going) build nie zatrzymuje się przy błędach. Może być przydatne, gdy projekt jest duży, a błędy powstaję podczas budowania elementów (aplikacji, bibliotek), które niekoniecznie są nam potrzebne.

make clobber
Czyszczenie zupełne - wszystkie powstałe pliki

make clean
Czyszczenie normalne np. tylko pliki *.o


Dla make clean i clobber przydatne są "double-colon rules". np:
clean ::
@echo Usuwamy plik1
-rm plik1
clean ::
@echo Usuwamy plik2
-rm plik2
jak widać cel wraz z regułą występuje więcej niż raz. Dla zwykłych single-colon rules cel moze występować więcej niż raz, ale tylko raz z regułą. Takie reguły przydatne są np. w automatycznie generowanych plikach make lub np. przy dodawaniu do biblioteki kolejnych modułów, itp. (BTW znak '-' przed rm oznacza, że polecenie make nie zatrzyma się z powodu błędu polecenia rm np. plik nie istnieje - błąd zostanie zignorowany; natomiast znak '@' oznacza, że powłoka nie wyświetli polecenia echo - tylko jego wynik (jak zwykle)).


"Static pattern rules" - przydatne, gdy reguły do i zależności są analogiczne dla celów
targets : target-pattern : prereq-patterns
commands


Przypisanie w plikach make
'=' - recursive expansion - podstawianie za każdym razam, gdy nazwa się pojawia, np.:
CFLAGS = $(include_dirs) -O
include_dirs = -Ifoo -Ibar
tutaj kolejność nie gra roli.
Wadą jest właśnie każdorazowe podstawianie, np.
CFLAGS = $(CFLAGS) -O
powoduje powstanie nieskończonej rekurencji.
':=' - simply expanded variables - podstawianie tylko raz, podczas skanowania pliku, np.
x := foo
y := $(x) bar
x := later
daje w wyniku
y := foo bar
x := later


pliki .d - zależność od plików nagłówkowych, plików makefile i innych. Aby po zmianie któregokolwiek cel został przebudowany.
Pliki nagłówkowe dodawane są zwykle do plików .d automatycznie przez wywołanie preprocesora z opcją -M.


Sprawdzanie, czy zmienna została zdefiniowana
ifeq (,$(ZMIENNA))
...
endif


Co jeszcze warto znać:
include, call, eval


Linki odnośnie make
http://kooz.org/rkowen/howto/slides/make/slides/title.htmlhttp://make.paulandlesley.org/autodep.html

Brak komentarzy:

Prześlij komentarz