Qual é o oposto de 'make install', ou seja, como você desinstala uma biblioteca no Linux?

396

Enquanto correndo

./configure --prefix=/mingw 

em um sistema MinGW / MSYS para uma biblioteca que eu havia executado anteriormente

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

Me deparei com esta mensagem:

AVISO: Uma versão do SDK do plugin Vamp já está instalada. Espere preocupações e tristezas se você instalar uma nova versão sem remover a antiga antes. (Continuando)

Isso me preocupou. Qual é o oposto de 'make install', ou seja, como uma biblioteca é desinstalada no Linux? 'Limpar' fará o trabalho ou há outras etapas envolvidas?

Alex Riley
fonte
serverfault.com/questions/422237/…
Ciro Santilli escreveu
11
Consulte askubuntu.com/questions/87111/… para obter respostas semelhantes. A solução principal atualmente parece ser sudo make uninstallse os arquivos de configuração da instalação ainda estão disponíveis, mas nenhuma outra solução óbvia, se não, além de desinstalar o utilitário de gerenciamento de pacotes do sistema, se instalado com "checkinstall " Utilitário.
Edward
7
Depois de executar make install, nunca precisei make uninstallremovê-los. Eu sempre useixargs rm < install_manifest.txt
John Strood

Respostas:

508

make cleanremove todos os arquivos intermediários ou de saída da sua árvore de origem / construção. No entanto, isso afeta apenas a árvore de origem / construção; ele não toca no restante do sistema de arquivos e, portanto, não remove o software instalado anteriormente.

Se você tiver sorte, correr make uninstallfuncionará. Cabe aos autores da biblioteca fornecer isso, no entanto; alguns autores fornecem um uninstallalvo, outros não.

Se você não tiver sorte, precisará desinstalá-lo manualmente. A execução make -n installpode ser útil, pois mostrará as etapas que o software levaria para instalar-se, mas na verdade não fará nada. Você pode então reverter manualmente essas etapas.

Josh Kelley
fonte
10
+1; Cuidado com os arquivos que também podem ter sido instalados por outros pacotes. Simplesmente excluir esses arquivos (uma interpretação de "reverter manualmente essas etapas") pode interromper os outros pacotes. Esta é (uma das muitas razões) pelas quais os gerenciadores de pacotes foram inventados.
Merlyn Morgan-Graham
3
isso só é possível se você mantiver o mesmo diretório de compilação configurado e compilado, certo? portanto, não é muito útil, pois a maioria das pessoas o excluiria após a instalação. Ele deseja desinstalar as coisas independentemente de ter mantido a pasta de compilação e se o pacote foi configurado corretamente para uma opção de desinstalação. Esclarecimento: o que ele quer fazer é habilitar algum tipo de gerenciamento de pacotes que funcionem para as coisas que ele mesmo compilou.
Nisse
360

Se sudo make uninstallnão estiver disponível:

Em um sistema baseado no Debian, em vez de (ou depois de *), make installvocê pode executar sudo checkinstallpara criar um .debarquivo que é instalado automaticamente. Você pode removê-lo usando o gerenciador de pacotes do sistema (por exemplo, apt/ synaptic/ aptitude/ dpkg). O Checkinstall também suporta a criação de outros tipos de pacotes, por exemplo, RPM.

Veja também http://community.linuxmint.com/tutorial/view/162 e alguns usos básicos do checkinstall e o pacote debian checkinstall .


*: Se você estiver lendo isso após a instalação, make installainda pode seguir as instruções acima e executar dpkg -r $PACKAGE_NAME_YOU_CHOSENposteriormente.

Nisse
fonte
53
Esta resposta é prova de que as melhores respostas geralmente não recebem muitos votos positivos. Obrigado! Eu queria saber como fazer isso há muito tempo. Eu sempre hesito em fazer um "make install" porque sei que quase certamente será uma dor de remover.
Doug65536
11
o livro do LFS também contém algumas informações sobre os sistemas de gerenciamento de pacotes, já que você mesmo deve configurá-lo. As informações devem ser úteis para que esse tipo de coisa funcione melhor (mais limpo, mais geral). Existem scripts que simplesmente escutam o que é instalado e, em seguida, criam um script que, quando iniciado, exclui todos esses arquivos, ou algo assim.
Nisse
13
Isso funcionou muito bem para mim, mesmo que eu já tivesse corrido make installantes de usar checkinstall.
21414 LukeGT #
9
Instale o pacote checkinstallpara que esta excelente resposta funcione.
quimnuss 30/03
11
Da mesma forma que o usuário "LukeGT" comentou, se os arquivos de configuração da instalação não estiverem disponíveis, mas os arquivos do instalador, eles poderão ser compilados e instalados checkinstalle se a nova compilação for feita com as mesmas configurações que a antiga, desinstalando o pacote instalado com checkinstalldeve remover os arquivos instalados anteriormente.
Edward
62

Se você possui um manifestarquivo que lista todos os arquivos que foram instalados com make installvocê, execute este comando que tenho de outra resposta:

cat install_manifest.txt | xargs echo rm | sh

Se você tiver sudo make install, precisará adicionar um sudo à sua desinstalação:

cat install_manifest.txt | xargs echo sudo rm | sh
três
fonte
4
Estou surpreso ao ver que isso não recebeu nenhum voto positivo. Isso funcionou para remover os arquivos do sistema quando nenhuma outra opção funcionou. No meu caso, o checkinstall não pôde criar uma deb porque a versão do programa não começou com um número e, portanto, não foi criada. Isso funcionou bem.
DWils
3
@ DWils Eu acho que não recebeu mais votos, porque é bastante perigoso. Além disso xargs echo rm | sh,? Muito óbvio que quem sugeriu isso não é particularmente experiente ou conhecedor do uso do shell.
Fstd
4
(para referência, ele vomita em qualquer caractere nos nomes de arquivos que são interpretados pelo shell (e você tem um rogue sendo executado!), além disso, ele faz todo tipo de expansão do shell. Imagine o que acontece se ele install_manifest.txtcontiver um asterisco ... rm *será canalizado para um shell.) Votado por esse motivo.
fstd
@fstd muito bem. Como sempre, esse tipo de resposta deve ser usado com cuidado. Verifique o arquivo de manifesto antes de executar este comando. Mas se você estiver usando o shell, presumo que você saiba o que está fazendo.
três
Você pode descrever as circunstâncias sob as quais install_manifest.txtse espera que exista?
einpoklum
28

Dependendo de quão bem a mágica makefile / configure script / autofoo do programa em questão é a seguinte, pode resolver seu problema:

make uninstall

O problema é que você deve executar isso na árvore de origem da versão que você instalou e com exatamente a mesma configuração usada para a instalação.

Joachim Sauer
fonte
19

Como desinstalar após "make install"

Método # 1 (faça a desinstalação)

Etapa 1: Você só precisa seguir esta etapa se tiver excluído / alterado o diretório de construção de qualquer forma: Faça o download e faça / faça a instalação usando exatamente o mesmo procedimento que você fez antes.

Etapa 2: tente fazer a desinstalação.

cd $SOURCE_DIR 
sudo make uninstall

Se isso der certo, você está pronto. Se você é paranóico, também pode tentar as etapas do "Método 3" para garantir make uninstallque não perdeu nenhum arquivo.

Método # 2 (checkinstall - apenas para sistemas baseados em debian)

Visão geral do processo

Nos sistemas baseados em debian (por exemplo, Ubuntu), você pode criar um .debpacote com muita facilidade usando uma ferramenta chamada checkinstall. Você então instala o pacote .deb (isto fará seu sistema debian perceber que todas as partes do seu pacote foram realmente instaladas) e finalmente o desinstala para permitir que o seu gerenciador de pacotes limpe seu sistema corretamente.

Passo a passo

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

Nesse ponto, checkinstallserá solicitado um nome de pacote. Digite algo um pouco descritivo e observe-o porque você o usará em um minuto. Ele também solicitará mais alguns dados que você pode ignorar. Se reclamar sobre a versão não ser aceitável, digite algo razoável como 1.0. Quando terminar, você pode instalar e finalmente desinstalar:

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

Método # 3 (install_manifest.txt)

Se install_manifest.txtexistir um arquivo no diretório de origem, ele deverá conter os nomes de arquivos de todos os arquivos criados pela instalação.

Então, primeiro verifique a lista de arquivos e seu tempo de modificação:

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

Você deve receber zero erros e os tempos de modificação dos arquivos listados devem estar no ou após o tempo de instalação. Se estiver tudo bem, você pode excluí-los de uma só vez:

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

O usuário Merlyn Morgan-Graham, no entanto, tem um aviso sério sobre esse método que você deve ter em mente (copiado aqui literalmente): "Cuidado com arquivos que também podem ter sido instalados por outros pacotes. Simplesmente excluir esses arquivos [...] poderia quebre os outros pacotes ". . Essa é a razão pela qual criamos o deleted-by-uninstalldir e movemos os arquivos para lá em vez de excluí-los.


99% deste post existia em outras respostas. Acabei de coletar tudo de útil em um (espero) fácil de seguir e tentei dar atenção extra a detalhes importantes (como citar argumentos xarg e manter backups de arquivos excluídos).

ndemou
fonte
O MÉTODO 2 funcionou para mim!
Aizzaac 30/01
10

make clean geralmente limpa apenas os arquivos criados no diretório que contém o próprio código-fonte e raramente toca em qualquer software instalado.

Os makefiles geralmente não contêm um alvo para desinstalação - você geralmente precisa fazer isso removendo os arquivos do diretório em que foram instalados. Por exemplo, se você construiu um programa e instalá-lo (usando make install) em /usr/local, você iria querer olhar através de /usr/local/bin, /usr/local/libexec, /usr/local/share/man, etc., e remover os arquivos indesejados. Às vezes, um Makefile inclui um uninstalldestino, mas nem sempre.

Obviamente, em um sistema Linux, você instala o software usando um gerenciador de pacotes , capaz de desinstalar o software "automaticamente".

mipadi
fonte
8

O utilitário "stow" foi projetado para solucionar esse problema: http://www.gnu.org/software/stow/

jjw
fonte
5
Como alguém usaria stowpara resolver esse problema?
3D1T0R 11/08/19
O utilitário de armazenamento encoraja você a instalar cada versão em um local separado, para que você possa gerenciar várias versões na mesma máquina. Se você fizer isso, a desinstalação pode ser tão simples quanto excluir o diretório de instalação inteiro.
Bruce Adams
6

Infelizmente, não existe um padrão, este é um dos perigos da instalação a partir do código-fonte. Alguns Makefiles incluem uma "desinstalação", então

make uninstall

do diretório de origem pode funcionar. Caso contrário, pode ser uma questão de desfazer manualmente o que make installaconteceu.

make clean geralmente apenas limpa o diretório de origem - removendo arquivos gerados / compilados e similares, provavelmente não é o que você procura.

Brenton Alker
fonte
0

Conheço alguns pacotes que suportam "make uninstall", mas muitos outros que suportam make install DESTDIR = xxx "para instalações em etapas.

Você pode usar isso para criar um pacote que você instala em vez de instalar diretamente da fonte. Não tive sorte com o checkinstall, mas o fpm funciona muito bem.

Isso também pode ajudá-lo a remover um pacote instalado anteriormente usando o make install . Você simplesmente força a instalação do seu pacote construído sobre o make instalado e o desinstala.

Por exemplo, usei isso recentemente para lidar com o protobuf-3.3.0. No 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      

Prefira yum a rpm, se puder.

No 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

Prefira o apt ao dpkg onde puder.

Eu também postei responder isso aqui

Bruce Adams
fonte
0

Makepode lhe dizer o que sabe e o que fará. Suponha que você tenha um destino "install", que executa comandos como:

cp <filelist> <destdir>/

Nas suas regras genéricas, adicione:

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

Um truque semelhante pode fazer um genérico make clean.

Mischa
fonte
0

Preâmbulo

abaixo pode funcionar ou não, tudo isso é como está, você e somente você é a pessoa responsável em caso de algum dano, perda de dados e assim por diante. Mas espero que tudo corra bem!

Para desfazer, make installeu faria (e fiz) o seguinte:

Idéia: verifique o script instalado e desfaça-o com o script bash simples.

  1. Reconfigure o diretório de construção para instalar em algum diretório personalizado. Eu costumo fazer isso: --prefix=$PWD/install. Para o CMake, você pode acessar o diretório de construção, abrir o CMakeCache.txt e corrigir o valor CMAKE_INSTALL_PREFIX.
  2. Instale o projeto no diretório personalizado (basta executar make installnovamente).
  3. Agora, partimos do pressuposto de que o make installscript é instalado no diretório personalizado com o mesmo conteúdo que você deseja remover de outro lugar (geralmente /usr/local). Então, precisamos de um script. 3.1 O script deve comparar o diretório personalizado, com o diretório que você deseja limpar. Eu uso isso:

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 Agora basta executar esse script (ele será executado a seco)

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

Por exemplo, você não deseja limpar / usr / local, e seu diretório de instalação personalizado é /user/me/llvm.build/install, então seria

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

3.3 Verifique o registro com cuidado, se os comandos forem bons para você, remova o comentário rm $RM_DIR/$fne execute-o novamente. Mas pare! Você realmente verificou cuidadosamente? Pode verificar novamente?

Fonte das instruções: https://dyatkovskiy.com/2019/11/26/anti-make-install/

Boa sorte!

Stepan Dyatkovskiy
fonte