Probleme beim einstellen PFAD im Makefile
Ich bin neu zu machen und die Makefiles, aber ich bin versucht, zu erstellen eine für mein Nächstes Projekt und ich bin in PFAD Probleme. Ich erhalte die Fehlermeldung: "No such file or directory"
Habe ich ein einfaches Ziel als test
läuft, dass alle meine tests mit Mokka.
Mocha installiert ist, als ein lokaler Knoten-Modul, so dass die ausführbare Datei finden Sie unter ./node_modules/.bin/mocha
. Ich bin die änderung meiner PFAD, wie beschrieben, in dieses tutorial machen so kann ich beziehen sich auf es als mocha
anstatt den vollständigen Pfad, aber etwas scheint nicht zu funktionieren.
Hier ist, was ich habe, so weit:
export PATH := node_modules/.bin:$(PATH)
test:
which mocha
mocha
.PHONY: test
Wenn ich make test
ich bekomme die folgende Ausgabe:
which mocha
node_modules/.bin/mocha
mocha
make: mocha: No such file or directory
make: *** [test] Error 1
Wie Sie sehen können von der Ausgabe which mocha
richtig Druck-der Pfad der Mokka ausführbare Datei, aber wenn ich einfach laufen mocha
ist, kann es nicht finden.
Was mache ich falsch? Gibt es größeres Bild über den Geltungsbereich von Variablen oder Persistenz in Makefiles, die mir fehlt?
P. S. Falls es wichtig ist, ich bin mit einem Mac und die version von make, die kommt mit dem XCode developer tools. Dies ist, was ich bekomme, wenn ich make -v
GNU Make 3.81
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
This program built for i386-apple-darwin11.3.0
- Das ist seltsam.. Was passiert wenn du die Zeile entfernen
export PATH := node_modules/.bin:$(PATH)
und laufen machen so : $ PATH=node_modules/.bin:$PATH machen test funktioniert es ? - Yep, funktioniert Prima, wenn ich das mache.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kann ich nicht reproduzieren Ihre Ergebnisse (mit GNU make 3.81 auf einem GNU/Linux-system). Es scheint, dass es möglicherweise einen Unterschied in der entweder der Art und Weise das Apple-system funktioniert, oder, dass Apple hat eine Art patch für den GNU make version, die Sie versenden, das dieses problem verursacht.
GNU make hat zwei Möglichkeiten zur Ausführung von Rezepten: dem normalen Weg, wo es ruft eine shell auf und übergibt das Rezept an die shell ausgeführt werden, und die "fast-path", wo, wenn der sieht, dass der Befehl "einfach genug" (das ist, wenn es keine shell-Sonderzeichen), wird es einen hacken Befehl in Worte zu fassen und direkt den Befehl ausführen, ohne Berufung auf die shell. Letzterer ist viel schneller, aber da es aufgerufen wird, direkt erbt es die
PATH
Einstellung von GNU make sich nicht von der shell.Es scheint, dass aus irgendeinem Grund die version von GNU make ausgeliefert, die von Apple nicht richtig funktioniert ist, dass es nicht die Einstellung die Umgebung korrekt für Befehle, die direkt von GNU make, über den "schnellen Weg".
Ich habe eine sehr vage Erinnerung an etwas, wie diese diskutiert, auf GNU make, mailing-Listen, aber nachdem er einige Zeit auf der Suche war ich nicht in der Lage zu kommen mit etwas.
Können Sie "lösen" dieses problem, indem Sie gezwungen werden, Ihre Befehl verwenden, den langsamen Weg, durch die Einführung einiger shell-Sonderzeichen (globbing,
;
, Rohre, etc.). Oder Sie können verwenden Sie ein vollständig Qualifizierter Pfad zu dem Programm.Oder Sie können gehen Sie Holen Sie sich den Quellcode für GNU make und bauen Sie es sich selbst; wenn dieser Unterschied ist das Ergebnis ein "Update" von Apple, die sollte es besser funktionieren. Oder installieren Sie GNU-make von homebrew-oder-ports, die bekommen auch Sie eine neuere version mit mehr features, die ich erwarten.
mocha
wie folgt Aussehen:: ; mocha
. Dadurch umgehen, GNU make ' s fast-path-Verarbeitung und zwingen Sie zum aufrufen einer shell. Wenn das funktioniert, dann bin ich noch mehr verdächtige, die etwas Bizarr mit der Apple-version von GNU-make.: ; mocha
hat Prima funktioniert. Auch, mocha akzeptiert eine Liste von Dateien, aber wenn Sie liefern keine, es wird standardmäßig auf./test/*
. Wenn, statt nur laufenmocha
ich laufenmocha ./test/*
es funktioniert auch. Irgendwie ist es verwirrt zu sein, durch einen einzigen Befehl..../test/*
Sie sind mit einem speziellen Zeichen (*
für globbing), erfordert der shell, genauso wie wenn ich;
. Irgendwie ist die Apple-version von GNU-make ist nicht die Einstellung der lokalenPATH
Umgebungsvariable, es ist nur die EinstellungPATH
in Teilprozesse.PATH
nicht für einige Rezepte, während es andere haben. Es ist trivial zu reproduzieren, die auf OSX mit GNU Make 3.81. Hinzufügen eines;
zu Befehlen, ist eine schnelle Abhilfe.In OSX müssen Sie außerdem set SHELL:
Sollte dies funktionieren:
PATH
; Zitate haben keine spezielle Bedeutung im Makefile Aufgaben, so sind Sie einfach vorangestellt und angehängt an diePATH
effektiv maskieren den ersten und den letzten Wert (es sei denn, es gibt ein Verzeichnis namensnode_modules/.bin"
Ich bin mit GNU make, version 4.1 auf Ubuntu 16.04.4
Ich hatte ein ähnliches Problem und keine der vorgeschlagenen Lösungen bei mir funktioniert.
Einstellungen zu
PATH
scheinen nicht wirksam, wenn später variable Einstellungen erfolgen (zumindest in dieser version vonmake
).Die Lösung, die für mich gearbeitet wurde, um zu injizieren, die früher
PATH
Einstellung explizit in der entsprechenden sub-shell für die Zuordnung später variabel sein, wie diese:Den folgenden
Makefile
Beispiel veranschaulicht den Fall, dass Werke vs man gar nicht:Reproduzieren Sie das problem und die Lösung:
Ich fürchte, dass das kannst du nicht tun
Versuchen Sie es mit "lokalen" Variablen statt
which mocha
arbeitet, scheint es, dass es konnte die Arbeit für die Linie. Auch, wenn ich drucken Sie die PATH-variable enthält es den node_modules-bit, aber vielleicht ist das nur eingeschränkt auf die machen, sub-Prozess, weiß ich nicht.