lukasz.proszek.info

Powrót do listy plików

Makefile

# Ten Makefile jest uniwersalny, kompiluje programy nie majac w sobie zapisanej
# ich nazwy.
# Funkcje:
# $(shell polecenie) powoduje wykonanie polecenia i wpisanie jego wyjscia w
#              w miejsce wywolania tej funkcji
# $(subst co, na-co, gdzie) zamienia wystapienia napisu "co" na napis "na-co"
#              w tekscie "gdzie"
# $(filter-out slowa, skad) usuwa wystapienia slow wystapujacych na liscie
#              "slowa" z tekstu "skad"
# $(wildcard wzorzec) wartoscia funkcji jest lista plikow pasujaca do wzorca.
#
# Pomysl polega na tym, aby polecic kompilatorowi odnalezienie zaleznosci
# plikow zrodlowych od plikow naglowkowych.  Wykonuje to polecenie
# gc -MM nazwa_pliku.c.  Z tych zaleznosci tworzone sa submakefiles (*.d) dla 
# kazdego pliku zrodlowego.  Owe submakefiles sa dolaczane na koncu tego
# pliku (dyrektywa include).
#
# Przed poleceniem mozemy postawic @ i wtedy to polecenie nie bedzie wypisywane
# na konsole, przed wykonaniem (inne sa wypisywane).  Podobnie, mozemy umiescic
# przed poleceniem minus i wtedy ewentualne bledy spowodowane przez to 
# polecenie beda ignorowane (normalnie, status powrotu programu rozny od
# zera powoduje przerwanie dzialania make).
#
# Zmienne,a na ktore podstawiamy za pomoca := sa zmiennymi gorliwymi, tzn.
# od razu wyliczaja swoja wartosc.  Podstawienie poprzez = daje nam zmienna
# leniwa, ktora w miejscu gdzie zostanie wykorzystana wstawi swa definicje
# zywcem.

CC          := gcc
CFLAGS      := -Wall  -c -w -O2 -std=gnu99
LDFLAGS     := -Wall  -lm -w -O2 -std=gnu99
SOURCES     := $(wildcard *.c)
        # pliki zrodlowe
MAINOBJECTS := $(subst .c,.o,$(shell grep -l main $(SOURCES)))
        # pliki obiektowe, ktore zawieraja definicje funkcji main
ALL         := $(subst .o,,$(MAINOBJECTS))
        # pliki wykonywalne (powstaja ze zrodel zawierajacych definicje main)
DEPENDS     := $(subst .c,.d,$(SOURCES))
        # makefefiles dla kazdego z plikow zrodlowych
ALLOBJECTS  := $(subst .c,.o,$(SOURCES))
        # wszystkie pliki obiektowe
OBJECTS        := $(filter-out $(MAINOBJECTS),$(ALLOBJECTS)) 
        # pliki obiektowe, ktore nie zawieraja definicji main

all: $(DEPENDS) $(ALL)

$(DEPENDS) : %.d : %.c                          # tworzenie submakefiles
        $(CC) -MM $< > $@                     #         - zaleznosc
        @echo -e "\t"$(CC) $(CFLAGS) $< >> $@        # - polecenie kompilacji

$(ALL) : % : %.o $(OBJECTS)                 # konsolidacja
        $(CC) $(LDFLAGS) -o $@ $^           

-include $(DEPENDS)                         # dolaczenie submakefiles

clean:
        -rm -f *.o $(ALL) $(ALLOBJECTS) $(DEPENDS)


syntax highlighted by Code2HTML, v. 0.9.1
kod przerobiony z HTML na XHTML za pomocą HTML Tidy for Linux/x86