Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : Makefiles?



HeadShot
03-07-2002, 12:01
Hi!

Habe 3 Fragen zu Makefiles:

1. Was sind Makefiles?
2. Was machen Makefiles?
3. Wie macht man Makefiles?


mfg codi :)

Tobias
03-07-2002, 13:08
Hi

1.
Eine Datei, die normalerweise Makefile heisst und vom Programm
make verwendet wird

2.
Makefiles werden vom Programm make verwendet um Sourcen zu compilieren
und installieren.

3.
Mit einem Editor ( oder mit Autoconf )

make manual:
http://www.gnu.org/manual/make/html_chapter/make_toc.html

Autoconf:
http://www.gnu.org/software/autoconf/autoconf.html

HeadShot
03-07-2002, 15:15
Also aus autoconf werd ich nicht wirklich schlau, kannste mir das mal erklären?

Tobias
03-07-2002, 15:54
autoconf brauchst du eigentlich nur für grössere Projekte oder wenn du verschiedene
Plattformen unterstützen willst. Normalerweise würde ich das Makefile mit eine
Editor schreiben.

Wenn du schon ein mal ein Programm compiliert hast, hast du
wahrscheinlich
./configure
make
su
make install
verwendet.
Das ./configure ist von autoconf generiert und erzeugt mit der Vorlage
Makefile.in das Makefile. Dabei setzt es z.B die Pfade für die benötigten
Bibliotheken und die Compilerflags.

configure wird von autoconf aus configure.in erzeugt.
configure.in und Makefile.in kannst du mit eine Editor erstellen, eventwell
hilft dir autoscan, das die sourcen nach benötigten headerfiles
durchsucht.
autoconf im Verzeichnis mit den Sourcen, configure.in und Makefile.in aufrufen,
um configure zu erzeugen.

Mehr Infos in den manpages und unter
http://www.gnu.org/manual/autoconf/index.html

anda_skoa
03-07-2002, 17:08
Größere Projekte (wie ZB KDE) haben schon fertige Automake/Autoconf Frameworks, da muß man nur noch Dateien in die entprechenden Makefile.am Dateien eintragen, den Rest macht dann das Framework.

Aber ich denke es ist besser du beschäftigst dich zuerst mal mit händisch generierten Makefiles.

Ein Makefile ist im Grunde recht einfach aufgebaut:



target: dependecies
<tab>rule
<tab>rule


target ist der Name des Targets, also das, was hinter dem make Befehl angegeben wird, zb install oder clean.
Wird kein Target mein Makeaufruf angegeben, wird das oberste genommen.

Dei Dependencies sind die Sachen, von denen dieses Target abhängt.
Das wären bei einem Programm zB die Header einer anderen Datei.
Wenn sich eine Dependencydatei ändert, wir das Target neu erzeugt, d.h. die Rules werden ausgeführt.

Ciao,
_

HeadShot
03-07-2002, 17:23
Ok, soweit hab ichs verstanden.

Aber wie füg ich das jetzt zusammen?
Könnt ihr das mal an nem Beispiel mit diesen dateien zeigen?:
Source:
- CVideo.h
- CVideo.cpp
- Main.cpp
Includes:
- /usr/include
- /usr/local/include
Libs:
- /usr/local/lib
- /lib
Librarys:
- lSDL
- lSDL_image
- lGL

wäre nett, danke :)

anda_skoa
03-07-2002, 18:46
Ich nehme mal an, dass es C++ Dateien sind



CC=g++
CCFLAGS=-Wall
LDFLAGS=-L/usr/local/lib -L/lib -lSDL -lSDL_image -lGL
INCLUDES=-I/usr/local/include -I/usr/include

all: main.o cvideo.o
$(CC) $(CCFLAGS) $(LDFLAGS) main.o cvideo.o -o programmname

main.o: cvideo.h main.cpp
$(CC) $(CCFLAGS) $(INCLUDES) -c main.cpp -o main.o

cvideo.o: cvideo.h cvideo.cpp
$(CC) $(CCFLAGS) $(INCLUDES) -c cvideo.cpp -o cvideo.o

clean:
rm -f *~
rm -f *.o
rm -f programmname



Ciao,
_

Tobias
03-07-2002, 18:55
ups da war jemand schneller
--- Makefile ----------------------------------------

#Das ist ein Kommentar
#CXX ist eine Variable mit $(CXX) aufrufen
CXX=g++

#CVideo: ist eine rule ( wie heisst das auf deutsch?) ( erzeugt das Programm
#Der Name ( CVideo ) vor den Doppelpunkt gibt an wie die erzeugte Datei heisst
#Die erste Rule wird verwendet wenn make ohne Argumente aufgerufen wird.
#Nach dem : kommen die Dateien die für das erstellen der rule benötigt werden

# $(CXX) -lSDL ... Komandos zu erstellen der Datei
#Achtung: umbedingt mit [tab] einrücken, keine Lehrschläge
CVideo: CVideo.o Main.o
$(CXX) -lSDL -lSDL_image -lGL -L/usr/local/lib/ -I/usr/local/include -o CVideo Main.o CVideo.o

#die nächste rule
# -c um datei nicht zu verlinken ( siehe man gcc ),
#das wird in der rule CVideo gemacht
CVideo.o: CVideo.h CVideo.cpp
$(CXX) -c CVideo.cpp

Main.o: Main.cpp
$(CXX) -c Main.cpp

#mit make clean aufrufen, löscht alle compilirten Dateien
#z.B. nötig wenn das Makefile geändert wurde
clean:
rm -f *.o CVideo
-----------------------------------------------------
Im Verzeichnis make laufen lassen, ist alles. Änderungen an Dateien
Erkennt make automatisch un übersetzt die nötigen Dateien neu.
Du kannst auch einzelne dateien erzeugen: make Main.o

/usr/include/ & /lib sollten eigentlich standartmässig verwendet werden,
/usr/local/{include,lib} glaube ich nicht.

Happy compiling

HeadShot
03-07-2002, 20:07
Ahaaa!! Da ihr das so schön übersichtlich gemacht habe, hab ich alles verstanden.
Danke!

mfg headi

HeadShot
03-07-2002, 20:39
Hm ... klappt wohl doch nicht so ganz ... habe mirn makefile geschrieben, aber das gibt nen fehler aus ...:
"Makefile:10: *** Fehlendes Trennzeichen.. Schluss."


#Compiler
CC = g++
#librarys
LIBS = -L/usr/local/lib -Wl,-rpath,/usr/local/lib -lSDL -lSDL_image -lGL -lpthread
#cflags
CFLAGS = -I/usr/local/include -I/usr/local/include/SDL -D_REENTRANT


test.o: test.cpp CVideo.h
$(CC) $(CFLAGS) $(LIBS) -c test.cpp -o test.o

cvideo.o: CVideo.h CVideo.cpp
$(CC) $(CFLAGS) $(LIBS) -c CVideo.cpp -o cvideo.o

glengine: test.o cvideo.o
$(CC) $(CFLAGS) $(LIBS) test.o cvideo.o -o glEngine

clean:
rm -f *.o
rm -f glEngine


mfg headi ...

Tobias
03-07-2002, 20:58
Hast du mit Tabulator eingerückt? ( mit spaces geht nicht )

HeadShot
03-07-2002, 21:01
ja, hab mit tabs eingerückt.

Tobias
03-07-2002, 21:12
Ich habe keine Fehler, aber warscheinlich ersetzt dein Editor Tabs durch
Leerzeichen, da ich dann den gleichen Fehler kriege

HeadShot
03-07-2002, 21:22
Hm, hab das ding mit dem MidnightCommander geschrieben ....

Tobias
03-07-2002, 21:27
ju
mc ersetzt tabs
versuch mal nen anderen editor
bei mc sollte man es umschallten können bei mir hats aber nicht geklappt

Tobias
03-07-2002, 21:40
bei mc
F9
Menu Optionen
Allgemein
Dort
Halbe Tabs vortäuschen
und
Tabs mit Leerzeichen ausfüllen
abwählen

Einstellungen speichern

thats it

HeadShot
03-07-2002, 22:54
ok, hab das mit kwrite geändert, jetzt klappts auch mit den makefiles :)

danke!

anda_skoa
04-07-2002, 09:40
Vielleicht noch ein paar Amerkungen:

Du solltest das main target ganz oben schreiben, damit es ausgeführt wird, wenn make ohne Parameter aufgerufen wird.

$(LIBS) brauchst du nur mein Linken, wenn du mit -c nur compilierst, ist das nicht nötig.

Ciao,
_