¿Cómo la aplicación "make" conoce el objetivo predeterminado para construir si no se especifica un objetivo?


188

La mayoría de las aplicaciones de Linux se compilan con:

make
make install clean

Como lo entendí, make toma nombres de objetivos de compilación como argumentos. Entonces, installes un objetivo que copia algunos archivos y luego cleanes un objetivo que elimina los archivos temporales.

Pero, ¿qué destino se generará makesi no se especifican argumentos (por ejemplo, primer comando en mi ejemplo)?

Respuestas:


233

Por defecto, comienza procesando el primer objetivo que no comienza con un .aka el objetivo predeterminado ; para hacer eso, puede que tenga que procesar otros objetivos, específicamente, de los que depende el primer objetivo.

El GNU Make Manual cubre todo esto, y es una lectura sorprendentemente fácil e informativa.


61
Llamar al primer objetivo alles solo una convención.
— Tobu

1
Es útil ejecutarlos por separado si está instalando para otros usuarios, ya que solo necesita ejecutar make installin sudo, en lugar de toda la compilación.
— Scott Wales

2
Para su información, la entrada de hombre predeterminada para make no menciona lo que sucede cuando no especifica un objetivo ..
— Sekm

2
Si el manual de fabricación de GNU cubre estas cosas, ¿por qué se hizo esta pregunta? El manual es excelente para documentar cómo escribir reglas, pero no menciona cómo escribir un Makefile.
— Nick

1
Estoy mirando un archivo make que includees otro makefile, cuyo primer objetivo es %.o : %.cpp. Entonces, ¿el objetivo predeterminado es ... construir todos los archivos .cpp?
— Qwertie

178

Para salvar a otros unos segundos y evitar que tengan que leer el manual, aquí está la respuesta corta. Agregue esto a la parte superior de su archivo de creación:

.DEFAULT_GOAL := mytarget

mytarget ahora será el objetivo que se ejecuta si se ejecuta "make" y no se especifica ningún objetivo.

Si tiene una versión anterior de make (<= 3.80), esto no funcionará. Si este es el caso, puede hacer lo que anon menciona, simplemente agregue esto a la parte superior de su archivo make:

.PHONY: default
default: mytarget ;

Referencias: https://www.gnu.org/software/make/manual/html_node/How-Make-Works.html


1
@nathan Hace que mytarget sea el objetivo predeterminado si alguien ejecuta "make" sin ningún parámetro.
— Samuel

1
Tenga en cuenta que .DEFAULT_GOAL no parece ser compatible con GNU make v3.80, y supongo que las versiones anteriores también (v3.81 sí lo admite). Si está ejecutando una versión anterior de make, tendrá que asegurarse de que su objetivo predeterminado sea el primer / principal objetivo en su archivo make.
— Samuel

44
"... para evitar que tengan que leer el manual" es uno de los puntos de SO: respuestas rápidas a preguntas que de otro modo tomarían un tiempo en la documentación antigua.
— WattsInABox

1
"Agregue esto a la parte superior de su archivo de creación": Agregar a la parte superior no parece ser un requisito.
— Aman Deep Gautam

2
Esta debería ser la respuesta correcta. Explícito sobre triunfos implícitos en este caso.
— Sion

34

GNU Make también le permite especificar el destino de creación predeterminado utilizando una variable especial llamada .DEFAULT_GOAL. Incluso puede desarmar esta variable en el medio del Makefile, haciendo que el próximo objetivo en el archivo se convierta en el objetivo predeterminado.

Ref: The Gnu Make manual - Variables especiales

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.