web-dev-qa-db-fra.com

make: rien à faire pour "tous"

Je vais par exemple à un pgm 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'.

S'il vous plaît, aidez-moi à comprendre pour compiler ce programme.

82
Angus

Parfois, une erreur "Rien à faire pour tous" peut être provoquée par des espaces avant la commande dans la règle de makefile au lieu de la tabulation. Assurez-vous 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 vous reporter au manuel GNU make pour la description de la syntaxe de la règle: https://www.gnu.org/software/make/manual/make.html#Rule-Syntax

98
VirtualVDX

Supprimez le fichier hello de votre dossier et réessayez.

La cible all dépend de la cible hello. La cible hello tente d’abord de rechercher 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.

27
weekens

Lorsque vous donnez simplement make, cela fait la première règle dans votre makefile, c’est-à-dire "tous". Vous avez spécifié que "tout" dépend de "hello", ce qui dépend de main.o, factorial.o et hello.o. Donc 'make' essaie de voir si ces fichiers sont présents.

Si elles sont présentes, "make" vérifie si leurs dépendances, par ex. main.o a une dépendance main.c, ont changé. S'ils ont changé, les reconstruit, sinon la règle est ignorée. De la même manière, il continue récursivement de construire les fichiers qui ont changé et exécute enfin la commande la plus haut, "tous" dans votre cas pour vous donner un exécutable, "bonjour" dans votre cas.

S'ils ne sont pas présents, make construit aveuglément tout sous la règle.

Venir à votre problème, ce n'est pas une erreur mais "make", c'est dire que chaque dépendance dans votre makefile est à jour et qu'il n'a pas besoin de faire quoi que ce soit!

18

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

  • Si vous modifiez l'un de vos fichiers .c, il sera plus récent que hello et devra être reconstruit lors de l'exécution de make.
  • Si vous supprimez hello, il devra évidemment le reconstruire
  • Vous pouvez forcer make à tout reconstruire avec l'option -B. make -B all
  • make clean all supprimera hello et nécessitera une reconstruction. (Je vous suggère de regarder le commentaire de @ Mat sur rm -f *.o hello
14
Aaron McDaid

Je pense que vous avez manqué un onglet à la 9ème ligne. La ligne suivante all: hello doit être un onglet vide. Assurez-vous que vous avez un onglet vide à la 9ème ligne. Cela fera comprendre à l'interprète que vous voulez utiliser la recette par défaut pour le fichier makefile.

4
Techie

Ce n’est pas une erreur si la commande make sous Unix fonctionne en fonction de l’horodatage, c’est-à-dire si vous avez apporté certaines modifications à factorial.cpp et si vous compilez avec make..then make indique que seul le ** cc -o factorial. La commande cpp ** est exécutée. La prochaine fois que vous exécutez la même commande, c’est-à-dire que vous apportez sans modifier aucun fichier avec une extension .cpp, le compilateur dit que le fichier de sortie est à jour ... le compilateur donne ces informations jusqu’à ce que nous procédions. certaines modifications à n'importe quel fichier.cpp. L'avantage du fichier make est qu'il réduit le temps de recompilation en compilant les seuls fichiers modifiés et en utilisant directement les fichiers objet (.o) des fichiers non modifiés ......

4
muneshwar

Je suis arrivé à cette erreur particulière, difficile à déboguer par un autre chemin. Mon problème était que j'utilisais une règle de modèle dans une étape de construction lorsque la cible et la dépendance étaient situées 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 va pas fonctionner ici. J'ai établi 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 ça aide quelqu'un!

0
sfaleron