2009-05-22 11 views
2

Ich würde gerne wissen, ob es möglich ist zu wissen, sobald ein Kernel konfiguriert ist, welche Dateien werden und in welcher Reihenfolge kompiliert werden?Wissen die Dateien kompiliert werden beim Erstellen eines Linux-Kernel

ich das wissen will, weil ich in den Variationen des Bauprozesses interessiert bin nach der Architektur, und ich will nicht so viele Werkzeugketten als Architektur haben ...

dank

+1

Gehen Sie und lesen Sie die Linux-Kernel-Makefiles ;-) – lothar

+0

das ist irgendwie lustig ... :-) – LB40

+0

Komisches Potenzial beiseite für RTFMF. Ich denke, das ist eine interessante Frage! –

Antwort

3

komplette redit:

Sie könnten den Make-Prozess in der Kernel-Quelle ändern

-n, --just-print, --dry-run, --recon 

Das Nettoergebnis dieses zu verwenden ist, dass die compil oder irgendeine ausführbare Datei wird nie aufgerufen. Es fake es nur und sagt Ihnen, was es tun würde.

Optionen und grep die Dateien daraus, ohne die Quelle zu erstellen. Dies könnte so einfach sein, wie die MAKE-Umgebung in der Shell zu setzen, um die obigen Optionen zu verwenden. Dann greife einfach alle Compiler-Befehle aus, die .c- und .h-Dateien beinhalten. Laden Sie die Kernel-Quelle für 2.6.29.2 herunter, um einen Blick darauf zu werfen, wie Sie dies tun können. Edit zu kommen.

Glück

Beitrag zurück, wie Sie auf bekommen. Vielleicht posten Sie das Shell-Skript! :)

Followup:

Zeile 13 der 2.6.29.2 Kernel Source-Code enthält in /2.6.19.2/Makefile

# Do not: 
# o use make's built-in rules and variables 
# (this increases performance and avoids hard-to-debug behaviour); 
# o print "Entering directory ..."; 
MAKEFLAGS += -rR --no-print-directory 

# We are using a recursive build, so we need to do a little thinking 
# to get the ordering right. 

bearbeiten MAKEFLAGS Variable die dryrun Flags umfassen sollte können Sie die Ausgabe einer bestimmten make-Konfiguration speichern und dann später grep. ala machen> save.txt

änderte ich meine zu

MAKEFLAGS += -rR --no-print-directory --just-print 

Zum Beispiel (Könnte viel besser sein):

[[email protected] linux-2.6.29.2]$ \ 
make > build_out.txt; grep -o -E "[a-zA-Z0-9_-]+\.[ch]" build_out.txt 

Nicht perfekt, aber arbeitete in einem hackish Weg für mich, und sollte mach dich auf den Weg. Der gleiche grundlegende Prozess wird hoffentlich nach einem Blind-make mit einem konfigurierten Kernel angewendet.

Warnung Ohne architekturspezifischen Werkzeugketten beizubehalten oder auf der Zielarchitektur unterscheidet sie einige der ASM und Architektur bestimmten Dateien Stellen laufen lassen zu einem wahren zu bauen.

bearbeiten von Kommentar

die ld Versagen zu unterdrücken, müssen Sie den folgenden Abschnitt (oder ähnlich) finden in Ihrer Kernel-Datei zu machen.

# Make variables (CC, etc...) 

AS    = $(CROSS_COMPILE)as 
LD    = $(CROSS_COMPILE)ld 
CC    = $(CROSS_COMPILE)gcc 
CPP    = $(CC) -E 
AR    = $(CROSS_COMPILE)ar 

Sie müssen die Konfigurationsschritte ausführen, um die Quelle zu konfigurieren, bevor Sie die Quelldateien in den vorherigen Schritten verwendet aufzuzählen versuchen (Rohrleitungen und greppen von Trockenlauf), so dass Sie Ihre Änderungen in Makefile.enum tun könnte und Verwenden Sie das, nachdem Sie die normalen Konfigurationsschritte ausgeführt haben (unabhängig von der Architektur müssen einige Dateien vom Typ config.h generiert werden.) Holen Sie die Kernel-Quelle an den Punkt, an dem Sie gerade eine Kompilierung durchführen möchten, Module und alle. Wütend!

Jetzt, wenn Sie Ihre Fake-Make tun, um die Quelldateien aufzuzählen, post Kernel-Quellkonfiguration (die die Treiber/Module, was auch immer) LD LD wird fehlschlagen, wie Sie entdeckt. Zeichen '-' Sie können LD aus dem

LD    = $(CROSS_COMPILE)ld 

zu

LD    = -$(CROSS_COMPILE)ld 

Hinweis das ändern. Dies weist das Makefile an, Warnungen zu ignorieren. Offensichtlich ist das, was Sie versuchen, ungewöhnlich, aber ziemlich cool :) Weitere Fehler können unterdrückt werden, indem Sie den Makefile-Abschnitt finden und die ausgeführten Befehle anpassen. Ich schlage vor, dass Sie sehr freundlich mit Makefiles werden, da Sie möglicherweise IF-Anweisungen später ändern müssen. Wenn Sie alles aussortiert haben, müssen Sie eine ‚stumme‘ Make-Datei, die die .c-Dateien ausspucken wird, so dass Sie

make | grep -E "[a-zA-Z0-9_-]+\.[ch]" 

oder was auch immer tun.

Ich habe auch einen coolen Vorschlag für die Validierung Ihrer Ergebnisse ... tatsächlich den Kernel bauen ... aber Linux inotify API verwenden (Sie können die Python-Bindungen hier http://pyinotify.sourceforge.net/ bekommen) und auf Dateisystemereignisse im Kompilierfenster (z als .c-Dateien, die von gcc gelesen werden). Dann vergleiche das mit deiner Liste aus dem 'dummen' Makefile.

Ok, ich hoffe, das ist nicht zu viel von einer Waffel!

+0

danke ... Ich war auf der Suche nach diesen Optionen ...: -) ... Einige Follow-ups kommen – LB40

+0

Ich fügte weitere vollständige Schritte für das, was ich (kein Wortspiel) auf der CLI schlug um es zu testen. –

+0

@LB ein Erfolg? –

Verwandte Themen