hacer: No hay nada que hacer para 'todos'

97

Estoy pasando por un pgm por ejemplo para crear un archivo make.

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

Mi carpeta eg_make_creation contiene los siguientes archivos,

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'.

Ayúdame a comprender cómo compilar este programa.

Angus
fuente
12
Intente hacer un "limpiar" seguido de un "hacer todo"
Paul R
11
Eso no es un error, solo significa que helloestá actualizado. Cambie cleana rm -f *.o helloantes de que haga algo inesperado, luego ejecute make clean ally vea si funciona.
Mat
1
También debe agregar .phony: all clean, ya que ally cleanno son nombres de archivo.
Kerrek SB
3
No ponga la -c en su CFLAGS.
wildplasser

Respuestas:

121

A veces, el error "No hay nada que hacer para todos" puede ser causado por espacios antes del comando en la regla del archivo Make en lugar de la pestaña. Asegúrese de utilizar tabulaciones en lugar de espacios dentro de sus reglas.

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

en vez de

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

Consulte el manual de GNU make para ver la descripción de la sintaxis de la regla: https://www.gnu.org/software/make/manual/make.html#Rule-Syntax

VirtualVDX
fuente
obj-m + = hola.o todos: </t> make -C / lib / modules / $ (shell uname -r) / build M = $ (PWD) módulos limpios: make -C / lib / modules / $ ( shell uname -r) / build M = $ (PWD) clean
Narendra Jaggi
¿Es el archivo anterior un archivo válido?
Narendra Jaggi
En el contexto de los archivos MAKE padre-hijo, a veces el error "No se puede hacer nada para todos" puede deberse a que los objetivos secundarios se marcan incorrectamente como .PHONY en el archivo Makefile padre.
donhector
Yo tenía all : src/server/mod_wsgi.la, a lo que me cambié all : </t> src/server/mod_wsgi.la. Ahora aparece el error: make: execvp: src/server/mod_wsgi.la: Permission denied Makefile:29: recipe for target 'all' failed make: *** [all] Error 127after sudo make. ¿Alguna ayuda?
Mooncrater
@Mooncrater Consulte gnu.org/software/make/manual/make.html#Rule-Syntax . Aquí dice: Las líneas de la receta comienzan con un carácter de tabulación (o el primer carácter en el valor de la variable .RECIPEPREFIX; consulte Variables especiales). La primera línea de la receta puede aparecer en la línea después de los requisitos previos, con un carácter de tabulación, o puede aparecer en la misma línea, con un punto y coma. De cualquier manera, el efecto es el mismo. Entonces, su requisito previo simplemente se convirtió en la receta. En este caso, no necesita ninguna pestaña.
VirtualVDX
31

Eliminar el hello archivo de tu carpeta y vuelve a intentarlo.

El allobjetivo depende del helloobjetivo. El helloobjetivo primero intenta encontrar el archivo correspondiente en el sistema de archivos. Si lo encuentra y está actualizado con los archivos dependientes, no hay nada que hacer.

fines de semana
fuente
obj-m + = hola.o todos: </t> make -C / lib / modules / $ (shell uname -r) / build M = $ (PWD) módulos limpios: make -C / lib / modules / $ ( shell uname -r) / build M = $ (PWD) clean
Narendra Jaggi
¿El anterior es un archivo make válido?
Narendra Jaggi
21

Cuando simplemente da make, hace la primera regla en su archivo make, es decir, "todos". Ha especificado que "todos" depende de "hola", que depende de main.o, factorial.o y hola.o. Entonces 'make' intenta ver si esos archivos están presentes.

Si están presentes, 'make' ve si sus dependencias, por ejemplo, main.o tiene una dependencia main.c, han cambiado. Si han cambiado, haga las reconstrucciones; de lo contrario, se salta la regla. De manera similar, continúa construyendo de manera recursiva los archivos que han cambiado y finalmente ejecuta el comando más alto, "todos" en su caso para darle un ejecutable, 'hola' en su caso.

Si no están presentes, construye a ciegas todo según la regla.

Llegando a su problema, no es un error, pero 'make' dice que cada dependencia en su archivo MAKE está actualizada y no necesita hacer nada.

Chethan Ravindranath
fuente
16

Make se está comportando correctamente. helloya existe y no es más antiguo que los .carchivos, por lo que no hay más trabajo por hacer. Hay cuatro escenarios en los que make deberá (re) construirse:

  • Si modifica uno de sus .c archivos, será más reciente que hello, y luego tendrá que reconstruirse cuando ejecute make.
  • Si borras hello , obviamente tendrá que reconstruirlo
  • Puede forzar make para reconstruir todo con el -B opción.make -B all
  • make clean alleliminará helloy requerirá una reconstrucción. (Te sugiero que veas el comentario de @ Mat sobrerm -f *.o hello
Aaron McDaid
fuente
4

Creo que te perdiste una pestaña en la novena línea. La línea que sigue a todos: hola debe ser una pestaña en blanco. Asegúrese de tener una pestaña en blanco en la novena línea. Hará que el intérprete comprenda que desea utilizar la receta predeterminada para el archivo MAKE.

Techie
fuente
4

Eso no es un error; el comando make en Unix funciona según las marcas de tiempo. Es decir, digamos que si ha realizado ciertos cambios factorial.cppy compila utilizando make, make muestra la información de que solo cc -o factorial.cppse ejecuta el comando. La próxima vez, si ejecuta el mismo comando, es decir, makesin realizar ningún cambio en ningún archivo con .cppextensión, el compilador dice que el archivo de salida está actualizado. El compilador proporciona esta información hasta que realizamos ciertos cambios en alguno file.cpp.

La ventaja de makefilees que reduce el tiempo de recompilación compilando los únicos archivos que se modifican y utilizando los .oarchivos object ( ) de los archivos no modificados directamente.

Muneshwar
fuente
0

Llegué a este error peculiar y difícil de depurar a través de una ruta diferente. Mi problema terminó siendo que estaba usando una regla de patrón en un paso de compilación cuando el objetivo y la dependencia estaban ubicados en directorios distintos. Algo como esto:

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

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

Tenía varias dependencias configuradas de esta manera y estaba tratando de usar una receta de patrón para todas. Claramente, una sola sustitución de "%" no va a funcionar aquí. Hice reglas explícitas para cada dependencia, ¡y me encontré de nuevo entre los cachorros y los unicornios!

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

¡Espero que esto ayude a alguien!

sfaleron
fuente