Comment «faire» que l'application connaisse la cible par défaut à construire si aucune cible n'est spécifiée?

188

La plupart des applications Linux sont compilées avec:

make
make install clean

Comme je l'ai compris, make prend les noms des cibles de construction comme arguments. Il en installva de même pour une cible qui copie certains fichiers, puis cleanune cible qui supprime les fichiers temporaires.

Mais quelle cible makeconstruira si aucun argument n'est spécifié (par exemple la première commande dans mon exemple)?

grigoryvp
la source

Réponses:

233

Par défaut, il commence par traiter la première cible qui ne commence pas par un .aka l'objectif par défaut ; pour ce faire, il devra peut-être traiter d'autres cibles, en particulier celles dont dépend la première cible.

Le manuel GNU Make couvre tout cela, et est une lecture étonnamment facile et informative.

Marcel Gosselin
la source
61
L'appel de la première cible alln'est qu'une convention.
Tobu
1
Il est utile de les exécuter séparément si vous installez pour d'autres utilisateurs, car il vous suffit ensuite d'exécuter make installin sudo, plutôt que la version entière.
Scott Wales le
2
Pour info, l'entrée man par défaut pour make ne fait aucune mention de ce qui se passe lorsque vous ne spécifiez pas d'objectif.
Sekm
2
Si le manuel de GNU make couvre ce sujet, pourquoi cette question a-t-elle été posée? Le manuel est excellent pour documenter comment écrire des règles, mais ne fait aucune mention sur la façon d'écrire un Makefile.
Nick
1
Je regarde un fichier make qui includeest un autre makefile, dont la première cible est %.o : %.cpp. Donc, la cible par défaut est ... de créer tous les fichiers .cpp?
Qwertie
178

Pour épargner aux autres quelques secondes et leur éviter d'avoir à lire le manuel, voici la réponse courte. Ajoutez ceci en haut de votre fichier make:

.DEFAULT_GOAL := mytarget

mytarget sera désormais la cible exécutée si "make" est exécuté et qu'aucune cible n'est spécifiée.

Si vous avez une ancienne version de make (<= 3.80), cela ne fonctionnera pas. Si tel est le cas, vous pouvez faire ce que mentionne anon, ajoutez simplement ceci en haut de votre fichier make:

.PHONY: default
default: mytarget ;

Références: https://www.gnu.org/software/make/manual/html_node/How-Make-Works.html

Samuel
la source
1
@nathan Cela fait de mytarget la cible par défaut si quelqu'un exécute "make" sans aucun paramètre.
Samuel
1
Notez que .DEFAULT_GOAL ne semble pas être pris en charge dans GNU make v3.80, et je suppose également que les versions antérieures (la v3.81 le prend en charge). Si vous utilisez une ancienne version de make, vous devrez vous assurer que votre cible par défaut est la première / la plus haute cible de votre fichier make.
Samuel
4
"... pour leur éviter d'avoir à lire le manuel" est l'un des points de SO: des réponses rapides à des questions qui, autrement, prendraient un certain temps à creuser dans la documentation ancienne.
WattsInABox
1
"Ajoutez ceci en haut de votre fichier de création": L'ajout en haut ne semble pas être une obligation.
Aman Deep Gautam
2
Cela devrait être la bonne réponse. Dans ce cas, des gains explicites sur implicites.
Sion le
34

GNU Make vous permet également de spécifier la cible de création par défaut en utilisant une variable spéciale appelée .DEFAULT_GOAL. Vous pouvez même annuler la définition de cette variable au milieu du Makefile, ce qui fait que la prochaine cible du fichier devient la cible par défaut.

Réf: Le manuel Gnu Make - Variables spéciales

Sandip Bhattacharya
la source