2008-09-17 11 views
11

Ich arbeite ein sehr großes Projekte, wo die Kompilierungszeit ist sehr lang. Welche Tools kann ich (vorzugsweise Open Source) unter Linux verwenden, um die am stärksten eingebundenen Dateien zu finden und deren Nutzung zu optimieren? Nur um klarer zu sein, brauche ich ein Werkzeug, das, abhängig von den Abhängigkeiten, mir zeigt, welche Header am meisten enthalten sind. Übrigens verwenden wir verteilte KompilierungSo finden Sie Header-Abhängigkeiten für große Projekte auf Linux

+0

Nur um klarer zu sein, brauche ich ein Werkzeug, das, abhängig von den Abhängigkeiten, mir zeigen wird, welche Header am meisten enthalten sind. Übrigens verwenden wir verteilte Kompilierung – user12371

+0

Vielleicht sollten Sie Ihre Frage bearbeiten, um diese Informationen aufzunehmen, anstatt sie als Kommentar zu haben? – Daemin

Antwort

0

IIRC gcc könnte Abhängigkeitsdateien erstellen.

0

Sie könnten verteilte Kompilierung aussehen wollen, siehe zum Beispiel distcc

4

Check out makdepend

+0

Das gibt mir die Abhängigkeit für jede Datei. Ich brauche etwas, das gegeben ist, findet die am meisten eingeschlossenen Dateien. – user12371

2

Tools wie doxygen (mit den graphviz Optionen verwendet) können Abhängigkeitsgraphen für Include-Dateien erzeugen ... I don Ich weiß nicht, ob sie genügend Überblick für das bieten, was Sie versuchen, aber es könnte sich lohnen, es zu versuchen.

0

Dies ist nicht genau, was Sie suchen, und es ist vielleicht nicht einfach zu installieren, aber vielleicht können Sie sich lxr ansehen: lxr.linux.no ist eine browserfähige Kernel-Struktur.

Wenn Sie im Suchfeld einen Dateinamen eingeben, erhalten Sie dort, wo sie enthalten ist. Aber das ist immer noch raten, und es verfolgt keine verketteten Abhängigkeiten.

Vielleicht

strace -e trace=open -o outfile make 
grep 'some handy regex to match header' 
1

Wenn Sie möchten, welche Dateien wissen, vor allem enthalten sind, verwenden Sie diesen Befehl bash:

Fund. -name '.cpp' -exec egrep '^ [: Leerzeichen:] #include [[: Leerzeichen:]] + ["<] [[: alpha:] [: Ziffer:] _.] + ["> ] '{} \;

| sortieren | uniq -c | sortieren -k 1rn, 1
| Kopf -20

wird es Top-20-Dateien nach Höhe der Zeit waren sie eingeschlossen Platz anzuzeigen.

Erläuterung: Die erste Zeile findet alle * .cpp-Dateien und extrahiert Zeilen mit der Direktive "#include" daraus. In der zweiten Zeile wird berechnet, wie oft jede Datei enthalten war, und in der dritten Zeile werden 20 größtenteils enthaltene Dateien verwendet.

+0

Haben Sie das nicht überprüft, aber Ihre Lösung funktioniert nicht, wenn dieselbe Datei mit zwei verschiedenen Pfaden verwendet wird. I.e. #include und #include <./ dev/blah.h> werden als unterschiedliche Include-Dateien betrachtet. – Daemin

+0

Grundsätzlich eine gute Idee. – Jonathan

2

Mit der Unix-Philosophie "viele kleine Werkzeuge zusammenkleben" würde ich vorschlagen, ein kurzes Skript zu schreiben, das gcc mit den Optionen -M (oder -MM) und -MF (OUTFILE) aufruft (wie detailliert here). Dadurch werden die Abhängigkeitslisten für das make-Tool generiert, die Sie dann leicht parsen können (relativ zur direkten Analyse der Quelldateien) und die erforderlichen Informationen extrahieren.

4

Die Antworten here geben Ihnen Werkzeuge, die #include Abhängigkeiten verfolgen. Aber Optimierung und dergleichen werden nicht erwähnt.

Beiseite: Das Buch "Large Scale C++ Software Design" sollte helfen.

2

Von der Root-Ebene des Quellbaums und gehen Sie wie folgt (\ t ist die Tab-Zeichen):

find . -exec grep '[ \t]*#include[ \t][ \t]*["<][^">][">]' {} ';' 
    | sed 's/^[ \t]*#include[ \t][ \t]*["<]//' 
    | sed 's/[">].*$//' 
    | sort 
    | uniq -c 
    | sort -r -k1 -n 

Linie 1 alle umfassen Linien zu erhalten. Zeile 2 streift alles vor dem eigentlichen Dateinamen ab. Zeile 3 streift das Ende der Zeile ab und hinterlässt nur den Dateinamen. Zeile 4 und 5 zählt jede eindeutige Zeile. Zeile 6 sortiert nach Zeilenanzahl in umgekehrter Reihenfolge.

+0

Sie brauchen [^ ">] * anstatt [^">] im Grep. –

+0

Diese Komponente erfasst auch keine Downstream-Komponenten. Das Parsen der Ausgabe von "gcc -E-dI" wird viel besser für ein komplexeres Projekt sein. –

1

Verwenden Sie ccache. Es wird die Eingaben in eine Kompilierung hashen und die Ergebnisse zwischenspeichern, was die Geschwindigkeit dieser Art von Kompilierungen drastisch erhöhen wird.

Wenn Sie wollten die mehrere enthält erkennen, so dass Sie sie entfernen konnte man makedepend als Iulian Serbanoiu schlägt verwenden:

makedepend -m *.c -f - > /dev/null 

wird eine Warnung für jeweils mehrere umfassen.

1

Bash-Skripte auf der Seite gefunden sind keine gute Lösung. Es funktioniert nur bei einfachen Projekten. Tatsächlich werden in großen Projekten, wie in der Kopfseite beschrieben, häufig C-Präprozessor (#if, #else, ...) verwendet. Nur gute Software komplexer, wie makedepend oder scons kann gute Informationen geben. gcc -E kann helfen, aber bei großen Projekten ist die Ergebnisanalyse eine Zeitverschwendung.

Verwandte Themen