Makefiles

=Makefiles=

En makefile er et script der gør det lettere og mere overskueligt at kompilere dine source filer, i tilfælde af at du har flere source filer, men kun har ændret i 2 af dem ville du med en makefile kunne kompilerer dem som du har redigeret i, eller hvis der nu mangler en kompilet fil finder den denne i mappen og kompilere den.

__eksempel på en makefile__

code format="c"
 * 1) Author : Søren Andersen
 * 2) Date   : 26/08/2010
 * 3) Ver    : beta 1.0

SOURCE=hello.cpp                   # her er dine source filer listet OBJECT=${SOURCE:.cpp = .o}         # tager den dine SOURCE filer og laver dem til .o istedet for .cpp EXEC=host                          # navnet på den executable fil vil nu hedde host TARGETS=build clean help           # definere de funktioner du har givet makefilen CC=g++                             # en variable til at specificere compiler i der her tilfælde g++ (host)

build: ${OBJECT}                   # her compiles dine .o filer ${CC} -o ${EXEC} ${OBJECT}

hello.o: hello.cpp                 # tjekker om den nuværende version af hello filen er den nyeste version ${CC} -c hello.cpp             # og kompilere din source fil

clean: @rm ${EXEC} ${OBJECT}          # denne funktion fjerner din compilede executable fil

help: @echo ${TARGETS}               # denne funktion udskriver dine ekstra funktioner som din makefile har. code


 * GULDKORN** : Hvis du som her putter @ foran de funktioner du bruger udskriver makefilen ikke en masse tekst når du kører den.

Som i kan se oven over bliver kompilering meget automatiseret efter at man har lavet en sådan makefile, men hvordan bruger man dem så - Se næste emne der vil blive refereret til den ovenstående makefile.

Brug din makefile på host
Efter du har gemt din makefile i samme directory som dit code projekt kan du gøre følgende.

1. Kompilere dit projekt. code format="scheme" stud@ubuntu:~/iha/3.sem/mup1$ make code dette vil kompilere dit projekt vha. din makefile.

2. Bruge dine indbyggede makefile funktioner. code format="scheme" stud@ubuntu:~/iha/3.sem/mup1$ make clean stud@ubuntu:~/iha/3.sem/mup1$ make help code make clean vil slette dine allerede kompilerede filer make help vil vise dig de funktioner du har indbygget i din makefile

Brug din makefile på target
Da det er træls hvis du skal rette i den samme makefile hvergang du skal kompilere dit projekt til target laver vi en kopi af din makefile og kalder den makefile.target, efter dette af gjort åbner du den op og ændre kompileren fra g++ til arm-none-linux-gnueabi-g++ da dette er den kompiler der understøtter vores arm processor på devkittet.

__eksempel på makefile til target__ code format="c"
 * 1) Author : Søren Andersen
 * 2) Date   : 26/08/2010
 * 3) Ver    : beta 1.0

SOURCE=hello.cpp OBJECT=${SOURCE:.cpp = .o} EXEC=host TARGETS=build clean help CC=arm-none-linux-gnueabi-g++   # Som du kan se er det nu en anden kompiler nemlig den til target

build: ${OBJECT} ${CC} -o ${EXEC} ${OBJECT}

hello.o: hello.cpp ${CC} -c hello.cpp

clean: @rm ${EXEC} ${OBJECT}

help: @echo ${TARGETS} code

Når din makefile.target så er gemt er der en speciel måde at bruge denne på så du ikke bruger din standard makefile. for at kompilere skal du gøre nedenstående. code format="scheme" stud@ubuntu:~/iha/3.sem/mup1$ make -f makefile.target code Som du sikkert kan se er proceduren lidt anderledes end det vi gjorde før for at kompilere til host, vi bruger -f fordi hvis du bare skriver make, vil den automatisk tage den der hedder makefile, da det er standard.På den her måde kan vi få den til at vælge en anden, som vi så selv specificere bagefter i dette tilfælde makefile.target.

Det nemmeste ville være at lave en makefile der samtidig placere den executable fil i en anden mappe, så den ikke overskriver den gamle du har til host, eller måske placere dem i hver sin mappe, det vil vi kigge på herunder.

kompiler til andet directory
Som i sikkert har opdaget i ovenstående makefile er der en variable der hedder EXEC, denne variable har jeg brugt for at give den executable fil et passende navn, men den kan også bruges til at få din makefile til at placere din executable fil i en anden mappe det kommer til at se ud som herunder.

code format="c" EXEC=~/iha/3.sem/mup1/targetExE/target code

Du er nød til at skrive hele stien fra roden ellers kan den ikke finde ud af det.

=Makefile advanced=

Nu tænker man så kan det laves bedre og ja det kan det, men grundet at det er til den ikke øvede læser er de ovenstånde eksempler holdt lidt simple, herunder kan du se en bedre og mere automatiseret makefile men hvordan den virker er op til dig at regne ud ;-)

__Advanced eksempel__

code format="c"
 * 1) Author : Søren Andersen
 * 2) Date   : 02/02/2011
 * 3) Ver    : beta 2.0

OBJECTS := $(patsubst %.cpp,%.o,$(wildcard *.cpp)) FLAGS = -o CC = g++ BUILD = $(CC)$(FLAGS)-c

all: hello

hello:$(OBJECTS)

$(CC)$(FLAGS) hello $(OBJECTS)

%.o: %.cpp $(BUILD)$(FLAGS) $@ $<

code