Qual è l'opposto di "make install", ovvero come si disinstalla una libreria in Linux?


396

Mentre corro

./configure --prefix=/mingw 

su un sistema MinGW / MSYS per una libreria che avevo precedentemente eseguito

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

Mi sono imbattuto in questo messaggio:

ATTENZIONE: una versione dell'SDK del plug-in Vamp è già installata. Aspettati preoccupazioni e dolori se installi una nuova versione senza rimuovere prima quella precedente. (Continua)

Questo mi ha preoccupato. Qual è l'opposto di 'make install', ovvero come viene disinstallata una libreria in Linux? Farà il lavoro 'pulito' o ci sono altri passaggi?



1
Vedere askubuntu.com/questions/87111/… per risposte simili, la soluzione principale attualmente sembra essere sudo make uninstallse i file di configurazione dell'installazione sono ancora disponibili ma non ci sono altre soluzioni ovvie se non, a parte la disinstallazione con l'utilità di gestione dei pacchetti di sistema se installata con "checkinstall " utilità.
Edward,

7
Dopo l'esecuzione make installnon ho mai avuto bisogno make uninstalldi rimuoverli. Ho sempre usatoxargs rm < install_manifest.txt
John Strood il

Risposte:


508

make cleanrimuove qualsiasi file intermedio o di output dall'albero di origine / build. Tuttavia, influisce solo sull'albero sorgente / build; non tocca il resto del filesystem e quindi non rimuoverà il software precedentemente installato.

Se sei fortunato, la corsa make uninstallfunzionerà. Spetta agli autori della biblioteca fornire ciò, tuttavia; alcuni autori forniscono un uninstallobiettivo, altri no.

Se non sei fortunato, dovrai disinstallarlo manualmente. L'esecuzione make -n installpuò essere utile, poiché mostrerà i passaggi che il software dovrebbe prendere per installarsi, ma in realtà non farà nulla. È quindi possibile invertire manualmente questi passaggi.


10
+1; Fai attenzione ai file che potrebbero essere stati installati anche da altri pacchetti. La semplice eliminazione di questi file (un'interpretazione di "invertire manualmente questi passaggi") potrebbe interrompere gli altri pacchetti. Questo è (uno dei tanti motivi) per cui sono stati inventati i gestori di pacchetti.
Merlyn Morgan-Graham,

3
questo è possibile solo se si mantiene la stessa directory di build configurata e compilata, giusto? quindi non molto utile poiché la maggior parte delle persone lo eliminerebbe dopo l'installazione. Vuole disinstallare le cose indipendentemente dal fatto che abbia conservato la cartella build e indipendentemente dal fatto che il pacchetto sia stato correttamente configurato per un'opzione di disinstallazione make. Chiarimento: quello che vuole fare è abilitare un tipo di gestione per i pacchetti che funzionano per le cose che ha compilato.
Nisse,

360

Se sudo make uninstallnon è disponibile:

In un sistema basato su Debian, invece di (o dopo *) make installè possibile eseguire sudo checkinstallun .debfile che viene installato automaticamente. È quindi possibile rimuoverlo utilizzando il gestore dei pacchetti di sistema (ad es. apt/ synaptic/ aptitude/ dpkg). Checkinstall supporta anche la creazione di altri tipi di pacchetti, ad esempio RPM.

Vedi anche http://community.linuxmint.com/tutorial/view/162 e alcuni pacchetti base di checkinstall e debian checkinstall .


*: Se stai leggendo questo dopo averlo installato con make installpuoi ancora seguire le istruzioni sopra e fare un dpkg -r $PACKAGE_NAME_YOU_CHOSENseguito.


53
Questa risposta è la prova che le risposte migliori spesso non ottengono molti voti positivi. Grazie! Volevo sapere come farlo da molto tempo. Ho sempre esitato a fare un "make install" perché so che sarà quasi sicuramente una seccatura da rimuovere.
doug65536,

1
anche il libro LFS contiene alcune informazioni sui sistemi di gestione dei pacchetti, dal momento che è necessario configurarlo da soli. Le informazioni dovrebbero essere utili per far funzionare meglio questo tipo di cose (più pulite, più generali). Ci sono script che ascoltano semplicemente ciò che viene installato e quindi creano uno script che, quando lanciato, elimina tutti quei file o qualcosa del genere.
Nisse,

13
Questo ha funzionato magnificamente per me, anche se avevo già eseguito make installprima di utilizzare checkinstallinvece.
LukeGT

9
Installa il pacchetto checkinstallper questa eccellente risposta al lavoro.
Quimnuss,

1
Analogamente a quanto ha commentato l'utente "LukeGT", se i file di configurazione dell'installazione non sono disponibili ma i file del programma di installazione lo sono, possono essere compilati e installati checkinstalle se la nuova compilazione viene effettuata con le stesse impostazioni di quella precedente, disinstallando il pacchetto installato con checkinstalldovrebbe rimuovere i file precedentemente installati.
Edward,

62

Se hai un manifestfile che elenca tutti i file che sono stati installati con make installte puoi eseguire questo comando che ho da un'altra risposta:

cat install_manifest.txt | xargs echo rm | sh

Se hai sudo make install, dovrai aggiungere un sudo alla tua disinstallazione:

cat install_manifest.txt | xargs echo sudo rm | sh

4
Sono sorpreso di vedere che questo non ha ottenuto alcun voto. Questo ha funzionato per rimuovere i file dal sistema quando nessun'altra opzione ha funzionato. Nel mio caso, checkinstall non è stato in grado di creare un deb perché la versione del programma non è iniziata con un numero e quindi non è stata compilata. Questo ha funzionato bene.
DWils,

3
@DWils Penso che non abbia ricevuto più voti perché è abbastanza pericoloso. Inoltre xargs echo rm | sh,? Abbastanza ovvio che chiunque abbia suggerito questo non è particolarmente esperto o ben informato nell'uso della shell.
primo

4
(come riferimento, si tradurrà su tutti i caratteri nei nomi dei file che vengono interpretati dalla shell (e quindi hai eseguito 'rm's rogue's in esecuzione!), inoltre farà ogni sorta di espansione della shell. Immagina cosa succede se install_manifest.txtcontiene un asterisco ... rm *verrà convogliato in una shell.) Downvoted, per questo motivo.
primo

@fstd del tutto giusto. Come al solito questo tipo di risposta deve essere usato con attenzione. Controllare il file manifest prima di eseguire questo comando. Ma se stai usando la shell presumo che tu sappia cosa stai facendo.
tre

Puoi descrivere le circostanze in cui ci si install_manifest.txtpuò aspettare che esista?
einpoklum,

28

A seconda di quanto bene il makefile / configure script / autofoo magic del programma in questione sia il seguente potrebbe risolvere il tuo problema:

make uninstall

Il problema è che dovresti eseguirlo sull'albero dei sorgenti della versione che hai installato e con esattamente la stessa configurazione che hai usato per l'installazione.


19

Come disinstallare dopo "make install"

Metodo n. 1 (eseguire la disinstallazione)

Fase 1: Hai solo bisogno di seguire questo passaggio se hai eliminato / alterato la cartella di generazione in alcun modo: Scaricare e make / make install utilizzando la esatto stessa procedura come avete fatto prima.

Passaggio 2: prova a eseguire la disinstallazione.

cd $SOURCE_DIR 
sudo make uninstall

Se questo ha successo, il gioco è fatto. Se sei paranoico, puoi anche provare i passaggi del "Metodo # 3" per assicurarti di make uninstallnon perdere alcun file.

Metodo n. 2 (checkinstall - solo per sistemi basati su debian)

Panoramica del processo

Nei sistemi basati su Debian (ad es. Ubuntu) è possibile creare un .debpacchetto molto facilmente usando uno strumento chiamato checkinstall. Quindi installi il pacchetto .deb (questo farà capire al tuo sistema debian che tutte le parti del tuo pacchetto sono state effettivamente installate) e infine lo disinstalli per consentire al gestore dei pacchetti di ripulire correttamente il tuo sistema.

Passo dopo passo

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

A questo punto checkinstallverrà richiesto il nome di un pacchetto. Inserisci qualcosa di un po 'descrittivo e annotalo perché lo userai tra un minuto. Richiederà inoltre alcuni altri dati che è possibile ignorare. Se si lamenta che la versione non fosse accettabile, inserisci qualcosa di ragionevole come 1.0. Al termine è possibile installare e infine disinstallare:

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

Metodo n. 3 (install_manifest.txt)

Se install_manifest.txtesiste un file nella directory di origine, dovrebbe contenere i nomi dei file di ogni singolo file creato dall'installazione.

Quindi prima controlla l'elenco dei file e il loro mod-time:

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

Dovresti ottenere zero errori e i tempi di modifica dei file elencati dovrebbero essere attivi o successivi al tempo di installazione. Se tutto va bene, puoi eliminarli in una volta sola:

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

L'utente Merlyn Morgan-Graham ha comunque una seria nota riguardo a questo metodo che dovresti tenere a mente (copiato qui alla lettera): "Fai attenzione ai file che potrebbero essere stati installati anche da altri pacchetti. La semplice eliminazione di questi [...] file potrebbe rompere gli altri pacchetti ". . Questo è il motivo per cui abbiamo creato la deleted-by-uninstalldirectory e spostato i file lì invece di eliminarli.


Il 99% di questo post esisteva in altre risposte. Ho appena raccolto tutto ciò che è utile in un (si spera) facile da seguire e ho cercato di prestare maggiore attenzione ai dettagli importanti (come la citazione di argomenti xarg e il mantenimento dei backup dei file eliminati).


METODO 2 ha funzionato per me!
Aizzaac,

10

make clean generalmente pulisce solo i file creati nella directory contenente il codice sorgente stesso e raramente tocca qualsiasi software installato.

I makefile generalmente non contengono una destinazione per la disinstallazione: di solito è necessario farlo da soli, rimuovendo i file dalla directory in cui sono stati installati. Ad esempio, se hai costruito un programma e installato (utilizzando make install) in /usr/local, che ci si vuole guardare attraverso /usr/local/bin, /usr/local/libexec, /usr/local/share/man, ecc, e rimuovere i file indesiderati. A volte un Makefile include un uninstallobiettivo, ma non sempre.

Naturalmente, in genere su un sistema Linux si installa il software utilizzando un gestore di pacchetti , che è in grado di disinstallare il software "automagicamente".


8

L'utilità "stow" è stata progettata per risolvere questo problema: http://www.gnu.org/software/stow/


5
Come si usa stowper risolvere questo problema?
3D1T0R l'

L'utilità di stivaggio ti incoraggia a installare ogni versione in una posizione separata in modo da poter gestire più versioni sullo stesso computer. Se lo fai, la disinstallazione può essere semplice come eliminare l'intera directory di installazione.
Bruce Adams,

6

Purtroppo non esiste uno standard, questo è uno dei pericoli dell'installazione dalla fonte. Alcuni Makefile includeranno una "disinstallazione", quindi

make uninstall

dalla directory di origine potrebbe funzionare. Altrimenti, potrebbe essere una questione di annullare manualmente qualunque cosa abbia make installfatto.

make clean di solito pulisce semplicemente la directory di origine - rimuovendo i file generati / compilati e simili, probabilmente non quello che stai cercando.


0

Conosco alcuni pacchetti che supportano "make uninstall", ma molti altri che supportano make install DESTDIR = xxx "per installazioni graduali.

Puoi usarlo per creare un pacchetto che installi invece di installarlo direttamente dal sorgente. Non ho avuto fortuna con checkinstall ma fpm funziona molto bene.

Questo può anche aiutarti a rimuovere un pacchetto precedentemente installato usando make install . Devi semplicemente forzare l'installazione del pacchetto integrato su quello installato e quindi disinstallarlo.

Ad esempio, l'ho usato di recente per gestire protobuf-3.3.0. Su 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      

Preferisci yum a rpm se puoi.

Su 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

Preferisci apt a dpkg dove puoi.

Ho anche pubblicato la risposta qui


0

Makeposso dirti cosa sa e cosa farà. Supponiamo di avere un target "installa", che esegue comandi come:

cp <filelist> <destdir>/

Nelle tue regole generiche, aggiungi:

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

Un trucco simile può fare un generico make clean.


0

Preambolo

di seguito può funzionare o meno, tutto viene fornito così com'è, tu e solo tu sei la persona responsabile in caso di danni, perdita di dati e così via. Ma spero che le cose vadano bene!

Per annullare make installavrei fatto (e l'ho fatto) questo:

Idea: controlla qualunque script sia installato e annullalo con un semplice script bash.

  1. Riconfigura la tua directory di build per l'installazione in una directory personalizzata. Io di solito faccio questo: --prefix=$PWD/install. Per CMake, puoi andare alla tua directory di costruzione, aprire CMakeCache.txt e correggere il valore CMAKE_INSTALL_PREFIX.
  2. Installa il progetto nella directory personalizzata (esegui di make installnuovo).
  3. Ora spingiamo dal presupposto, che lo make installscript si installa nella directory personalizzata esattamente gli stessi contenuti che si desidera rimuovere da qualche altra parte (di solito /usr/local). Quindi, abbiamo bisogno di una sceneggiatura. 3.1. Lo script dovrebbe confrontare la directory personalizzata, con la directory che vuoi pulire. Io lo uso questo:

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. Ora esegui questo script (andrà a secco)

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

Ad esempio, non vuoi pulire / usr / local e la tua directory di installazione personalizzata è /user/me/llvm.build/install, quindi sarebbe

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

3.3. Controllare attentamente il registro, se i comandi sono utili, rimuovere il commento rm $RM_DIR/$fned eseguirlo di nuovo. Ma fermati! Hai davvero controllato attentamente? Può essere ricontrollato?

Fonte delle istruzioni: https://dyatkovskiy.com/2019/11/26/anti-make-install/

In bocca al lupo!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.