Hallo Liste. http://gatos.sourceforge.net/ ist die Website von welcher ich hier in der Liste letzte Woche gelesen habe. Es ging darum AVI-Filme auf nem 266er Tillamook MMX zum Laufen zu kriegen. Danke erst mal von nem Außenstehenden für diesen Tip! Hab selber ein Inspiron 4100 mit ner ATI-Radeon. Hab XFree4.2.0 und sax2 4.3, welche die Radeon prima erkennen. Leider ruckeln die AVI-Filme b eim Abspielen, was eigentlich nichts mit der Größe des Bildausschnittes beim Abspielen zu tun haben dürfte. Nun habe ich mir von der erwähnten Website den "avview-Player" und das Paket "km" runtergeladen, welches die Kernelmodule für die jeweiligen Grafikkarten enthält. In der Installationsanleitung des Paketes steht nun allerdings das man das Makefile per Hand editieren muß. Es folgt hierzu auch gleich noch mal das Makefile im Ganzen: CFLAGS = -m486 -O2 -Wall -Wstrict-prototypes -pipe -fno-strict-aliasing -fno-common LDFLAGS = -s -N CC=gcc TOPDIR=/usr/src/linux KM_OBJS=km.o km_v4l.o km_memory.o radeon.o mach64.o rage128.o KM_API_OBJS=km_api.o all: km_drv.o km_api.o km.o: km.c $(CC) $(CFLAGS) -DMODULE -D__KERNEL__ -DLINUX -I/usr/src/linux/include -c km.c km_api.o: km_api.c $(CC) $(CFLAGS) -DMODULE -D__KERNEL__ -DEXPORT_SYMTAB -DLINUX -I/usr/src/linux/include -c km_api.c km_drv.o: $(KM_OBJS) ld -r $(KM_OBJS) -o km_drv.o km_v4l.o: km_v4l.c $(CC) $(CFLAGS) -DMODULE -D__KERNEL__ -DLINUX -I/usr/src/linux/include -c km_v4l.c km_memory.o: km_memory.c $(CC) $(CFLAGS) -DMODULE -D__KERNEL__ -DLINUX -I/usr/src/linux/include -c km_memory.c radeon.o: radeon.c $(CC) $(CFLAGS) -DMODULE -D__KERNEL__ -DLINUX -I/usr/src/linux/include -c radeon.c mach64.o: mach64.c $(CC) $(CFLAGS) -DMODULE -D__KERNEL__ -DLINUX -I/usr/src/linux/include -c mach64.c rage128.o: rage128.c $(CC) $(CFLAGS) -DMODULE -D__KERNEL__ -DLINUX -I/usr/src/linux/include -c rage128.c test: km_drv.o km_api.o sync insmod ./km_api.o insmod ./km_drv.o km_debug=0 install: mkdir -p /lib/modules/`uname -r`/misc/ install km_api.o /lib/modules/`uname -r`/misc/ install km_drv.o /lib/modules/`uname -r`/misc/ tarball: (cd .. ; tar cvf - km/*.[c,h] km/Makefile km/README | gzip - ) > km.tgz remove: rmmod km_drv rmmod km_api clean: rm -f *.o *.bck *.bak core Ich hab ja nun schon mal Pakete aus dem Sourcecode installiert und auch RPM-Pakte und einige andere Dinge. Aber davon wie man so ein Makefile per Hand editiert hab ich beim besten Willen keine Ahnung. Was bedeutet compile eigentlich? So, und nun steht da das man als nächstes avview Compilieren soll. In dessen Instalationsanleitung wiederum steht das man wie gewohnt einfach ./configure und danach ./make eingibt. Was mich ja nun wiederum bisschen stutzig macht weil ja das ./make install nich angenommen wird. Also, ich bin sozusagen bisschen ratlos. Gruß - Tom
* Thomas schrieb am 25.Mai.2002:
Ich hab ja nun schon mal Pakete aus dem Sourcecode installiert und auch RPM-Pakte und einige andere Dinge. Aber davon wie man so ein Makefile per Hand editiert hab ich beim besten Willen keine Ahnung.
Mit vi oder irgend einem anderen Editor. Wie auch sonst? Ist eine normale ASCII-Datei.
Was bedeutet compile eigentlich?
Übersetzen. Es wird etwa eine C-Quelldatei übersetzt in maschienenlesbaren Code.
So, und nun steht da das man als nächstes avview Compilieren soll. In dessen Instalationsanleitung wiederum steht das man wie gewohnt einfach ./configure und danach ./make eingibt. Was mich ja nun wiederum bisschen stutzig macht weil ja das ./make install nich angenommen wird.
./make ganz bestimmt nicht. In Deinem Sourceverzeichnis befindet sich doch nicht der Befehl make. Den gibt es in /usr/bin also /usr/bin/make oder ganz einfach make. ./make ist aber flasch. Bitte versteh erst mal wie Linux-Befehle funktionieren. Wenn Du etwa date sagst, dann wird /bin/date ausgeführt, und das aktuelle Datum angezeigt. Warum ist das so? Weil /bin im Pfad steht, es im Verzeichnis /bin eine ausführbare Datei namens date existiert und in allen Verzeichnissen, die vor /bin im Pfad stehen gibt es eine solche Datei nicht. Würdest Du etwa in /usr/local/bin ein Script names date einfügen, und ausführbar machen, so würde dieses Script ausgeführt sobald Du date sagst, da /usr/local/bin vor /bin im Pfad steht. Sagst Du hingegen /bin/date, so ist dies eine absolute Adressierung und es wird immer /bin/date ausgeführt, ganz gleich wie der Pfad aussieht. Ebenso verhält es sich, wenn Du Dich im Verzeichnis /bin befindest und dann ./date sagst. ./ ist nämlich eine relative Adressierung und besagt in diesem Verzeichnis, in dem Du Dich gerade befindest, egal wie es auch heißen mag. ../ heißt im übergeordneten Verzeichnis, egal in welchem man sich befinde. ./configure führt somit das Skript configure aus, das sich in dem Verzeichnis befindet, in dem man gerade ist, kein anderes. Ebenso würde ./make das Skript oder das Programm make ausführen, das sich in dem Verzeichnis befindet, in dem Du gerade bist. Nur normalerweise gibt es dort gar keine Datei make, und es kommt zu eine Fehlermeldung. Wenn Du aber make sagst, dann wird gar nicht im aktuellen Verzeichnis gesucht, sondern im Pfad. Dort wird das System bei /usr/bin fündig und es führt /usr/bin/make aus. Also make und nicht ./make hoffentlich hast Du auch verstanden, warum. ;) Es ist nämlich sehr wichtig, wenn Du Linux verstehen willst. Dann funktioniert auch make install, denn in Deinem Makefile gibt es ja install:
install: mkdir -p /lib/modules/`uname -r`/misc/ install km_api.o /lib/modules/`uname -r`/misc/ install km_drv.o /lib/modules/`uname -r`/misc/
install ist das Ziel, es ist von nichts abhängig, und wird deshalb immer ausgeführt. Das heißt, wenn Du make install sagst, dann werden die Zeilen darunter, die mit einem TAB beginnen ausgeführt. Im Konkreten Fall wäre das: mkdir -p /lib/modules/`uname -r`/misc/ install km_api.o /lib/modules/`uname -r`/misc/ install km_drv.o /lib/modules/`uname -r`/misc/ nun ja, die Arbeit mach der Befehl install, aber das ist dem make egal. Wenn Du nur make sagst, dann wird das erste Ziel aufgerufen. In diesem wie in fast allen anderen Fällen ist das all.
all: km_drv.o km_api.o
all ist von km_drv.o und von km_api.o abhängig. Das heißt, es muß km_drv.o und km_api.o erzeugt werden, falls es sie nicht gibt. Gibt es sie, so ist alles in Ordnung, make macht gar nichts, da es zu all ja keine Befehle gibt. Gibt es sie aber nicht, so werden sie zuerst erzeugt. Dafür gibt es andere Regeln. Für km_drv.o wäre das:
km_drv.o: $(KM_OBJS) ld -r $(KM_OBJS) -o km_drv.o
Hierbei ist km_drv.o das Ziel und das ist Abhängig von $(KM_OBJS). $(KM_OBJS) ist eine Variable, die ganz am Anfang definiert wurde: (Bei make muß, anders als in der Shell, eine Variable immer in (..) geschrieben werden.)
KM_OBJS=km.o km_v4l.o km_memory.o radeon.o mach64.o rage128.o
In der obigen Regel setzt make dann die Variable ein, das sähe denn so aus: km_drv.o: km.o km_v4l.o km_memory.o radeon.o mach64.o rage128.o ld -r km.o km_v4l.o km_memory.o radeon.o mach64.o rage128.o -o km_drv.o Diese Regel bedeutet nun, immer wenn km_drv.o nicht existiert, oder aber älter ist als km.o oder älter als km_v4l.o oder aber älter als km_memory.o usw. dann wird ld -r km.o ... -o km_drv.o ausgeführt. Allerdings wird vorher noch nach weiteren Abhängigkeiten geschaut. Das heißt, daß als erstes nachgesehen wird, was mit km.o ist. Ist km.o auch Ziel einer Regel? Ja, ist es, nämlich folgender:
km.o: km.c $(CC) $(CFLAGS) -DMODULE -D__KERNEL__ -DLINUX -I/usr/src/linux/include -c km.c
Fals km.o nicht existiert, oder aber km.o älter ist als km.c so wird $(CC) $(CFLAGS) -DMODULE -D.... usw. ausgeführt. Hierbei ist wiederum $(CC) eine Variable, die oben definiert wurde:
CC=gcc
Ebenfalls definiert wurde:
CFLAGS = -m486 -O2 -Wall -Wstrict-prototypes -pipe -fno-strict-aliasing -fno-common
Dies wird in dem Befehl eingesetzt. Wie Du siehst, auch der Befehl selber kann in einer Variablen stehen. Dies hat den Vorteil, wenn man einen anderen Compiler als den gcc benutzt, so braucht man nur in einer Zeile was zu verändern und muß nicht das ganze Makefile nach dem Compileraufruf durchsuchen. Angenommen, Du änderst etwas in km.c und rufst dann make auf, so ist das das Gleiche, als ob Du make all aufgerufen hast. all ist aber abhängig von kpm_drv.o und von kpm_api.o. Es wird dann quasi make kpm_drv.o und make kpm_api.o aufgerufen. (Ist nicht ganz so, wenn es noch Seiteneffekte gibt, aber das interessiert hier nicht) Beim make kpm_drv.o ist kpm_drv.o abhängig von eine ganze Menge andere Dateien, unter anderem auch von km.o und km.o ist wiederum abhängig von km.c. Nun ist aber km.o älter als km.c, da wir km.c ja verändert haben. also wird der Befehl zu km.o ausgeführt. Da aber kpm_drv.o abhängig ist von km.o und hier was ausgeführt wurde, wird auch der Befehl zu kpm_drv.o ausgeführt. Der Befehl zu all würde auch ausgeführt, gibt es aber nicht. Alles andere aber wird nicht ausgeführt, weil es nicht notwendig ist. Dafür ist make nämlich da. Es sollen nur die Befehle ausgeführt werden, die zur Erzeugung einer Datei notwendig sind. Teilschritte, die schon gemacht wurde, werden nicht noch mal gemacht, es sei denn, es hat sich was verändert. Bernd
participants (2)
-
B.Brodesser@t-online.de
-
Kaprice@t-online.de