Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (GNU/Linux, *NIX, *BSD und Co) » make befehl

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
26.11.2010, 16:23 Uhr
banshee



Hallo,

kann mir mal jemand erklären, was genau folgendes makefile tut? Ein paar Sachen hab ich beim googlen schon rausgefunden, aber ich hab nix wirklich gutes gefunden.

obj-m := test.o // bestimmt das output file
PWD := $(shell pwd) // quasi sowas wie ein Alias, aber was genau ist shell pwd?
default:
make -C /usr/src/linux SUBDIRS=$(PWD) modules // bevore der make-Befehl ausgeführt wird, wechselt er ins subdirectory /usr/src/linux aber was bewirkt dann SUBDIRS=$(PWD) (wird wohl zu dem shell pwd evaluiert) und modules?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
27.11.2010, 12:47 Uhr
~toxic
Gast


hi, iss zwar ins blaue geschossen, aber so wie sich das liest heisst das PWD nicht etwa "password" sondern "Path With Drive" und in deinem fall wohl der pfad von wo aus du das make startest
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
28.11.2010, 09:09 Uhr
Tommix



'Morgen,
pwd heißt "print working directory" und entspricht im wesentlichen cd ohne Argumente unter (Win-)DOS: Das aktuelle Verzeichnis.

- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
28.11.2010, 18:21 Uhr
Pablo
Supertux
(Operator)


das ist eine Makefile, um kernel Modules zu bauen.

Die Makefile in Linux (damit sind die Makefile im Source Code gemeint) deklarieren die Variablen obj-m, die eine Liste von Objekten hat, die kompiliert werden müssen.

PWD := $(shell pwd) ist nicht anders als PWD = /der/path/von/wo/du/make/ausführst

mit make -C /usr/src/linux SUBDIRS=$(PWD) modules kompilierst du die Sachen.

Die -C Option sagt, dass nicht die Makefile vom aktuellen Verzeichnis (default) sondern die in /usr/src/linux nehmen soll.

SUBDIRS=$(PWD) ist die Deklaration einer internen Variablen, die in /usr/src/linux/Makefile verwendet wird.

'modules' ist der Target, der von 'make' gebaut werden soll. Makefiles können verschiedene Targets haben:


Code:
default:
    @echo "Ich bin default target"

kernel:
    @echo "Ich bin kernel target"

modules:
    @echo "Ich bin modules target"

clean:
    @echo "Ich bin clean target"



Die folgenden Befehle

Code:
$ make
$ make clean
$ make kernel
$ make modules



erzeugen folgenden Output


Code:
Ich bin default target
Ich bin clean target
Ich bin kernel target
Ich bin modules target



make -C /usr/src/linux SUBDIRS=$(PWD) modules "ruft" also den Target 'modules' in /usr/src/linux/Makefile auf. Da SUBDIRS=/der/path/von/wo/du/make/ausführst deklariert ist, weiß /usr/src/linux/Makefile, von wo aus die Source Dateien sich befinden und kann sie kompilieren.


Eigentlich sollte eine Makefile für externe Modules eher so aussehen


Code:
ifneq ($(KERNELRELEASE),)

obj-m   := module.o

else

# ermittle den Pfad vom running-kernel
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
all:
    $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules

endif



/usr/src/linux/Makefile deklariert die Variable KERNELRELEASE. Wenn du außerhalb des Kernel 'make' ausführst, dann ist KERNELRELEASE Variable leer und alles nach dem else wird ausgeführt. Wenn der make -C ... modules Befehl ausgeführt wird, wird dann der Target 'modules' von /usr/src/linux/Makefile ausgeführt. Dieses deklariert KERNELRELEASE und includiert die $(SUBDIRS)/Makefile Datei (die ursprüngliche) und in diesem Fall wird das vor dem else ausgeführt. obj-m ist gesetzt und module.c wird dann mit den richtigen Flags kompiliert und gelinkt.

Es ist ein cleveres System, um Sachen außerhalb des Kernels zu kompilieren, aber am Anfang dauert es ein bisschen, bis man verstanden hat, wie das alles funktioniert.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 28.11.2010 um 18:25 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
30.11.2010, 16:22 Uhr
banshee



Das hilft mir schon sehr weiter.

Ich probiere gerade über die Uni als praktische Übung an den kernels rumzuspielen. Leider läuft es wie bei allen praktischen Aufgaben: Die Einrichtung ist einfach nur der absolute Krampf. Ich hab leider nicht viel Ahnung von Linux/Ubuntu aber jede Anleitung die man zur Installation des Kernel Source findet, ist anders und vor allen Dingen ellenlang und endet mit einer Fehlermeldung für die es keine Lösung zu geben scheint.

Ich führe das ganze über Virtual Box durch und nach

apt-get install linux-source-2.6.35
cd /usr/src
bunzip2 linux-source-2.6.35.tar.bz2

bekomme ich die Fehlermeldung "linux-source-2.6.35.tar.bz2 is not a normal file", extrem aussagekräftig wie ich finde.

Ich habe dann versucht, es über den Archiv-Manager zu entpacken, habe aber keine Ahnung wie ich mir Rootrechte in der grafischen Oberfläche gebe.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
30.11.2010, 19:11 Uhr
Pablo
Supertux
(Operator)


bist du sicher, dass linux-source-2.6.35 die Datei /usr/src/linux-source-2.6.35.tar.bz2 anlegt?

Um externe Module zu kompilieren, brauchst du nicht den ganzen Kernelcode, die Objektfiles genügen. Debian (und somit Ubuntu) hat ein extra Paket dafür, ich weiß leider nicht Namen nicht mehr. Ich muss es nachschauen.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
30.11.2010, 19:42 Uhr
banshee



ja, ich habe extra über die GUI nachgeschaut. Ich habe den Paketmanager auch schon nach besagtem Paket durchsucht weil das bei uns auch so in der Aufgabenstellung stand, aber ich habe es auch nicht gefunden. Evtl. hab ich es übersehen, weil Suchen nach 'kernel', 'source' oder ähnlichem mindestens 50 verschiedene Ergebnisse liefert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
30.11.2010, 22:00 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


normalerweise reicht das zu deinem kernel korrespondierende "linux-headers" paket, der kernel an sich heißt als paket auch "linux-image"

ansonsten würde ich es mit

tar xvjf linux-source-2.6.35.tar.bz2

probieren
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
01.12.2010, 02:15 Uhr
banshee



Ich habe einen Ordner linux-headers-2.6.35-22 und linux-headers-2.6.35-22-generic von denen ich am Anfang auch gedacht habe, dass das die gesuchten Sourcen sind.

Wenn ich jetzt allerdings einen hello.c in meinem Home-Verzeichnis anlege:


C++:
#include <linux/module.h>
#include <linux/config.h>
#include <linux/init.h>
MODULE_LICENSE("GPL");
static int __init name_of_initialization_routine(void) {
printk(KERN_ALERT "Hello, world\n");
return 0;
}
static void __exit name_of_cleanup_routine(void) {
printk(KERN_ALERT "Goodbye, cruel world\n");
}
module_init(name_of_initialization_routine);
module_exit(name_of_cleanup_routine);


Und das zugehörige Makefile:


C++:
obj-m := hello.o
PWD := $(shell pwd)
default:
make -C /usr/src/linux-headers-2.6.35-22 SUBDIRS=$(PWD) modules


Dann bekomme ich beim Ausführen von make nur die Meldung, dass für das Ziel default nichts zu tun sei und das sieht falsch aus.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
01.12.2010, 15:45 Uhr
Pablo
Supertux
(Operator)


Siehe http://tldp.org/LDP/lkmpg/2.6/html/x181.html


C++:
obj-m := hello.o
PWD := $(shell pwd)
all:
    make -C /usr/src/linux-headers-2.6.35-22 M=$(PWD) modules



(Achtung, vor 'make -C...' unbedingt ein TAB einfügen!)

ansonsten poste doch mal die genaue Fehlermeldung
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 01.12.2010 um 15:50 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (GNU/Linux, *NIX, *BSD und Co) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: