Quel est le contraire de «make install», c'est-à-dire comment désinstaller une bibliothèque sous Linux?

396

En courant

./configure --prefix=/mingw 

sur un système MinGW / MSYS pour une bibliothèque que j'avais précédemment exécutée

'./configure --prefix=/mingw && make && make install' 

Je suis tombé sur ce message:

AVERTISSEMENT: une version du SDK du plugin Vamp est déjà installée. Attendez-vous à des soucis et des chagrins si vous installez une nouvelle version sans supprimer l'ancienne au préalable. (Continue)

Cela m'inquiétait. Quel est le contraire de «make install», c'est-à-dire comment une bibliothèque est-elle désinstallée sous Linux? Est-ce que «nettoyer» fera le travail, ou y a-t-il d'autres étapes impliquées?

Alex Riley
la source
serverfault.com/questions/422237/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
Voir askubuntu.com/questions/87111/… pour des réponses similaires, la solution principale semble actuellement être sudo make uninstallsi les fichiers de configuration d'installation sont toujours disponibles mais aucune autre solution évidente sinon, à part la désinstallation avec l'utilitaire de gestion de package système s'il est installé avec "checkinstall "utilité.
Edward
7
Après avoir couru, make installje n'ai jamais eu besoin make uninstallde les supprimer. J'ai toujours utiliséxargs rm < install_manifest.txt
John Strood

Réponses:

508

make cleansupprime tous les fichiers intermédiaires ou de sortie de votre arbre source / build. Cependant, cela n'affecte que l'arborescence source / build; il ne touche pas le reste du système de fichiers et ne supprimera donc pas les logiciels précédemment installés.

Si vous avez de la chance, courir make uninstallfonctionnera. C'est aux auteurs de la bibliothèque de fournir cela, cependant; certains auteurs fournissent une uninstallcible, d'autres non.

Si vous n'êtes pas chanceux, vous devrez le désinstaller manuellement. L'exécution make -n installpeut être utile, car elle montrera les étapes que le logiciel prendrait pour s'installer mais ne fera rien. Vous pouvez ensuite inverser manuellement ces étapes.

Josh Kelley
la source
10
+1; Attention aux fichiers qui pourraient également avoir été installés par d'autres packages. La simple suppression de ces fichiers (une interprétation de «l'inversion manuelle de ces étapes») pourrait casser les autres packages. C'est (l'une des nombreuses raisons) pour laquelle les gestionnaires de paquets ont été inventés.
Merlyn Morgan-Graham
3
cela n'est possible que si vous conservez le même répertoire de construction configuré et compilé, n'est-ce pas? donc pas très utile car la plupart des gens le supprimeraient après l'installation. Il souhaite désinstaller des éléments, qu'il conserve le dossier de génération et que le package soit correctement configuré pour une option de désinstallation de make. Clarification: ce qu'il veut faire, c'est activer une sorte de gestion des packages qui fonctionne pour les choses qu'il a compilées lui-même.
Nisse
360

Si sudo make uninstalln'est pas disponible:

Dans un système basé sur Debian, au lieu de (ou après *), make installvous pouvez exécuter sudo checkinstallpour créer un .debfichier qui sera automatiquement installé. Vous pouvez ensuite le supprimer à l'aide du gestionnaire de packages système (par exemple apt/ synaptic/ aptitude/ dpkg). Checkinstall prend également en charge la création d'autres types de packages, par exemple RPM.

Voir aussi http://community.linuxmint.com/tutorial/view/162 et une utilisation basique de checkinstall et un paquet debian checkinstall .


*: Si vous lisez ceci après avoir installé avec, make installvous pouvez toujours suivre les instructions ci-dessus et faire dpkg -r $PACKAGE_NAME_YOU_CHOSENensuite.

Nisse
la source
53
Cette réponse est la preuve que les meilleures réponses n'obtiennent souvent pas beaucoup de votes positifs. Merci! Je voulais savoir comment faire ça depuis longtemps. J'hésite toujours à faire un "make install" car je sais que ce sera très certainement pénible à supprimer.
doug65536
1
le livre LFS contient également des informations sur les systèmes de gestion des packages, puisque vous devez le configurer vous-même. Les informations devraient être utiles pour améliorer le fonctionnement de ce type de choses (plus propre, plus général). Il existe des scripts qui écoutent simplement ce qui est installé, puis créent un script qui, lorsqu'il est lancé, supprime tous ces fichiers, ou quelque chose comme ça.
Nisse
13
Cela a très bien fonctionné pour moi, même si j'avais déjà couru make installavant de l'utiliser à la checkinstallplace.
LukeGT
9
Installez le package checkinstallpour que cette excellente réponse fonctionne.
quimnuss
1
De manière similaire à ce que l'utilisateur "LukeGT" a commenté, si les fichiers de configuration d'installation ne sont pas disponibles mais que les fichiers d'installation le sont, ils peuvent être compilés et installés avec checkinstallet si la nouvelle compilation est faite avec les mêmes paramètres que l'ancien, désinstaller le package installé avec checkinstalldevrait supprimer les fichiers précédemment installés.
Edward
62

Si vous avez un manifestfichier qui répertorie tous les fichiers qui ont été installés avec make installvous pouvez exécuter cette commande que j'ai d'une autre réponse:

cat install_manifest.txt | xargs echo rm | sh

Si vous en avez, sudo make installvous devrez ajouter un sudo à votre désinstallation:

cat install_manifest.txt | xargs echo sudo rm | sh
Trois
la source
4
Je suis surpris de voir que cela n'a pas reçu de votes positifs. Cela a fonctionné pour supprimer les fichiers du système lorsqu'aucune autre option n'a fonctionné. Dans mon cas, checkinstall n'a pas pu créer de deb parce que la version du programme n'a pas commencé par un nombre et n'a donc pas été construite. Cela a bien fonctionné.
DWs
3
@DWils Je pense qu'il n'a pas reçu plus de votes positifs car il est assez dangereux. De plus xargs echo rm | sh,? Il est assez évident que celui qui a suggéré cela n'est pas particulièrement expérimenté ou compétent dans l'utilisation du shell.
2014
4
(pour référence, il écrira sur tous les caractères dans les noms de fichiers qui sont interprétés par le shell (et ensuite vous avez des rogue 'en cours d'exécution!), De plus, il fera toutes sortes d'expansion du shell. Imaginez ce qui se passe si le install_manifest.txtcontient un astérisque ... rm *sera canalisé dans un shell.) A voté pour cette raison.
fstd
@fstd a tout à fait raison. Comme d'habitude, ce type de réponse doit être utilisé avec prudence. Vérifiez le fichier manifeste avant d'exécuter cette commande. Mais si vous utilisez le shell, je suppose que vous savez ce que vous faites.
trois
Pouvez-vous décrire les circonstances dans lesquelles un install_manifest.txtpeut exister?
einpoklum
28

Selon la façon dont le makefile / configure script / autofoo magic du programme en question est le suivant, cela pourrait résoudre votre problème:

make uninstall

Le problème est que vous devez l'exécuter sur l'arborescence source de la version que vous avez installée et avec exactement la même configuration que celle utilisée pour l'installation.

Joachim Sauer
la source
19

Comment désinstaller après "installer"

Méthode n ° 1 (faire la désinstallation)

Etape 1: Vous ne devez suivre cette étape si vous avez supprimé / modifié le répertoire de construction de quelque façon: Téléchargez et make / make install en utilisant la exacte même procédure que vous avez fait avant.

Étape 2: essayez de faire la désinstallation.

cd $SOURCE_DIR 
sudo make uninstall

Si cela réussit, vous avez terminé. Si vous êtes paranoïaque, vous pouvez également essayer les étapes de la "Méthode # 3" pour vous assurer de make uninstallne manquer aucun fichier.

Méthode n ° 2 (checkinstall - uniquement pour les systèmes basés sur Debian)

Aperçu du processus

Dans les systèmes basés sur Debian (par exemple Ubuntu), vous pouvez créer un .debpaquet très facilement en utilisant un outil nommé checkinstall. Vous installez ensuite le paquet .deb (cela fera réaliser à votre système Debian que toutes les parties de votre paquet ont bien été installées) et enfin le désinstallez pour permettre à votre gestionnaire de paquets de nettoyer correctement votre système.

Pas à pas

sudo apt-get -y install checkinstall
cd $SOURCE_DIR 
sudo checkinstall

À ce stade checkinstall, vous demandera un nom de package. Entrez quelque chose d'un peu descriptif et notez-le car vous allez l'utiliser dans une minute. Il vous demandera également quelques données supplémentaires que vous pouvez ignorer. S'il se plaint que la version n'est pas acceptable, entrez simplement quelque chose de raisonnable 1.0. Une fois terminé, vous pouvez installer et enfin désinstaller:

sudo dpkg -i $PACKAGE_NAME_YOU_ENTERED 
sudo dpkg -r $PACKAGE_NAME_YOU_ENTERED

Méthode n ° 3 (install_manifest.txt)

Si un fichier install_manifest.txtexiste dans votre répertoire source, il doit contenir les noms de fichier de chaque fichier créé par l'installation.

Vérifiez donc d'abord la liste des fichiers et leur heure de modification:

cd $SOURCE_DIR 
sudo xargs -I{} stat -c "%z %n" "{}" < install_manifest.txt

Vous ne devriez obtenir aucune erreur et les heures de modification des fichiers répertoriés doivent être égales ou supérieures à l'heure d'installation. Si tout est OK, vous pouvez les supprimer en une seule fois:

cd $SOURCE_DIR 
mkdir deleted-by-uninstall
sudo xargs -I{} mv -t deleted-by-uninstall "{}" < install_manifest.txt

L'utilisateur Merlyn Morgan-Graham a cependant un avis sérieux concernant cette méthode que vous devez garder à l'esprit (copié ici textuellement): "Méfiez-vous des fichiers qui pourraient également avoir été installés par d'autres packages. La simple suppression de ces fichiers [...] pourrait casser les autres paquets. " . C'est la raison pour laquelle nous avons créé le deleted-by-uninstallrépertoire et déplacé les fichiers au lieu de les supprimer.


99% de ce poste existait dans d'autres réponses. Je viens de rassembler tout ce qui est utile dans un (espérons-le) facile à suivre et j'ai essayé d'accorder une attention supplémentaire aux détails importants (comme citer des arguments xarg et conserver des sauvegardes de fichiers supprimés).

ndemou
la source
La MÉTHODE 2 a fonctionné pour moi!
Aizzaac
10

make clean ne nettoie généralement que les fichiers construits dans le répertoire contenant le code source lui-même et touche rarement les logiciels installés.

Les makefiles ne contiennent généralement pas de cible pour la désinstallation - vous devez généralement le faire vous-même, en supprimant les fichiers du répertoire dans lequel ils ont été installés. Par exemple, si vous avez construit un programme et installé ( à l' aide make install) dans /usr/local, vous voudriez regarder à travers /usr/local/bin, /usr/local/libexec, /usr/local/share/man, etc., et supprimer les fichiers indésirables. Parfois, un Makefile inclut une uninstallcible, mais pas toujours.

Bien sûr, généralement sur un système Linux, vous installez un logiciel à l'aide d'un gestionnaire de packages , qui est capable de désinstaller le logiciel "automatiquement".

mipadi
la source
8

L'utilitaire "stow" a été conçu pour résoudre ce problème: http://www.gnu.org/software/stow/

jjw
la source
5
Comment utiliserait-on stowpour résoudre ce problème?
3D1T0R
L'utilitaire de stockage vous encourage à installer chaque version dans un emplacement distinct afin de pouvoir gérer plusieurs versions sur la même machine. Si vous procédez ainsi, la désinstallation peut être aussi simple que la suppression de tout le répertoire d'installation.
Bruce Adams
6

Il n'y a malheureusement pas de standard, c'est l'un des périls de l'installation depuis la source. Certains Makefiles incluront une "désinstallation", donc

make uninstall

à partir du répertoire source peut fonctionner. Sinon, il peut s'agir d'annuler manuellement quoi que ce soit make install.

make clean nettoie généralement le répertoire source - en supprimant les fichiers générés / compilés et autres, probablement pas ce que vous recherchez.

Brenton Alker
la source
0

Je connais quelques packages qui prennent en charge "make uninstall" mais beaucoup d'autres qui prennent en charge make install DESTDIR = xxx "pour les installations par étapes.

Vous pouvez l'utiliser pour créer un package que vous installez au lieu d'installer directement à partir de la source. Je n'ai pas eu de chance avec checkinstall mais fpm fonctionne très bien.

Cela peut également vous aider à supprimer un package précédemment installé à l'aide de make install . Vous forcez simplement l'installation de votre package intégré sur le make installé, puis le désinstallez.

Par exemple, je l'ai utilisé récemment pour gérer protobuf-3.3.0. Sur RHEL7:

make install DESTDIR=dest
cd dest
fpm -f -s dir -t rpm -n protobuf -v 3.3.0 \
 --vendor "You Not RedHat" \
 --license "Google?" \
 --description "protocol buffers" \
 --rpm-dist el7 \
 -m [email protected] \
 --url "http:/somewhere/where/you/get/the/package/oritssource" \
 --rpm-autoreqprov \
 usr

 sudo rpm -i -f protobuf-3.3.0-1.el7.x86_64.rpm
 sudo rpm -e protobuf-3.3.0      

Préférez yum à rpm si vous le pouvez.

Sur Debian9:

make install DESTDIR=dest
cd dest
fpm -f -s dir -t deb -n protobuf -v 3.3.0 \
-C `pwd` \
--prefix / \
--vendor "You Not Debian" \
--license "$(grep Copyright ../../LICENSE)" \
--description "$(cat README.adoc)" \
--deb-upstream-changelog ../../CHANGES.txt \
 --url "http:/somewhere/where/you/get/the/package/oritssource" \
 usr/local/bin \
 usr/local/lib \
 usr/local/include

 sudo apt install -f *.deb
 sudo apt-get remove protobuf

Préférez apt à dpkg où vous le pouvez.

J'ai également posté une réponse ici

Bruce Adams
la source
0

Makepeut vous dire ce qu'il sait et ce qu'il fera. Supposons que vous ayez une cible "install", qui exécute des commandes comme:

cp <filelist> <destdir>/

Dans vos règles génériques, ajoutez:

uninstall :; MAKEFLAGS= ${MAKE} -j1 -spinf $(word 1,${MAKEFILE_LIST}) install \
              | awk '/^cp /{dest=$NF; for (i=NF; --i>0;) {print dest"/"$i}}' \
              | xargs rm -f

Une astuce similaire peut faire un générique make clean.

Mischa
la source
0

Préambule

ci-dessous peut fonctionner ou non, tout est donné tel quel, vous et vous seul êtes la personne responsable en cas de dommages, de perte de données, etc. Mais j'espère que tout se passe bien!

Pour annuler, make installje ferais (et je l'ai fait) ceci:

Idée: vérifiez les installations de script et annulez-les avec un simple script bash.

  1. Reconfigurez votre répertoire de build pour l'installer dans un répertoire personnalisé. Je fais habituellement ceci:--prefix=$PWD/install . Pour CMake, vous pouvez aller dans votre répertoire de construction, ouvrir CMakeCache.txt et corriger la valeur CMAKE_INSTALL_PREFIX.
  2. Installez le projet dans un répertoire personnalisé (exécutez-le à make installnouveau).
  3. Nous supposons maintenant que le make installscript installe dans le répertoire personnalisé exactement le même contenu que vous souhaitez supprimer ailleurs (généralement /usr/local). Nous avons donc besoin d'un script. 3.1. Le script doit comparer le répertoire personnalisé avec le répertoire à nettoyer. J'utilise ceci:

anti-install.sh

RM_DIR=$1
PRESENT_DIR=$2

echo "Remove files from $RM_DIR, which are present in $PRESENT_DIR"

pushd $RM_DIR

for fn in `find . -iname '*'`; do
#  echo "Checking $PRESENT_DIR/$fn..."
  if test -f "$PRESENT_DIR/$fn"; then
    # First try this, and check whether things go plain
    echo "rm $RM_DIR/$fn"

    # Then uncomment this, (but, check twice it works good to you).
    # rm $RM_DIR/$fn
  fi
done

popd

3.2. Maintenant, exécutez simplement ce script (il fonctionnera à sec)

bash anti-install.sh <dir you want to clean> <custom installation dir>

Par exemple, vous ne voulez pas nettoyer / usr / local, et votre répertoire d'installation personnalisé est /user/me/llvm.build/install, alors ce serait

bash anti-install.sh /usr/local /user/me/llvm.build/install

3.3. Vérifiez soigneusement le journal, si les commandes vous conviennent, décommentez rm $RM_DIR/$fnet réexécutez-le. Mais arrêtez! Avez-vous vraiment vérifié attentivement? Peut-être vérifier à nouveau?

Source aux instructions: https://dyatkovskiy.com/2019/11/26/anti-make-install/

Bonne chance!

Stepan Dyatkovskiy
la source