Was ist das Gegenteil von 'make install', dh wie deinstalliert man eine Bibliothek unter Linux?


396

Während dem Rennen

./configure --prefix=/mingw 

auf einem MinGW / MSYS-System für eine Bibliothek, die ich zuvor ausgeführt hatte

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

Ich bin auf diese Nachricht gestoßen:

WARNUNG: Eine Version des Vamp Plugin SDK ist bereits installiert. Erwarten Sie Sorgen und Sorgen, wenn Sie eine neue Version installieren, ohne zuerst die alte zu entfernen. (Auch weiterhin)

Das hatte mich beunruhigt. Was ist das Gegenteil von 'make install', dh wie wird eine Bibliothek unter Linux deinstalliert? Wird "sauber machen" die Arbeit erledigen, oder sind andere Schritte erforderlich?



1
Ähnliche Antworten finden Sie unter askubuntu.com/questions/87111/… . Die Hauptlösung scheint derzeit zu sein, sudo make uninstallwenn die Installationskonfigurationsdateien noch verfügbar sind, wenn nicht, aber keine anderen offensichtlichen Lösungen, abgesehen von der Deinstallation mit dem Systempaketverwaltungsdienstprogramm, wenn es mit "checkinstall" installiert wurde " Nützlichkeit.
Edward

7
Nach dem Laufen musste make installich sie nie make uninstallentfernen. Ich habe immer verwendetxargs rm < install_manifest.txt
John Strood

Antworten:


508

make cleanEntfernt alle Zwischen- oder Ausgabedateien aus Ihrem Quell- / Build-Baum. Dies betrifft jedoch nur den Quell- / Build-Baum. Der Rest des Dateisystems wird nicht berührt, und zuvor installierte Software wird nicht entfernt.

Wenn Sie Glück haben, make uninstallfunktioniert das Laufen . Es liegt jedoch an den Autoren der Bibliothek, dies bereitzustellen. Einige Autoren geben ein uninstallZiel an, andere nicht.

Wenn Sie kein Glück haben, müssen Sie es manuell deinstallieren. Das Ausführen make -n installkann hilfreich sein, da es die Schritte anzeigt, die die Software zur Installation selbst ausführen würde, aber eigentlich nichts unternimmt. Sie können diese Schritte dann manuell umkehren.


10
+1; Achten Sie auf Dateien, die möglicherweise auch von anderen Paketen installiert wurden. Durch einfaches Löschen dieser Dateien (eine Interpretation von "Manuelles Umkehren dieser Schritte") können die anderen Pakete beschädigt werden. Dies ist (einer von vielen Gründen), warum Paketmanager erfunden wurden.
Merlyn Morgan-Graham

3
Dies ist nur möglich, wenn Sie das gleiche konfigurierte und kompilierte Build-Verzeichnis beibehalten, oder? daher nicht sehr nützlich, da die meisten Leute es nach der Installation löschen würden. Er möchte Dinge deinstallieren, unabhängig davon, ob er den Build-Ordner beibehalten hat und ob das Paket für eine Make-Deinstallationsoption korrekt konfiguriert wurde. Klarstellung: Was er tun möchte, ist, eine Art Verwaltung für Pakete zu ermöglichen, die für Dinge funktioniert, die er selbst zusammengestellt hat.
Nisse

360

Wenn sudo make uninstallnicht verfügbar:

In einem System , Debian basiert, anstelle von (oder nach dem *) tun make installSie ausführen können , sudo checkinstalleine machen .debDatei , die automatisch installiert wird. Sie können es dann mit dem Systempaket-Manager (z. B. apt/ synaptic/ aptitude/ dpkg) entfernen . Checkinstall unterstützt auch das Erstellen anderer Pakettypen, z. B. RPM.

Siehe auch http://community.linuxmint.com/tutorial/view/162 und einige grundlegende Checkinstall-Verwendungs- und Debian-Checkinstall-Pakete .


*: Wenn Sie dies nach der Installation mit lesen, können make installSie trotzdem die obigen Anweisungen befolgen und anschließend eine dpkg -r $PACKAGE_NAME_YOU_CHOSENausführen.


53
Diese Antwort ist ein Beweis dafür, dass die besten Antworten oft nicht viele positive Stimmen erhalten. Vielen Dank! Ich wollte schon lange wissen, wie das geht. Ich zögere immer, eine "make install" durchzuführen, da ich weiß, dass das Entfernen mit ziemlicher Sicherheit schmerzhaft sein wird.
Doug65536

1
Das LFS-Buch enthält auch einige Informationen zu Paketverwaltungssystemen, da Sie es selbst einrichten müssen. Die Informationen dort sollten hilfreich sein, damit solche Dinge besser funktionieren (sauberer, allgemeiner). Es gibt Skripte, die einfach abhören, was installiert wird, und dann ein Skript erstellen, das beim Start alle diese Dateien oder ähnliches löscht.
Nisse

13
Dies funktionierte wunderbar für mich, obwohl ich bereits make installvor der Verwendung gelaufen war checkinstall.
LukeGT

9
Installieren Sie das Paket, checkinstalldamit diese hervorragende Antwort funktioniert.
Quimnuss

1
Ähnlich wie der Benutzer "LukeGT" kommentierte, können die Installationskonfigurationsdateien, wenn sie nicht verfügbar sind, aber die Installationsdateien, kompiliert und installiert werden. checkinstallWenn die neue Kompilierung mit denselben Einstellungen wie die alte durchgeführt wird, wird das installierte Paket deinstalliert mit checkinstallsollte die zuvor installierten Dateien entfernen.
Edward

62

Wenn Sie eine manifestDatei haben, in der alle Dateien aufgelistet sind, die mit installiert wurden make install, können Sie diesen Befehl ausführen, den ich aus einer anderen Antwort habe:

cat install_manifest.txt | xargs echo rm | sh

Wenn Sie haben sudo make install, müssen Sie ein Sudo zu Ihrer Deinstallation hinzufügen:

cat install_manifest.txt | xargs echo sudo rm | sh

4
Ich bin überrascht zu sehen, dass dies keine positiven Stimmen bekommen hat. Dies funktionierte, um die Dateien aus dem System zu entfernen, wenn keine anderen Optionen funktionierten. In meinem Fall konnte checkinstall keine Deb erstellen, da die Version des Programms nicht mit einer Nummer begann und daher nicht erstellt wurde. Das hat gut funktioniert.
DWils

3
@ DWils Ich denke, es hat keine weiteren Upvotes erhalten, weil es ziemlich gefährlich ist. Zusätzlich xargs echo rm | sh? Es liegt auf der Hand, dass jeder, der dies vorschlug, nicht besonders erfahren oder mit der Verwendung der Shell vertraut ist.
3.

4
(Als Referenz werden alle Zeichen in Dateinamen, die von der Shell interpretiert werden, gesperrt (und dann werden Schurken ausgeführt!). Außerdem werden alle Arten von Shell-Erweiterungen ausgeführt. Stellen Sie sich vor, was passiert, wenn das install_manifest.txtein Sternchen enthält ... rm *wird in eine Shell geleitet.) Aus diesem Grund Downvoted.
3.

@fstd ganz richtig. Wie üblich muss diese Art der Antwort sorgfältig verwendet werden. Überprüfen Sie die Manifestdatei, bevor Sie diesen Befehl ausführen. Aber wenn Sie die Shell verwenden, wissen Sie vermutlich, was Sie tun.
drei

Können Sie die Umstände beschreiben, unter denen eine install_manifest.txtExistenz zu erwarten ist?
Einpoklum

28

Abhängig davon, wie gut die Magie von makefile / configure script / autofoo des betreffenden Programms ist, kann Folgendes Ihr Problem lösen:

make uninstall

Das Problem ist, dass Sie dies im Quellbaum der installierten Version und mit genau der Konfiguration ausführen sollten, die Sie für die Installation verwendet haben.


19

So deinstallieren Sie nach "make install"

Methode 1 (Deinstallation durchführen)

Schritt 1: Sie müssen diesen Schritt nur ausführen, wenn Sie das Build-Verzeichnis auf irgendeine Weise gelöscht / geändert haben : Laden Sie die Installation herunter und führen Sie sie nach genau dem gleichen Verfahren wie zuvor durch.

Schritt 2: Versuchen Sie, deinstallieren zu lassen.

cd $SOURCE_DIR 
sudo make uninstall

Wenn dies gelingt, sind Sie fertig. Wenn Sie paranoid sind, können Sie auch die Schritte von "Methode 3" ausführen, um sicherzustellen make uninstall, dass keine Dateien übersehen wurden.

Methode 2 (checkinstall - nur für Debian-basierte Systeme)

Übersicht über den Prozess

In Debian-basierten Systemen (z. B. Ubuntu) können Sie .debmit einem Tool namens sehr einfach ein Paket erstellen checkinstall. Anschließend installieren Sie das .deb-Paket (dadurch wird Ihrem Debian-System klar, dass alle Teile Ihres Pakets tatsächlich installiert wurden) und deinstallieren es schließlich, damit Ihr Paketmanager Ihr System ordnungsgemäß bereinigt.

Schritt für Schritt

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

An dieser Stelle checkinstallwerden Sie zur Eingabe eines Paketnamens aufgefordert. Geben Sie etwas Beschreibendes ein und notieren Sie es, da Sie es in einer Minute verwenden werden. Außerdem werden einige weitere Daten angefordert, die Sie ignorieren können. Wenn es sich darüber beschwert, dass die Version nicht akzeptabel war, geben Sie einfach etwas Vernünftiges ein 1.0. Wenn es abgeschlossen ist, können Sie installieren und schließlich deinstallieren:

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

Methode 3 (install_manifest.txt)

Wenn eine Datei install_manifest.txtin Ihrem Quellverzeichnis vorhanden ist, sollte sie die Dateinamen jeder einzelnen Datei enthalten, die von der Installation erstellt wurde.

Überprüfen Sie also zuerst die Liste der Dateien und ihre Mod-Zeit:

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

Sie sollten keine Fehler erhalten und die Mod-Zeiten der aufgelisteten Dateien sollten auf oder nach der Installationszeit sein. Wenn alles in Ordnung ist, können Sie sie auf einmal löschen:

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

Benutzer Merlyn Morgan-Graham hat jedoch einen ernsthaften Hinweis bezüglich dieser Methode, den Sie beachten sollten (hier wörtlich kopiert): "Achten Sie auf Dateien, die möglicherweise auch von anderen Paketen installiert wurden. Löschen Sie diese Dateien einfach [...] brechen Sie die anderen Pakete. " . Aus diesem Grund haben wir das Verzeichnis erstellt deleted-by-uninstallund Dateien dorthin verschoben, anstatt sie zu löschen.


99% dieses Beitrags waren in anderen Antworten vorhanden. Ich habe gerade alles Nützliche in einer (hoffentlich) leicht verständlichen Anleitung gesammelt und versucht, wichtigen Details (wie dem Zitieren von xarg-Argumenten und dem Speichern von gelöschten Dateien) besondere Aufmerksamkeit zu widmen.


Methode 2 hat bei mir funktioniert!
Aizzaac

10

make clean Im Allgemeinen werden nur erstellte Dateien im Verzeichnis bereinigt, das den Quellcode selbst enthält, und es wird selten eine installierte Software berührt.

Makefiles enthalten im Allgemeinen kein Ziel für die Deinstallation - normalerweise müssen Sie dies selbst tun, indem Sie die Dateien aus dem Verzeichnis entfernen, in dem sie installiert wurden. Zum Beispiel gebaut , wenn Sie ein Programm und installiert es (mit make install) in /usr/local, würden Sie wollen , schauen durch /usr/local/bin, /usr/local/libexec, /usr/local/share/manusw., und entfernen Sie die unerwünschten Dateien. Manchmal enthält ein Makefile ein uninstallZiel, aber nicht immer.

Natürlich installieren Sie normalerweise auf einem Linux-System Software mithilfe eines Paketmanagers , mit dem Software "automatisch" deinstalliert werden kann.


8

Das Dienstprogramm "stow" wurde entwickelt, um dieses Problem zu lösen: http://www.gnu.org/software/stow/


5
Wie würde man vorgehen stow, um dieses Problem zu lösen?
3D1T0R

Das Stow-Dienstprogramm empfiehlt Ihnen, jede Version an einem separaten Speicherort zu installieren, damit Sie mehrere Versionen auf demselben Computer verwalten können. Wenn Sie dies tun, kann die Deinstallation so einfach sein wie das Löschen des gesamten Installationsverzeichnisses.
Bruce Adams

6

Es gibt leider keinen Standard, dies ist eine der Gefahren bei der Installation von der Quelle. Einige Makefiles enthalten also eine "Deinstallation"

make uninstall

aus dem Quellverzeichnis kann funktionieren. Andernfalls kann es darum gehen, alles, was make installgetan wurde, manuell rückgängig zu machen .

make clean Bereinigt normalerweise nur das Quellverzeichnis - entfernt generierte / kompilierte Dateien und dergleichen, wahrscheinlich nicht das, wonach Sie suchen.


0

Ich kenne nur wenige Pakete, die "make deinstallieren" unterstützen, aber viele weitere, die make install DESTDIR = xxx "für inszenierte Installationen unterstützen.

Sie können dies verwenden, um ein Paket zu erstellen, das Sie installieren, anstatt es direkt von der Quelle zu installieren. Ich hatte kein Glück mit checkinstall, aber fpm funktioniert sehr gut.

Dies kann Ihnen auch dabei helfen, ein zuvor mit make install installiertes Paket zu entfernen . Sie erzwingen einfach die Installation Ihres erstellten Pakets über das make installierte und deinstallieren es dann.

Zum Beispiel habe ich dies kürzlich verwendet, um mich mit protobuf-3.3.0 zu befassen. Auf 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 you@youraddress.com \
 --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      

Wenn möglich, bevorzugen Sie Yum gegenüber RPM.

Auf 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

Ziehen Sie es vor, dpkg zu verwenden, wo Sie können.

Ich habe auch gepostet diese Antwort hier


0

Makekann Ihnen sagen, was es weiß und was es tun wird. Angenommen, Sie haben ein "Installations" -Ziel, das Befehle wie die folgenden ausführt:

cp <filelist> <destdir>/

Fügen Sie in Ihren allgemeinen Regeln Folgendes hinzu:

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

Ein ähnlicher Trick kann ein Generikum machen make clean.


0

Präambel

unten kann funktionieren oder nicht, dies ist alles so wie es ist, Sie und nur Sie sind verantwortliche Person im Falle von Schäden, Datenverlust und so weiter. Aber ich hoffe, es läuft reibungslos!

Zum Rückgängigmachen make installwürde ich Folgendes tun (und ich tat es):

Idee: Überprüfen Sie, welches Skript installiert ist, und machen Sie dies mit einem einfachen Bash-Skript rückgängig.

  1. Konfigurieren Sie Ihr Build-Verzeichnis neu, um es in einem benutzerdefinierten Verzeichnis zu installieren. Normalerweise mache ich das : --prefix=$PWD/install. Für CMake können Sie in Ihr Build-Verzeichnis wechseln, CMakeCache.txt öffnen und den Wert CMAKE_INSTALL_PREFIX korrigieren.
  2. Installieren Sie das Projekt in einem benutzerdefinierten Verzeichnis (führen Sie es einfach make installerneut aus).
  3. Nun gehen wir von der Annahme aus, dass das make installSkript in ein benutzerdefiniertes Verzeichnis installiert wird, genau den Inhalt, den Sie (normalerweise /usr/local) von einem anderen Ort entfernen möchten . Wir brauchen also ein Skript. 3.1. Das Skript sollte das benutzerdefinierte Verzeichnis mit dem Verzeichnis vergleichen, das Sie bereinigen möchten. Ich benutze das:

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. Führen Sie jetzt einfach dieses Skript aus (es wird trocken laufen)

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

Beispiel: Sie möchten / usr / local nicht bereinigen, und Ihr benutzerdefiniertes Installationsverzeichnis lautet /user/me/llvm.build/install

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

3.3. Überprüfen Sie das Protokoll sorgfältig. Wenn Befehle für Sie gut sind, kommentieren Sie es aus rm $RM_DIR/$fnund führen Sie es erneut aus. Aber hör auf! Haben Sie wirklich sorgfältig geprüft? Kann nochmal überprüft werden?

Quelle zu Anweisungen: https://dyatkovskiy.com/2019/11/26/anti-make-install/

Viel Glück!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.