web-dev-qa-db-fra.com

différence entre `make clean` et` make distclean`

J'ai installé ffmpeg à partir de sources avec l'aide de cette page. https://trac.ffmpeg.org/wiki/CentosCompilationGuide

J'ai remarqué que la plupart de ce didacticiel appelle make distclean après make install. Mais seul libvpx appelle make clean après l’installation.

Selon ce document, http://www.gnu.org/software/automake/manual/automake.html#Cleanmake clean supprime tous les fichiers créés par make , et make distclean supprime tous les fichiers que ./configure a créés.

rendre propre

Efface de l’arbre de compilation les fichiers créés par make all.

faire distclean

En outre, effacez tout ce que vous avez créé ./configure.

Je comprends que make distclean est appelé pour la prochaine installation, mais je ne comprends pas pourquoi make clean est appelé après l’installation.

Le ffmpeg installé fonctionne sans problème. J'ai donc posé cette question parce que je veux seulement améliorer mes connaissances sur Linux. Il serait très utile que quelqu'un me donne une explication à ce sujet.

25
ironsand

Le paramètre utilisé après make dépend uniquement du ou des développeurs qui ont écrit Makefile. La documentation à laquelle vous faites référence par la suite, Autotools, n’est qu’un des nombreux moyens de créer une Makefile.

La norme typique, make clean, supprime tous les fichiers intermédiaires, et make distclean rend l’arborescence telle qu’elle était lorsqu’elle était non tarée (ou quelque chose de très proche), y compris la suppression de toute sortie de script de configuration. C’est ainsi que fonctionne le noyau Linux.

En d'autres termes, cela dépend totalement des développeurs pour chacune de ces bibliothèques, et c'est pourquoi parfois sa clean et d'autres fois c'est distclean. En passant, vous n'avez pas besoin d'exécuter clean/distclean - je suppose qu'ils vous l'ont exécuté simplement pour économiser de l'espace disque. make install copie généralement les fichiers dans le répertoire de destination (là encore, cela dépend des développeurs) - des emplacements tels que /usr/lib ou /usr/bin (également déterminés par le script configure, s'il s'agit d'un système de génération Autotools)

Ces nuances sont la principale raison pour laquelle les gens utilisent des systèmes de gestion de paquets comme les paquets RPM ou Debian.

27
EdH

À ma connaissance, il s’agit simplement d’espace disque sécurisé. Après avoir compilé un programme, vous aurez beaucoup de fichiers, par exemple les fichiers objet qui ne sont plus nécessaires, car ils sont liés entre eux dans les fichiers binaires. Tous peuvent être recréés en passant à nouveau du temps CPU.

Prenons cet exemple avec le code ffmpeg actuel:

  • après le clonage du repo git, la source prend 53 160 Ko
  • après la configuration, il est de 53 632 Ko
  • après compilation, nous avons plus de 10 fois la valeur initiale: 673 668 kB
  • make clean réduit cela à 53 636 ko
  • et finalement après make distclean nous sommes presque au niveau juste après le clonage: 53 188 kB
6
mpy

Pourquoi l'étape libvpx utilise make clean au lieu de make distclean

Au moment de la rédaction du guide, libvpx n'avait pas de règle dans sa Makefile pour la cible distclean, donc clean a été utilisé à la place.

Pourquoi make (dist)clean est inclus après make install

make distclean/make clean est inclus après chaque make install simplement par mesure de précaution afin de fournir une "table rase" aux utilisateurs qui reviennent en arrière, modifient les options de configuration et recompilent (ce qui s’est produit plus souvent que prévu).

Dans une version précédente du guide de compilation, sans le make distclean préventif, l'un de ces utilisateurs rencontrait parfois des résultats inattendus.

Que faire si make distclean/make clean donne une erreur?

Comme ça:

Makefile:198: Makefile: No such file or directory
make: *** No rule to make target '/tests/Makefile'.  Stop.

ou ca:

make: *** No rule to make target 'distclean'.  Stop.

Ignore le. Cela signifie simplement que vous avez probablement exécuté make distclean deux fois, ce qui est inoffensif.

2
llogan