2009-10-29 18 views
28

Bei der Arbeit verwenden wir ein gemeinsames Makefile, das andere Makefiles enthalten (über die Include-Anweisung), und es hat ein generisches "sauberes" Ziel, das einige gebräuchliche Dateien zerstört. Ich möchte dieses Ziel in meinem neuen Makefile hinzufügen, damit ich bestimmte Dateien löschen kann, aber wenn ich ein sauberes Ziel in meinem Makefile hinzufüge, überschreibt es einfach das alte.Ziel in Makefile überschreiben, um weitere Befehle hinzuzufügen?

Ich weiß, ich kann nur ein neues Ziel mit einem neuen Namen machen und es sauber zu machen, und dann andere Sachen tun, aber aus Gründen der Konsistenz möchte ich in der Lage sein, einfach zu machen machen sauber und es tun alles.

Ist das möglich?

Antwort

26

Sie können Ihre eigenen sauber schreiben und machen es zu einem Standard der allgemeinen sauber.

 
clean: myclean 

myclean: 
    rm whatever 

Ihre werden zuerst ausgeführt. Wenn aus irgendeinem Grund die allgemeine Reinigung zuerst ausgeführt werden soll, wird die Lösung komplizierter.

+1

Scheint wie das wäre ein bisschen rückwärts, erfordern mehr und mehr preq zu dem sauberen Ziel des gemeinsamen Makefile. Wenn man das saubere Ziel im gemeinsamen Makefile etwas anderes nennt und dieses Ziel dann zu einem Preq des sauberen Ziels in anderen Makefiles macht, die das gewöhnliche Makefile enthalten, scheint es einfacher zu sein UND zu verhindern, dass das gemeinsame Makefile jemals ein preq hat verschwindet, wenn ein Teilprojekt verschwindet. Wenn Sie ein Doppel-Doppelpunkt-Ziel sauber machen, ist dies ein weiterer sauberer und vorhersehbarer Weg zur Lösung dieses Problems. –

+4

@Dave Rawks, du verstehst falsch, was ich geschrieben habe, würde in das * lokale * Makefile gehen, nicht in das übliche Makefile. Außerdem hatte der OP zwei Zielnamen, die er nicht wollte. Die Doppelpunkt-Idee ist clever, obwohl es das Ändern des allgemeinen Makefiles beinhalten würde (und es lokalen Makefiles nicht erlauben würde, die allgemeine Regel zu überschreiben). – Beta

+0

Danke, ich habe diese Beziehung vorher nicht bemerkt. – Bohdan

5

Es scheint, als ob die allgemeine Makefile-Regel so etwas wie common-clean genannt werden sollte. Dann würde jedes Hauptmakefile ihre saubere Regel als

clean: common-clean 

erklären und Sie sind festgelegt.

Wenn das keine Option ist, können Sie einen Blick auf double colon rules werfen, aber diese führen eine ganze Reihe anderer Probleme ein.

49

Ich habe das in mehreren Geschäften gesehen. Der gängigste Ansatz ist die Verwendung von Doppelpunkt-Regeln, vorausgesetzt, Sie verwenden etwas wie GNU make. In Ihrer gemeinsamen Make-Datei würden Sie so etwas wie diese:

clean:: 
     # standard cleanup, like remove all .o's: 
     rm -f *.o 

Hinweis, dass es zwei Doppelpunkte folgende clean, nicht nur eine!

In Ihrem anderen Make-Datei erklären Sie nur clean wieder, als Doppel-Doppelpunkt-Regel:

clean:: 
     # custom cleanup, like remove my special generated files: 
     rm -f *.h.gen 

Wenn Sie make clean aufrufen, GNU diese beiden „Zweige“ der sauberen Regel machen wird automatisch ausgeführt:

% make clean 
rm -f *.o 
rm -f *.h.gen 

Es ist einfach einzurichten und es komponiert ganz ordentlich, denke ich. Beachten Sie, dass Sie, insbesondere weil es sich um eine Doppelpunkt-Doppelregel handelt, nicht die "Overriding Commands" -Fehler erhalten, die Sie normalerweise erhalten, wenn Sie zwei Regeln für dasselbe Ziel definieren. Das ist der Sinn von Doppelpunkt-Regeln.

+0

Danke Eric, das funktioniert auch, aber ich würde lieber vermeiden, das übliche Makefile zu modifizieren, wenn ich kann. –

+1

Ich war nur auf der Suche nach und in meinem Fall ist der Doppelpunkt die perfekte Lösung. Danke vielmals! – aurora

1

Für uns, wir eine Variable definieren, EXTRAFILESTOCLEAN, dann, wenn die saubere Regel ausgeführt wird, hat es einen Schritt alles in der EXTRAFILESTOCLEAN Variable

clean: 
    rm -f *.o 
ifdef $(EXTRAFILESTOCLEAN) 
    rm -f $(EXTRAFILESTOCLEAN) 
endif 

angegeben zu entfernen, die unerwartete Probleme verursachen können, wenn Sie diese Variable zu seltsamen Werten, aber Sie können sich davor schützen, indem Sie Präfixe oder andere Tests hinzufügen.

3

Nutzung impliziten Regeln:

existing-target: my-extention 

my-extention: 
    echo running command 1 
    echo running command 2 

Very simple make tutorial to ramp up.

Wenn mit :: können Sie auf Probleme stoßen, da make beschwert sich, wenn Sie einzigen Doppelpunkt mischen: und Doppelpunkt :: Regeln :

a: 
    echo a 

a:: 
    echo aa 

bewirkt:

. . . 
*** target file `a' has both : and :: entries. Stop. 
0

eine weitere mögliche Lösung Hinzufügen ich für die Nachwelt gesehen habe ... Ich weiß, dass die OP war vorsichtig über die gemeinsame Make-Datei zu ändern, aber so etwas wie dies funktioniert und beinhaltet minimale Veränderungen.

lokale Make-Datei 1:

CLEAN=MyExe1 MyExe2 
.... 
include /my/common/makefile 

lokale Makefile 2:

CLEAN=MyExe3 MyExe4 
.... 
include /my/common/makefile 

gemeinsame Make-Datei:

clean: 
    rm -f *.dep *.o *.a $(CLEAN) 

Grundsätzlich ist die Idee, eine Variable (in diesem Fall CLEAN) zu definieren, in jedem lokalen Makefile mit allen spezifischen Elementen, die Sie löschen möchten. Dann läuft das allgemeine Makefile rm -f für alle gängigen Dateitypen, die gelöscht werden sollen, sowie für alles, was in den einzelnen lokalen Makefiles über die Variable CLEAN zum Löschen markiert wurde. Wenn es nichts Konkretes zu löschen, lassen Sie einfach die Variablendeklaration oder lassen Sie es leer (CLEAN=)

So, jetzt, wenn wir make clean für lokale Make-Datei 1, führen Sie es

rm -f *.dep *.o *.a MyExe1 MyExe2 

führt Und wenn wir laufen make clean für lokale Makefile 2, führt es aus

Verwandte Themen