# Makefile: Obsah nalezen porůznu na webu a upraven. (říjen 2010) # http://kvik.sh.cvut.cz/~fidlej/cecko/makefile/referat.html (Ivo Danihelka) # http://dce.felk.cvut.cz/por/cv1/#id2510407 # http://www-kiv.zcu.cz/~herout/html_sbo/make/toc.htm (Jan Valášek) # http://www.fit.vutbr.cz/~martinek/clang/make.html (David Martinek) #------------------------------------------------------------------------ # Datum: 10.11.2010 13:50 # Autor: Marek Nožka, nozka z@vináč spseol tečka cz # Úloha: Výklad ve výuce #------------------------------------------------------------------------ #cíl: [závislost] [závislost] #příkazy # pro každý radek se spouští nový shell #cd neco; ./neco # #Automatické proměnné #$@ jméno cíle #$< jméno první závislosti #$? jména závislostí, které jsou novější než cíl #$^ jména všech závislostí oddělená mezerami # # Příklad implicitního pravidla # %.o: %.c # $(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $< #------------------------------------------------------------------------ #Funkce pro zpracování textu # #Volají se podobně jako proměnné #$(funkce argumenty) # #$(subst from,to,text) substituce #$(patsubst pattern,replacement,text) # % v pattern představuje lib. posloupnost znaků # % v replacement odpovídá této množině # # př.: $(patsubst %.c,%.o,main.c bar.c) #$(var:pattern=replacement) # je ekvivalentní #$(patsubst pattern,replacement,$(var)) # př.: CLASSES = $(SOURCES:.java=.class) # #$(wildcard pattern) # názvy souborů odpovídají pattern, jako v shellu # př.: SOURCES = $(wildcard *.java) #------------------------------------------------------------------------ # Užitečné přepínače # #-f soubor # použije se `soubor` namísto Makefile #-n # nevykonává, jen vypisuje průběh #-p # současně vypíše kompletní nastavení proměnných, # implicitních pravidel, ... #------------------------------------------------------------------------ # ## překladač CC=gcc ## volby překladače CFLAGS=-std=c99 -Wall -pedantic -g -lm #CPPFLAGS= .PHONY: all build clean again autoexe autodep # všechna *.c zavisi na *.h #OBJ=soubor1.o soubor2.o souborN.o #HEAD=soubor1.h soubor2.h souborN.h #${OBJ}: ${HEAD} # hromadné nastavení závislostí, žádná akce # #$(program): $(program).c # $(CC) $(CFLAGS) -o $(program) $(program).c #hello:hello.c helo.h # gcc -Wall -o hello hello.c ############################################### #EXE= ## Vloží proměnnou EXE -include exe.list ############################################### build: $(EXE) again: clean build all: build clean: rm -f ./*.o ./*.c\~ rm -f $(EXE) ############################################### ## Generování proměnné EXE autoexe: @LIST="EXE=";\ for i in $$(ls *.c);do LIST="$$LIST $$(basename $$i .c)"; done;\ echo $$LIST | tee exe.list; ############################################### ## Generování závislostí autodep: $(CC) -MM *.c >dep.list ## vloží vygenerované závislosti -include dep.list ###############################################