2008-10-27 11 views
6

Ich habe ein sehr großes C-Projekt mit vielen separaten C-Dateien und Headern und vielen Dutzenden von Mitwirkenden. Viele Mitwirkende haben kein ausgeprägtes Wissen über Makefiles und Abhängigkeiten, was zu dem nicht unüblichen Problem führt, dass Sie fast immer "sauber machen" müssen, bevor Sie darauf vertrauen können, dass "make" eine korrekte Ausgabe erzeugt hat.Abhängigkeitsprüfung - wie man ein Projekt mit fehlerhaften Makefiles bereinigt

Wenn es Minuten dauern würde, wäre das kein Problem, aber es sind jetzt fast 2 Stunden auf einem schnellen Rechner, und die Leute fangen an, Code einzupacken, der funktioniert, wenn sie gemacht werden, aber sie reinigen nicht zuerst und Ihr Code bricht schließlich den Build. Fragen Sie nicht, warum diese nicht vom Erstellungsmanager abgefangen werden, bevor eine neue Grundlinie geschnitten wird ...

Ja, wir hätten es nicht so weit gehen lassen sollen.

Ja, wir bilden unsere Entwickler aus.

Wie immer haben wir keine Zeit, alles zu stoppen und von Hand zu reparieren.

Ich denke, es gibt Werkzeuge in diese Richtung:

  • Gibt es automatisierte Tools richtige Abhängigkeitsinformationen für ein vorhandenes Projekt aus den C- und H-Dateien erstellen helfen?
  • Gibt es automatisierte Tools, um Abhängigkeitsinformationen gemäß den Makefiles zu beschreiben?
  • Gibt es einen heiligen Gral eines Werkzeugs, um die Unterschiede zwischen den beiden oben genannten Abhängigkeitsbäumen zu beschreiben?

Aber was kann/sollte noch getan werden, um dieses Problem zu beheben?

Vielen Dank im Voraus ...

-Adam

Antwort

6

Es könnte am einfachsten zu einem Werkzeug wechseln von Stellen, die Abhängigkeiten automatisch erkennt. Beispiel: SCons macht Sie nicht dazu, Abhängigkeiten aufzulisten, sondern analysiert die zu kompilierenden Dateien automatisch und sucht nach Includes. Sie geben einfach an, welche Dateien kompiliert werden sollen und welche Dateien zu welchen ausführbaren Dateien gehören. Der Umstieg auf Build-Systeme wird einfacher für die Tatsache, dass Ihre Entwickler nicht wirklich Make-Experten sind.

Eine weitere Alternative, wenn Sie bei Make bleiben, ist die Option gcc -M, um Abhängigkeiten automatisch zu erkennen. Die Antwort auf die Frage Automatically discovering C dependencies enthält ein Beispiel dafür, wie Sie Ihre Makefiles Abhängigkeiten automatisch erkennen lassen, so dass Sie sie nicht manuell angeben müssen.

+0

Fügen Sie den Makefiles, die die Abhängigkeiten neu aufbauen, eine 'make depend'-Regel hinzu, wie in der querverweisenden SO-Frage/Antwort. –

3

Wir haben das gleiche Problem an meinem Arbeitsplatz. Der Trunk war immer nach Merges oder Check-Ins defekt.

Wir bauen einen continuous integation Build-Rechner ein, der in etwa 45 Minuten im Vergleich zu etwa 2 Stunden auf einem Dev-Rechner eine Säuberung durchführt. Der Integrationsserver fragt das SVN-Repository alle 2 Stunden nach neuen Check-Ins ab und startet eine Makeup-Reinigung .

Auf diese Weise können wir genau überwachen, wann der Build defekt war, und sofort beheben. Wir verwenden Hudson als unsere kontinuierliche Integration Server, seine freie und Open Source, es ist ein Kunstwerk und sehr einfach einzurichten. Außerdem ist die Benutzeroberfläche sehr intuitiv, alle anderen Entwickler lieben es.

Cheers,

+0

Ihr Link zu Hudson ist kaputt. – Ilya

+0

Thx, ich habe es gerade korrigiert –

2

die kanonische Um dies zu lösen, muss der Compiler automatisch Abhängigkeitsinformationen für Sie generieren. So etwas wie diese (vorausgesetzt, gcc, sollten Sie Ihren Compiler für ähnliche Optionen überprüfen)

SOURCES=foo.c bar.c 

%.d: %.c 
    $(CC) $(CFLAGS) -MM $< >[email protected] 

include $(SOURCES:.c=.d) 

Das GNU Make Handbuch ein Kapitel über automatically generating prerequisites hat.

BEARBEITEN: Ich empfehle normalerweise Leuten, CMake zu verwenden, wenn sie diese Art des Problems haben.

Verwandte Themen