make: Rien à faire pour `` tous ''

97

Je suis en train de passer par un pgm par exemple pour créer un fichier make.

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

Mon dossier eg_make_creation contient les fichiers suivants,

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

Erreur:

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

Veuillez m'aider à comprendre comment compiler ce programme.

Angus
la source
12
Essayez de faire un "make clean" suivi d'un "make all"
Paul R
11
Ce n'est pas une erreur, cela signifie simplement qu'il helloest à jour. Passez cleanà rm -f *.o helloavant qu'il ne fasse quelque chose d'inattendu, puis exécutez make clean allet voyez si cela fonctionne.
Mat
1
Vous devez également ajouter .phony: all clean, puisque allet cleanne sont pas des noms de fichiers.
Kerrek SB
3
Ne mettez pas le -c dans vos CFLAGS.
wildplasser

Réponses:

121

Parfois, l'erreur «Rien à faire pour tous» peut être causée par des espaces avant la commande dans la règle makefile au lieu de tab. Veuillez vous assurer que vous utilisez des tabulations au lieu d'espaces à l'intérieur de vos règles.

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

au lieu de

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

Veuillez consulter le manuel GNU make pour la description de la syntaxe des règles: https://www.gnu.org/software/make/manual/make.html#Rule-Syntax

VirtualVDX
la source
obj-m + = bonjour.o tous: </t> make -C / lib / modules / $ (shell uname -r) / build M = $ (PWD) modules clean: make -C / lib / modules / $ ( shell uname -r) / build M = $ (PWD) clean
Narendra Jaggi
le fichier ci-dessus est-il un fichier valide?
Narendra Jaggi
Dans le contexte des makefiles parent-enfant, l'erreur «Rien à faire pour tous» peut parfois être causée par des cibles enfants marquées de manière incorrecte déclarées .PHONY dans le Makefile parent.
donhector
J'avais all : src/server/mod_wsgi.la, ce que j'ai changé all : </t> src/server/mod_wsgi.la. J'obtiens maintenant l'erreur: make: execvp: src/server/mod_wsgi.la: Permission denied Makefile:29: recipe for target 'all' failed make: *** [all] Error 127après sudo make. De l'aide?
Mooncrater
@Mooncrater Voir gnu.org/software/make/manual/make.html#Rule-Syntax . Voici: Les lignes de recette commencent par un caractère de tabulation (ou le premier caractère de la valeur de la variable .RECIPEPREFIX; voir Variables spéciales). La première ligne de recette peut apparaître sur la ligne après les prérequis, avec un caractère de tabulation, ou peut apparaître sur la même ligne, avec un point-virgule. Dans tous les cas, l'effet est le même. Ainsi, votre condition préalable est simplement devenue la recette. Vous n'avez pas besoin d'onglet dans ce cas.
VirtualVDX
31

Supprimez le hellofichier de votre dossier et réessayez.

La allcible dépend de la hellocible. La hellocible essaie d'abord de trouver le fichier correspondant dans le système de fichiers. S'il le trouve et qu'il est à jour avec les fichiers dépendants, il n'y a rien à faire.

weekens
la source
obj-m + = bonjour.o tous: </t> make -C / lib / modules / $ (shell uname -r) / build M = $ (PWD) modules clean: make -C / lib / modules / $ ( shell uname -r) / build M = $ (PWD) clean
Narendra Jaggi
est-ce que celui ci-dessus est un fichier make valide?
Narendra Jaggi
21

Quand vous donnez juste make, cela crée la première règle de votre makefile, c'est-à-dire "all". Vous avez spécifié que "tout" dépend de "hello", qui dépend de main.o, factorial.o et hello.o. Donc 'make' essaie de voir si ces fichiers sont présents.

S'ils sont présents, 'make' voit si leurs dépendances, par exemple main.o a une dépendance main.c, ont changé. S'ils ont changé, faites-les reconstruire, sinon ignore la règle. De même, il continue récursivement à construire les fichiers qui ont changé et exécute finalement la commande la plus élevée, "all" dans votre cas pour vous donner un exécutable, "bonjour" dans votre cas.

S'ils ne sont pas présents, faites tout construire à l'aveugle selon la règle.

Pour en venir à votre problème, ce n'est pas une erreur, mais «make» signifie que chaque dépendance de votre makefile est à jour et qu'il n'a pas besoin de faire quoi que ce soit!

Chethan Ravindranath
la source
16

Make se comporte correctement. helloexiste déjà et n'est pas plus ancien que les .cfichiers, il n'y a donc plus de travail à faire. Il existe quatre scénarios dans lesquels make devra (re) construire:

  • Si vous modifiez l'un de vos .cfichiers, il sera plus récent que hello, puis il devra se reconstruire lorsque vous exécuterez make.
  • Si vous supprimez hello, alors il devra évidemment le reconstruire
  • Vous pouvez forcer make à tout reconstruire avec l' -Boption.make -B all
  • make clean allsupprimera helloet nécessitera une reconstruction. (Je vous suggère de regarder le commentaire de @ Mat surrm -f *.o hello
Aaron McDaid
la source
4

Je pense que vous avez manqué un onglet en 9e ligne. La ligne qui suit tout: bonjour doit être un onglet vide. Assurez-vous que vous avez un onglet vide sur la 9ème ligne. Cela fera comprendre à l'interpréteur que vous voulez utiliser la recette par défaut pour makefile.

Technicien
la source
4

Ce n'est pas une erreur; la commande make dans unix fonctionne en fonction des horodatages. Par exemple, si vous avez apporté certaines modifications factorial.cppet compilez en utilisant, makealors make affiche les informations indiquant que seule la cc -o factorial.cppcommande est exécutée. La prochaine fois, si vous exécutez la même commande, c'est- makeà- dire sans apporter de modifications à aucun fichier avec une .cppextension, le compilateur dit que le fichier de sortie est à jour. Le compilateur donne ces informations jusqu'à ce que nous apportions certaines modifications à tout file.cpp.

L'avantage de l ' makefileest qu'il réduit le temps de recompilation en compilant les seuls fichiers modifiés et en utilisant .odirectement les fichiers object ( ) des fichiers non modifiés.

muneshwar
la source
0

Je suis arrivé à cette erreur particulière et difficile à déboguer par une voie différente. Mon problème a fini par être que j'utilisais une règle de modèle dans une étape de construction lorsque la cible et la dépendance se trouvaient dans des répertoires distincts. Quelque chose comme ça:

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

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

J'avais plusieurs dépendances configurées de cette façon et j'essayais d'utiliser une recette de modèle pour toutes. Clairement, une seule substitution pour «%» ne fonctionnera pas ici. J'ai fait des règles explicites pour chaque dépendance, et je me suis retrouvé parmi les chiots et les licornes!

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

J'espère que cela aide quelqu'un!

sfaleron
la source