Frage

Ich habe ein Projekt, das ich lösen arbeite an, dass drei Teilprojekte tatsächlich enthält, von denen alle müssen in einem Rutsch erstellt werden. Mein Make-Datei sieht in etwa wie folgt aus:

all: a b c

a:
    @cd a && make

b:
    @cd b && make

c:
    @cd c && make

Projekte A und B beide fein kompilieren, aber für das dritte Projekt, es sagt mir, es gibt nichts zu dem C-Verzeichnis und den Betrieb obwohl Schalt machen, um zu tun ist, ist in der Tat Code kompilieren.

Um ein wenig genauer zu sein: Projekt C in dem obigen Beispiel ist der Spider tatsächlich Mozilla. Während A und B Code / Makefiles, die ich geschrieben habe, ist C nur eine rohe Kopie von Spider von der Mozilla-Website. Der tatsächlich kompiliert Befehl für sich ist:

make JS_DIST=/usr JS_THREADSAFE=1 JS_HAS_FILE_OBJECT=1

In meinem Master-Makefile, die ich habe:

spidermonkey:
    @cd spidermonkey/src && $(MAKE) JS_DIST=/usr JS_THREADSAFE=1 JS_HAS_FILE_OBJECT=1

Beim Laufen gibt „Spider machen“ „machen: Nichts für` Spidermonkey‘zu tun.“ Wie kann ich machen um den Befehl auszuführen?

EDIT: Ich habe versucht, indem Sie die folgenden Zeilen zu meiner Make-Datei:

.PHONY: spidermonkey

Neben der Spider Regel sm umbenennen, aber immer noch keine Änderung.

EDIT: Mein Fehler! Ich hatte Räume, wenn ich eine Registerkarte gehabt haben sollte. Doh!

War es hilfreich?

Lösung

Sie haben wahrscheinlich eine Datei oder ein Verzeichnis auf der obersten Ebene namens „Spidermonkey“. Machen Sie denkt, das ist es, was sein angenommenes zu schaffen, und da es schon da ist, machen stoppt.

Eine der wichtigsten Regeln zu folgen, wenn das Schreiben von Makefiles ist jedes Ziel sollte eine Datei mit dem gleichen Namen wie das Ziel erstellen. Mit anderen Worten, wenn Sie

 a:
       <some command>

Dieser Befehl soll eine einzelne Datei mit dem Namen "a" erzeugen.

Die Regeln, welche Dateien nicht produzieren, sondern sind nur dort als Platzhalter genannt werden Unechte Ziele , und sie soll wie folgt deklariert werden:

 .PHONY: a

Machen Sie werden dann immer davon ausgehen, dass ein neu gemacht werden muss.

Auch als allgemeine Regel nicht verwenden "make" rekursiv machen aufzurufen, verwenden Sie $ (MAKE) statt .

EDIT: geändert "Pseudo" auf "falsche"

Andere Tipps

Machen Sie prüfen nur für die Existenz einer Datei (oder das Verzeichnis) die gleichen wie das Regelziel genannt, und wenn es (und es ist neuer als die Abhängigkeiten), dann von Make-Sicht gibt es nichts mehr zu tun.

So Ihr Problem ist, dass Sie eine Regel haben Spidermonkey (ohne Abhängigkeiten) sowie ein Verzeichnis namens Spidermonkey, und dann machen denkt, dass „das Ziel ist bereits gemacht, nichts für mich zu tun“. Zu bekommen machen zu tun, was Sie wollen, benennen Sie die Spidermonkey-Regel (oder das Verzeichnis).

Apropos rekursiven make durch die Art und Weise, ist dies nicht notwendigerweise eine gute Idee, finden Sie unter rekursive Make als schädlich .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top