make: Nichts für alle zu tun

97

Ich gehe ein zB pgm durch, um eine make-Datei zu erstellen.

http://mrbook.org/tutorials/make/

Mein Ordner eg_make_creation enthält die folgenden Dateien:

desktop:~/eg_make_creation$ ls
factorial.c  functions.h  hello  hello.c  main.c  Makefile

Makefile

# I am a comment, and I want to say that the variable CC will be
# the compiler to use.
CC=gcc
# Hwy!, I am comment no.2. I want to say that CFLAGS will be the
#options I'll pass to the compiler
CFLAGS=-c -Wall

all:hello

hello:main.o factorial.o hello.o
  $(CC) main.o factorial.o hello.o -o hello

main.o:main.c
  $(CC) $(CFLAGS) main.c

factorial.o:factorial.c
  $(CC) $(CFLAGS) factorial.c

hello.o:hello.c
  $(CC) $(CFLAGS) hello.c

clean:
  rm -rf *o hello

Error:

desktop:~/eg_make_creation$ make all
make: Nothing to be done for `all'.

Bitte helfen Sie mir zu verstehen, dieses Programm zu kompilieren.

Angus
quelle
12
Versuchen Sie ein "Make Clean", gefolgt von einem "Make All"
Paul R
11
Das ist kein Fehler, es bedeutet nur, dass helloes auf dem neuesten Stand ist. Wechseln Sie cleanzu, rm -f *.o hellobevor etwas Unerwartetes ausgeführt wird, make clean allund führen Sie dann aus, ob dies funktioniert.
Mat
1
Sie sollten auch hinzufügen .phony: all clean, da allund cleankeine Dateinamen.
Kerrek SB
3
Setzen Sie das -c nicht in Ihre CFLAGS ein.
Wildplasser

Antworten:

121

Manchmal kann der Fehler "Nichts für alle tun" durch Leerzeichen vor dem Befehl in der Makefile-Regel anstelle der Registerkarte verursacht werden. Stellen Sie sicher, dass Sie Tabulatoren anstelle von Leerzeichen in Ihren Regeln verwenden.

all:
<\t>$(CC) $(CFLAGS) ...

anstatt

all:
    $(CC) $(CFLAGS) ...

Die Beschreibung der Regelsyntax finden Sie im GNU make-Handbuch: https://www.gnu.org/software/make/manual/make.html#Rule-Syntax

VirtualVDX
quelle
obj-m + = hallo.o alle: </ t> make -C / lib / modules / $ (Shell uname -r) / build M = $ (PWD) Module sauber: make -C / lib / modules / $ ( Shell uname -r) / Build M = $ (PWD) sauber
Narendra Jaggi
Ist die obige Datei eine gültige Datei?
Narendra Jaggi
Im Kontext von Eltern-Kind-Makefiles kann manchmal der Fehler "Nichts für alle zu tun" dadurch verursacht werden, dass untergeordnete Ziele im übergeordneten Makefile fälschlicherweise als .PHONY deklariert werden.
Donhector
Ich hatte all : src/server/mod_wsgi.la, zu dem ich gewechselt habe all : </t> src/server/mod_wsgi.la. Ich bekomme jetzt den Fehler: make: execvp: src/server/mod_wsgi.la: Permission denied Makefile:29: recipe for target 'all' failed make: *** [all] Error 127nach sudo make. Irgendeine Hilfe?
Mooncrater
@Mooncrater Siehe gnu.org/software/make/manual/make.html#Rule-Syntax . Hier lautet: Die Rezeptzeilen beginnen mit einem Tabulatorzeichen (oder dem ersten Zeichen im Wert der Variablen .RECIPEPREFIX; siehe Spezielle Variablen). Die erste Rezeptzeile wird möglicherweise in der Zeile nach den Voraussetzungen mit einem Tabulatorzeichen oder in derselben Zeile mit einem Semikolon angezeigt. In jedem Fall ist der Effekt der gleiche. So wurde Ihre Voraussetzung einfach zum Rezept. In diesem Fall benötigen Sie keine Registerkarte.
VirtualVDX
31

Entfernen Sie die helloDatei aus Ihrem Ordner und versuchen Sie es erneut.

Das allZiel hängt vom helloZiel ab. Das helloZiel versucht zunächst, die entsprechende Datei im Dateisystem zu finden. Wenn es es findet und mit den abhängigen Dateien auf dem neuesten Stand ist, gibt es nichts zu tun.

Wochen
quelle
obj-m + = hallo.o alle: </ t> make -C / lib / modules / $ (Shell uname -r) / build M = $ (PWD) Module sauber: make -C / lib / modules / $ ( Shell uname -r) / Build M = $ (PWD) sauber
Narendra Jaggi
Ist die obige eine gültige Make-Datei?
Narendra Jaggi
21

Wenn Sie nur make geben, wird die erste Regel in Ihrem Makefile festgelegt, dh "all". Sie haben angegeben, dass "all" von "hello" abhängt, was von main.o, factorial.o und hello.o abhängt. Also versucht 'make' zu sehen, ob diese Dateien vorhanden sind.

Wenn sie vorhanden sind, prüft 'make', ob sich ihre Abhängigkeiten, z. B. main.o hat eine Abhängigkeit main.c, geändert haben. Wenn sie sich geändert haben, erstellen Sie sie neu, andernfalls wird die Regel übersprungen. In ähnlicher Weise werden die geänderten Dateien rekursiv erstellt und schließlich der oberste Befehl "all" in Ihrem Fall ausgeführt, um Ihnen eine ausführbare Datei zu geben, in Ihrem Fall "Hallo".

Wenn sie nicht vorhanden sind, baut blind alles unter der Regel auf.

Wenn Sie zu Ihrem Problem kommen, ist es kein Fehler, aber 'make' bedeutet, dass jede Abhängigkeit in Ihrem Makefile auf dem neuesten Stand ist und nichts gemacht werden muss!

Chethan Ravindranath
quelle
16

Make verhält sich richtig. helloexistiert bereits und ist nicht älter als die .cDateien, daher ist keine Arbeit mehr zu erledigen. Es gibt vier Szenarien, in denen make (neu) erstellt werden muss:

  • Wenn Sie eine Ihrer .cDateien ändern , ist sie neuer als hellound muss neu erstellt werden, wenn Sie make ausführen.
  • Wenn Sie löschen hello, muss es natürlich neu erstellt werden
  • Mit dieser -BOption können Sie make zwingen, alles neu zu erstellen.make -B all
  • make clean allwird gelöscht hellound erfordert eine Neuerstellung. (Ich schlage vor, Sie schauen sich @ Mat's Kommentar über anrm -f *.o hello
Aaron McDaid
quelle
4

Ich denke, Sie haben einen Tab in der 9. Zeile verpasst. Die folgende Zeile : Hallo, es muss eine leere Registerkarte sein. Stellen Sie sicher, dass Sie in der 9. Zeile eine leere Registerkarte haben. Dadurch wird dem Interpreter klar, dass Sie das Standardrezept für das Makefile verwenden möchten.

Technikfreak
quelle
4

Das ist kein Fehler; Der Befehl make unter Unix funktioniert basierend auf den Zeitstempeln. Das heißt, wenn Sie bestimmte Änderungen vorgenommen factorial.cppund mit kompiliert haben make, zeigt make die Information an, dass nur der cc -o factorial.cppBefehl ausgeführt wird. Wenn Sie das nächste Mal denselben Befehl ausführen, dh makeohne Änderungen an einer Datei mit .cppErweiterung vorzunehmen, gibt der Compiler an, dass die Ausgabedatei auf dem neuesten Stand ist. Der Compiler gibt diese Informationen weiter, bis wir bestimmte Änderungen an irgendwelchen vornehmen file.cpp.

Der Vorteil von makefileist, dass die Neukompilierungszeit reduziert wird, indem nur die geänderten Dateien kompiliert werden und die object ( .o) - Dateien der nicht geänderten Dateien direkt verwendet werden.

Muneshwar
quelle
0

Ich bin auf einem anderen Weg zu diesem eigentümlichen, schwer zu debuggenden Fehler gekommen. Mein Problem bestand darin, dass ich in einem Erstellungsschritt eine Musterregel verwendete, wenn sich das Ziel und die Abhängigkeit in unterschiedlichen Verzeichnissen befanden. Etwas wie das:

foo/apple.o: bar/apple.c $(FOODEPS)

%.o: %.c
    $(CC) $< -o $@

Ich hatte mehrere Abhängigkeiten auf diese Weise eingerichtet und versuchte, ein Musterrezept für alle zu verwenden. Natürlich wird eine einzige Ersetzung für "%" hier nicht funktionieren. Ich machte explizite Regeln für jede Abhängigkeit und fand mich wieder unter den Welpen und Einhörnern wieder!

foo/apple.o: bar/apple.c $(FOODEPS)
    $(CC) $< -o $@

Hoffe das hilft jemandem!

sfaleron
quelle