¿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)?

grigoryvp
fuente

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.

Marcel Gosselin
fuente
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

Samuel
fuente
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

Sandip Bhattacharya
fuente