2010-12-14 5 views
7

Ich habe folgende Make-Datei:Make denkt immer Projekt auf dem neuesten Stand ist - aber Dateien gibt es nicht einmal

CCC = g++ 
CCFLAGS = -ansi 

driver: driver.o graph.o 
     $(CCC) -o driver driver.o graph.o 

graph.o: graph.h 
driver.o: graph.h 

adjl: 
     rm -f graph.h graph.cc 
     ln -s adjl/graph.cc . 
     ln -s adjl/graph.h . 
     touch graph.cc graph.h 
adjm: 
     rm -f graph.h graph.cc 
     ln -s adjm/graph.cc . 
     ln -s adjm/graph.h . 
     touch graph.cc graph.h 

clean: 
     rm -f *.o 
real_clean: clean 
     rm -f graph.cc graph.h 
     rm -f driver

Die Idee ist, dass ich versuche, zwei verschiedene .cc/h-Dateien zu verknüpfen, je Auf welche Implementierung möchte ich zurückgreifen. Wenn ich real_clean mache, existiert keine der .cc/.h Dateien, ich habe nur eine driver.cc Datei und das Makefile im Ordner. Wenn ich make anrufe, heißt es, sie sind auf dem neuesten Stand. Dies passiert auch, wenn ich die Dateien in adjl/adm editiere, um sie zu "neueren" Versionen zu machen.

 [95]% ls 
adjl/ adjm/ driver.cc makefile 
[96]% make adjl 
make: `adjl' is up to date. 
[97]% make adjm 
make: `adjm' is up to date.

nahm ich die Vorlage Make-Datei von einem anderen Projekt, das ich getan hatte, und sie werden auf die gleiche Art und Weise geschrieben, aber ich kann immer wieder die gleichen Befehle ohne „up to date“ Probleme machen.

ich gegoogelt habe, aber noch nicht (scheinen sie in der Regel Nutzer einzubeziehen, die Reinigung nicht, bevor sie) ein Problem wie bei mir gefunden.

Danke an alle zum Lesen.

+0

macht sauber arbeiten? – Jason

+0

It does, make und real_clean funktionieren beide. – Dwayne

+0

Ich sehe was du meinst, aber es funktioniert. Ich habe gerade ein Makefile aus einer vorherigen Klasse kopiert und es funktioniert, mein Verständnis davon, wie sie funktionieren, ist jedoch sehr gering. – Dwayne

Antwort

18

Das Problem ist, dass Sie Verzeichnis die gleiche wie Ihre Ziele in Makefile genannt haben.

Wenn Sie make adjl ausstellen, überprüfen Sie die Datei adjl, die es findet und nichts tut. Benennen Sie Ziele in etwas anderes um und versuchen Sie es erneut.

8

Die adjl und adjm Ziele sind echte Ziele. Da sie keine Abhängigkeiten haben und die Dateien vorhanden sind (die 2 Verzeichnisse in Ihrem Eintrag), macht make nichts (weil sie in der Nähe sind).

Allerdings möchten Sie adjl und adjm als falsche Ziele angeben (damit die Befehle ausgeführt werden, wenn Sie sie angeben). Um dies zu tun,

.PHONY: adjl adjm 

Lesen Sie http://www.gnu.org/software/automake/manual/make/Phony-Targets.html für weitere Informationen.

EDIT

In der Tat sollten die real_clean und clean Regeln wahrscheinlich auch unecht gemacht werden.

+0

Das hat mein Problem behoben, danke. Ich bin immer noch verwirrt, warum mein altes Makefile (welches keine .PHONY-Zeile hat) funktioniert. Für mein Auge sehen sie strukturell identisch aus. Ich werde den Link lesen, danke für die Hilfe. – Dwayne

+1

Wenn die Datei nicht existiert, wird die Regel (wenn sie direkt/indirekt aufgerufen wird) ausgeführt (weil sie nicht existiert). Wenn nichts die Datei erstellt, wird sie jedes Mal ausgeführt, wenn die Regel aufgerufen wird (weil sie noch nicht existiert). deshalb hat es wahrscheinlich funktioniert. Deshalb funktioniert "real_clean" auch in Ihrem Fall. – lijie

+0

Ich verstehe jetzt, danke für die Hilfe. – Dwayne

3

Sie haben Verzeichnisse mit dem gleichen Namen wie Ihre Ziele.

Da Ihre Ziele von nichts abhängen, werden sie immer als aktuell betrachtet.

Wenn ein Ziel angeben, die nicht in eine Datei auf der Festplatte verbunden ist, müssen Sie das spezielle Ziel .PHONY verwenden:

.PHONY: adjl adjm 

Sie auch das gleiche auch für die sauberen und real_clean Ziele tun sollen - Andernfalls brechen sie, wenn jemand eine Datei namens "clean" erstellt.

Verwandte Themen