¿Qué es lo contrario de 'make install', es decir, cómo desinstalar una biblioteca en Linux?


396

Mientras corre

./configure --prefix=/mingw 

en un sistema MinGW / MSYS para una biblioteca que había ejecutado anteriormente

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

Me encontré con este mensaje:

ADVERTENCIA: Ya está instalada una versión del SDK del complemento de Vamp. Espere preocupaciones y penas si instala una nueva versión sin eliminar primero la anterior. (Continuo)

Esto me tenía preocupado. ¿Qué es lo contrario de 'make install', es decir, cómo se desinstala una biblioteca en Linux? ¿'Clean' hará el trabajo o hay otros pasos involucrados?



1
Consulte askubuntu.com/questions/87111/… para obtener respuestas similares, la solución principal actualmente parece ser sudo make uninstallsi los archivos de configuración de instalación todavía están disponibles, pero no hay otras soluciones obvias si no, aparte de la desinstalación con la utilidad de administración de paquetes del sistema si está instalado con "checkinstall "utilidad.
Edward

77
Después de correr make install, nunca he necesitado make uninstalleliminarlos. Siempre he usadoxargs rm < install_manifest.txt
John Strood

Respuestas:


508

make cleanelimina cualquier archivo intermedio o de salida de su árbol de origen / compilación. Sin embargo, solo afecta el árbol de origen / compilación; no toca el resto del sistema de archivos y, por lo tanto, no eliminará el software instalado previamente.

Si tienes suerte, correr make uninstallfuncionará. Sin embargo, depende de los autores de la biblioteca proporcionar eso; algunos autores proporcionan un uninstallobjetivo, otros no.

Si no tienes suerte, tendrás que desinstalarlo manualmente. La ejecución make -n installpuede ser útil, ya que mostrará los pasos que el software tomaría para instalarse, pero en realidad no hará nada. Luego puede revertir manualmente esos pasos.


10
+1; Tenga cuidado con los archivos que también podrían haber sido instalados por otros paquetes. Simplemente eliminar estos archivos (una interpretación de "invertir manualmente esos pasos") podría romper los otros paquetes. Esta es (una de las muchas razones) por las que se inventaron los administradores de paquetes.
Merlyn Morgan-Graham

3
esto solo es posible si mantiene el mismo directorio de compilación configurado y compilado, ¿verdad? por lo tanto, no es muy útil ya que la mayoría de las personas lo eliminarían después de la instalación. Quiere desinstalar las cosas independientemente de si mantuvo la carpeta de compilación y si el paquete se configuró correctamente para una opción de desinstalación. Aclaración: lo que quiere hacer es habilitar algún tipo de gestión de paquetes que funcione para cosas que él mismo compiló.
Nisse

360

Si sudo make uninstallno está disponible:

En un sistema basado en Debian, en lugar de hacerlo (o después *) make installpuede ejecutar sudo checkinstallpara crear un .debarchivo que se instala automáticamente. Luego puede eliminarlo utilizando el administrador de paquetes del sistema (p apt. Ej. / synaptic/ aptitude/ dpkg). Checkinstall también admite la creación de otros tipos de paquetes, por ejemplo, RPM.

Consulte también http://community.linuxmint.com/tutorial/view/162 y algunos usos básicos de checkinstall y el paquete debian checkinstall .


*: Si está leyendo esto después de haber instalado con make installusted, aún puede seguir las instrucciones anteriores y hacer lo siguiente dpkg -r $PACKAGE_NAME_YOU_CHOSEN.


53
Esta respuesta es una prueba de que las mejores respuestas a menudo no reciben muchos votos positivos. ¡Gracias! He querido saber cómo hacer esto durante mucho tiempo. Siempre dudo en hacer una "instalación de make" porque sé que casi con toda seguridad será difícil eliminarla.
doug65536

1
Además, el libro LFS tiene información sobre los sistemas de administración de paquetes, ya que debe configurarlo usted mismo. La información allí debería ser útil para que este tipo de cosas funcionen mejor (más limpio, más general). Hay scripts que simplemente escuchan lo que se instala y luego crean un script que cuando se inicia elimina todos esos archivos, o algo así.
Nisse

13
Esto funcionó muy bien para mí, a pesar de que ya había corrido make installantes de usarlo checkinstall.
LukeGT

99
Instale el paquete checkinstallpara esta excelente respuesta al trabajo.
quimnuss

1
De manera similar a lo que comentó el usuario "LukeGT", si los archivos de configuración de la instalación no están disponibles pero los archivos del instalador sí, se pueden compilar e instalar checkinstally si la nueva compilación se realiza con la misma configuración que la anterior, desinstalando el paquete instalado con checkinstalldebería eliminar los archivos instalados previamente.
Edward

62

Si tiene un manifestarchivo que enumera todos los archivos que se instalaron make install, puede ejecutar este comando que tengo de otra respuesta:

cat install_manifest.txt | xargs echo rm | sh

Si tiene sudo make install, deberá agregar un sudo a su desinstalación:

cat install_manifest.txt | xargs echo sudo rm | sh

44
Me sorprende ver que esto no recibió votos positivos. Esto funcionó para eliminar los archivos del sistema cuando no funcionó ninguna otra opción. En mi caso, checkinstall no pudo crear una deb porque la versión del programa no comenzó con un número y, por lo tanto, no se compiló. Esto funcionó muy bien.
DWils

3
@DWils Creo que no recibió más votos a favor porque es bastante peligroso. Además, xargs echo rm | sh? Es bastante obvio que quien sugirió esto no es particularmente experimentado o conocedor en el uso del shell.
fstd

44
(para referencia, vomitará sobre cualquier carácter en los nombres de archivo que sean interpretados por el shell (y luego se ejecutará un 'pícaro'), además, hará todo tipo de expansión del shell. Solo imagine lo que sucede si install_manifest.txtcontiene un asterisco ... rm *se canalizará dentro de un caparazón.) Votado abajo, por esta razón.
fstd

@fstd bastante bien. Como de costumbre, este tipo de respuesta debe usarse con cuidado. Verifique el archivo de manifiesto antes de ejecutar este comando. Pero si está utilizando el shell, supongo que sabe lo que está haciendo.
tres de

¿Puede describir las circunstancias bajo las cuales install_manifest.txtse puede esperar que exista?
einpoklum

28

Dependiendo de qué tan bien el makefile / configure script / autofoo magic del programa en cuestión es lo siguiente podría resolver su problema:

make uninstall

El problema es que debe ejecutar esto en el árbol de origen de la versión que tiene instalada y con exactamente la misma configuración que utilizó para la instalación.


19

Cómo desinstalar después de "hacer instalar"

Método # 1 (hacer desinstalación)

Paso 1: Usted sólo tiene que seguir este paso si se ha borrado / modificado la carpeta de compilación de ninguna manera: Descargar y hacer / realizar la instalación mediante la exacta mismo procedimiento como lo hacía antes.

Paso 2: intente hacer la desinstalación.

cd $SOURCE_DIR 
sudo make uninstall

Si esto tiene éxito, ya está. Si eres paranoico, también puedes probar los pasos del "Método # 3" para asegurarte de make uninstallque no te pierdas ningún archivo.

Método # 2 (checkinstall - solo para sistemas basados ​​en Debian)

Resumen del proceso

En los sistemas basados ​​en Debian (p. Ej., Ubuntu), puede crear un .debpaquete muy fácilmente utilizando una herramienta llamada checkinstall. Luego instala el paquete .deb (esto hará que su sistema Debian se dé cuenta de que todas las partes de su paquete se han instalado) y finalmente lo desinstale para permitir que su administrador de paquetes limpie adecuadamente su sistema.

Paso a paso

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

En este punto, se checkinstallle solicitará un nombre de paquete. Ingrese algo un poco descriptivo y anótelo porque lo usará en un minuto. También solicitará algunos datos más que puede ignorar. Si se queja de que la versión no es aceptable, simplemente ingrese algo razonable como 1.0. Cuando finalice, puede instalar y finalmente desinstalar:

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

Método # 3 (install_manifest.txt)

Si install_manifest.txtexiste un archivo en su directorio de origen, debe contener los nombres de cada archivo creado por la instalación.

Entonces, primero verifique la lista de archivos y su tiempo de modificación:

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

Debería obtener cero errores y los tiempos de modificación de los archivos listados deberían estar en o después del tiempo de instalación. Si todo está bien, puede eliminarlos de una vez:

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

Sin embargo, el usuario Merlyn Morgan-Graham tiene un aviso serio sobre este método que debe tener en cuenta (copiado aquí al pie de la letra): "Tenga cuidado con los archivos que también podrían haber sido instalados por otros paquetes. Simplemente borrando estos archivos podría [...] romper los otros paquetes ". . Esa es la razón por la que creamos el deleted-by-uninstalldirectorio y movimos los archivos allí en lugar de eliminarlos.


El 99% de esta publicación existía en otras respuestas. Acabo de recopilar todo lo útil en un (con suerte) fácil de seguir y traté de prestar atención adicional a los detalles importantes (como citar argumentos xarg y mantener copias de seguridad de archivos eliminados).


¡El MÉTODO 2 funcionó para mí!
Aizzaac

10

make clean generalmente solo limpia los archivos compilados en el directorio que contiene el código fuente en sí, y rara vez toca algún software instalado.

Los archivos MAKE generalmente no contienen un objetivo para la desinstalación, generalmente debe hacerlo usted mismo, eliminando los archivos del directorio en el que se instalaron. Por ejemplo, si usted construyó un programa y lo instaló (usando make install) en /usr/local, te gustaría ver a través de /usr/local/bin, /usr/local/libexec, /usr/local/share/man, etc, y eliminar los archivos no deseados. A veces, un Makefile incluye un uninstallobjetivo, pero no siempre.

Por supuesto, normalmente en un sistema Linux instalas el software utilizando un administrador de paquetes , que es capaz de desinstalar el software "automáticamente".


8

La utilidad "guardar" se diseñó para resolver este problema: http://www.gnu.org/software/stow/


55
¿Cómo se usaría stowpara resolver este problema?
3D1T0R

La utilidad de almacenamiento lo alienta a instalar cada versión en una ubicación separada para que pueda administrar varias versiones en la misma máquina. Si hace esto, la desinstalación puede ser tan simple como eliminar todo el directorio de instalación.
Bruce Adams

6

Desafortunadamente, no hay un estándar, este es uno de los peligros de instalar desde la fuente. Algunos Makefiles incluirán una "desinstalación", por lo que

make uninstall

desde el directorio de origen puede funcionar. De lo contrario, puede ser una cuestión de deshacer manualmente lo que make installhizo.

make clean por lo general, solo limpia el directorio de origen, eliminando los archivos generados / compilados y similares, probablemente no lo que buscas.


0

Conozco algunos paquetes que admiten "realizar desinstalación", pero muchos más que admiten la instalación de DESTDIR = xxx "para instalaciones por etapas.

Puede usar esto para crear un paquete que instale en lugar de instalarlo directamente desde la fuente. No tuve suerte con checkinstall pero fpm funciona muy bien.

Esto también puede ayudarlo a eliminar un paquete previamente instalado usando make install . Simplemente fuerce la instalación de su paquete integrado sobre la marca instalada y luego desinstálelo.

Por ejemplo, usé esto recientemente para tratar con protobuf-3.3.0. En 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      

Prefiere ñam a rpm si puedes.

En 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

Prefiere apt a dpkg donde puedas.

También he publicado la respuesta aquí


0

Makepuede decirle lo que sabe y lo que hará. Supongamos que tiene un objetivo de "instalación", que ejecuta comandos como:

cp <filelist> <destdir>/

En sus reglas genéricas, agregue:

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 truco similar puede hacer un genérico make clean.


0

Preámbulo

a continuación puede funcionar o no, todo esto se da tal cual, usted y solo usted es la persona responsable en caso de algún daño, pérdida de datos, etc. ¡Pero espero que las cosas salgan bien!

Para deshacer make install, haría (y lo hice) esto:

Idea: verifique cualquier script que se instale y deshaga esto con un simple script bash.

  1. Vuelva a configurar su directorio de compilación para instalarlo en algún directorio personalizado. Yo suelo hacer esto: --prefix=$PWD/install. Para CMake, puede ir a su directorio de compilación, abrir CMakeCache.txt y corregir el valor CMAKE_INSTALL_PREFIX.
  2. Instale el proyecto en el directorio personalizado (solo make installvuelva a ejecutarlo ).
  3. Ahora, asumimos que la make installsecuencia de comandos se instala en el directorio personalizado con el mismo contenido que desea eliminar de otro lugar (generalmente /usr/local). Entonces, necesitamos un guión. 3.1. El script debe comparar el directorio personalizado, con el directorio que desea limpiar. Yo uso esto:

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. Ahora solo ejecute este script (se ejecutará en seco)

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

Por ejemplo, si desea limpiar / usr / local, y su directorio de instalación personalizado es /user/me/llvm.build/install, entonces sería

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

3.3. Verifique el registro cuidadosamente, si los comandos son buenos para usted, descomente rm $RM_DIR/$fny ejecútelo nuevamente. Pero para! ¿Realmente revisaste cuidadosamente? Se puede comprobar de nuevo?

Fuente de las instrucciones: https://dyatkovskiy.com/2019/11/26/anti-make-install/

¡Buena suerte!

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.