Czym jest przeciwieństwo „make install”, tj. Jak odinstalować bibliotekę w systemie Linux?

396

Podczas biegu

./configure --prefix=/mingw 

w systemie MinGW / MSYS dla biblioteki, którą wcześniej uruchomiłem

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

Natrafiłem na tę wiadomość:

OSTRZEŻENIE: Wersja zestawu SDK wtyczki Vamp jest już zainstalowana. Oczekuj zmartwień i smutków, jeśli zainstalujesz nową wersję bez uprzedniego usunięcia starej. (Kontynuacja)

Martwiło mnie to. Czym jest przeciwieństwo „make install”, tj. Jak odinstalowuje się bibliotekę w systemie Linux? Czy „czyści” wykona zadanie, czy też są jakieś inne kroki?

Alex Riley
źródło
serverfault.com/questions/422237/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功 法轮功
1
Zobacz podobne odpowiedzi na askubuntu.com/questions/87111/ ..., głównym rozwiązaniem wydaje się obecnie, sudo make uninstalljeśli pliki konfiguracyjne instalacji są nadal dostępne, ale nie ma innych oczywistych rozwiązań, jeśli nie, oprócz odinstalowywania za pomocą narzędzia do zarządzania pakietami systemowymi, jeśli jest instalowane z „checkinstall” „narzędzie.
Edward
7
Po uruchomieniu make installnigdy nie musiałem make uninstallich usuwać. Zawsze używałemxargs rm < install_manifest.txt
John Strood

Odpowiedzi:

508

make cleanusuwa wszelkie pliki pośrednie lub wyjściowe z drzewa źródłowego / kompilacji. Jednak wpływa tylko na drzewo źródłowe / kompilacji; nie dotyka reszty systemu plików, a zatem nie usuwa wcześniej zainstalowanego oprogramowania.

Jeśli masz szczęście, bieganie make uninstallbędzie działać. Zapewnienie tego zależy jednak od autorów biblioteki; niektórzy autorzy podają uninstallcel, inni nie.

Jeśli nie masz szczęścia, musisz go ręcznie odinstalować. Uruchomienie make -n installmoże być pomocne, ponieważ pokaże kroki, jakie oprogramowanie wykona, aby się zainstalować, ale w rzeczywistości nic nie zrobi. Następnie możesz ręcznie cofnąć te kroki.

Josh Kelley
źródło
10
+1; Uważaj na pliki, które mogły zostać również zainstalowane przez inne pakiety. Samo usunięcie tych plików (jedna interpretacja „ręcznego cofania tych kroków”) może uszkodzić inne pakiety. Jest to (jeden z wielu powodów), dlaczego wymyślono menedżerów pakietów.
Merlyn Morgan-Graham
3
jest to możliwe tylko wtedy, gdy masz ten sam skonfigurowany i skompilowany katalog kompilacji, prawda? dlatego nie jest to bardzo przydatne, ponieważ większość osób usunęłoby go po instalacji. Chce odinstalować rzeczy bez względu na to, czy zachował folder kompilacji i niezależnie od tego, czy pakiet został poprawnie skonfigurowany dla opcji make uninstall. Wyjaśnienie: chce, aby umożliwić pewnego rodzaju zarządzanie pakietami, które działają dla rzeczy, które sam skompilował.
Nisse
360

Jeśli sudo make uninstalljest niedostępny:

W systemie opartym o Debiana, zamiast (lub po *) robi make installmożna uruchomić sudo checkinstallzrobić .debplik zostanie automatycznie zainstalowany. Następnie możesz go usunąć za pomocą menedżera pakietów systemowych (np. apt/ synaptic/ aptitude/ dpkg). Checkinstall obsługuje również tworzenie innych typów pakietów, np. RPM.

Zobacz także http://community.linuxmint.com/tutorial/view/162 oraz niektóre podstawowe zastosowania checkinstall i pakiet debian checkinstall .


*: Jeśli czytasz to po zainstalowaniu make install, nadal możesz postępować zgodnie z powyższymi instrukcjami i zrobić dpkg -r $PACKAGE_NAME_YOU_CHOSENpóźniej.

Nisse
źródło
53
Ta odpowiedź jest dowodem na to, że najlepsze odpowiedzi często nie otrzymują zbyt dużej liczby głosów. Dzięki! Od dawna chciałem wiedzieć, jak to zrobić. Zawsze waham się przed zrobieniem „make install”, ponieważ wiem, że prawie na pewno będzie to trudne do usunięcia.
doug65536
1
także książka LFS zawiera pewne informacje na temat systemów zarządzania pakietami, ponieważ musisz to skonfigurować samodzielnie. Informacje tam powinny być pomocne w poprawie działania tego rodzaju rzeczy (czystsze, bardziej ogólne). Są skrypty, które po prostu nasłuchują, co się instaluje, a następnie tworzą skrypt, który po uruchomieniu usuwa wszystkie te pliki lub coś w tym rodzaju.
Nisse
13
To działało dla mnie pięknie, mimo że już biegałem make installprzed użyciem checkinstall.
LukeGT
9
Zainstaluj pakiet, checkinstallaby ta doskonała odpowiedź zadziałała.
quimnuss
1
Podobnie do tego, co skomentował użytkownik „LukeGT”, jeśli pliki instalacyjne instalacji nie są dostępne, ale pliki instalacyjne są, można je skompilować i zainstalować, checkinstalla jeśli nowa kompilacja ma te same ustawienia, co poprzednia, odinstalowanie zainstalowanego pakietu z checkinstallpowinien usunąć wcześniej zainstalowane pliki.
Edward,
62

Jeśli masz manifestplik z listą wszystkich plików, które zostały z nim zainstalowane make install, możesz uruchomić polecenie, które mam z innej odpowiedzi:

cat install_manifest.txt | xargs echo rm | sh

Jeśli tak sudo make install, musisz dodać sudo do dezinstalacji:

cat install_manifest.txt | xargs echo sudo rm | sh
trzy
źródło
4
Jestem zaskoczony, widząc, że to nie uzyskało pozytywnych opinii. To działało, aby usunąć pliki z systemu, gdy żadne inne opcje nie działały. W moim przypadku checkinstall nie mógł utworzyć deb, ponieważ wersja programu nie zaczęła się od cyfry i dlatego nie mogła się skompilować. To działało ładnie.
DWils,
3
@DWils Myślę, że nie otrzymał więcej pozytywnych opinii, ponieważ jest to dość niebezpieczne. Dodatkowo xargs echo rm | sh? Całkiem oczywiste, że ktokolwiek to zasugerował, nie jest szczególnie doświadczony ani nie ma wiedzy na temat używania powłoki.
fdd
4
(dla porównania, zablokuje wszystkie znaki w nazwach plików, które są interpretowane przez powłokę (a następnie wykonywane jest nieuczciwe rm!), dodatkowo wykona wszelkiego rodzaju rozszerzanie powłoki. Wyobraź sobie, co się stanie, jeśli install_manifest.txtzawiera gwiazdkę ... rm *zostanie przeniesiony do skorupy.) Z tego powodu przegłosowano.
fdd
@fstd całkiem dobrze. Jak zwykle tego rodzaju odpowiedzi należy używać ostrożnie. Sprawdź plik manifestu przed uruchomieniem tego polecenia. Ale jeśli używasz powłoki, zakładam, że wiesz, co robisz.
trzy
Czy możesz opisać okoliczności, w których install_manifest.txtmożna się spodziewać?
einpoklum
28

W zależności od tego, jak dobrze magia makefile / configure script / autofoo danego programu może rozwiązać Twój problem:

make uninstall

Problem polega na tym, że należy to wykonać w drzewie źródeł zainstalowanej wersji i przy użyciu dokładnie takiej samej konfiguracji, jak podczas instalacji.

Joachim Sauer
źródło
19

Jak odinstalować po „make install”

Metoda nr 1 (dokonaj deinstalacji)

Krok 1: Musisz wykonać ten krok tylko wtedy, gdy usunąłeś / zmieniłeś katalog kompilacji w jakikolwiek sposób: Pobierz i dokonaj / make install stosując dokładnie taką samą procedurę jak poprzednio.

Krok 2: Spróbuj odinstalować.

cd $SOURCE_DIR 
sudo make uninstall

Jeśli to się powiedzie, skończyłeś. Jeśli jesteś paranoikiem, możesz również spróbować wykonać kroki z „Metody nr 3”, aby upewnić się, make uninstallże nie przegapisz żadnych plików.

Metoda nr 2 (checkinstall - tylko dla systemów opartych na Debianie)

Przegląd procesu

W systemach opartych na Debianie (np. Ubuntu) możesz .debbardzo łatwo stworzyć pakiet, używając narzędzia o nazwie checkinstall. Następnie instalujesz pakiet .deb (to sprawi, że twój system debian zda sobie sprawę, że wszystkie części pakietu rzeczywiście zostały zainstalowane) i ostatecznie odinstalujesz go, aby Twój menedżer pakietów poprawnie wyczyścił twój system.

Krok po kroku

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

W tym momencie checkinstallpojawi się monit o podanie nazwy pakietu. Wprowadź coś nieco opisowego i zanotuj to, ponieważ wykorzystasz to za minutę. Pojawi się również monit o podanie kilku dodatkowych danych, które możesz zignorować. Jeśli to narzeka wersji nie był dopuszczalny tylko wprowadzić coś rozsądnego jak 1.0. Po zakończeniu możesz zainstalować i ostatecznie odinstalować:

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

Metoda nr 3 (install_manifest.txt)

Jeśli plik install_manifest.txtistnieje w katalogu źródłowym, powinien on zawierać nazwy plików każdego pliku utworzonego przez instalację.

Najpierw sprawdź listę plików i ich czas modyfikacji:

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

Powinieneś dostać zero błędów, a czasy modów wymienionych plików powinny być włączone lub po czasie instalacji. Jeśli wszystko jest w porządku, możesz je usunąć za jednym razem:

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

Użytkownik Merlyn Morgan-Graham ma jednak poważne obawy dotyczące tej metody, o których należy pamiętać (skopiowano tutaj dosłownie): „Uważaj na pliki, które mogły być również zainstalowane przez inne pakiety. Po prostu usunięcie tych plików [...] może zepsuć inne pakiety. ” . To jest powód, dla którego stworzyliśmy deleted-by-uninstallkatalog i przenieśliśmy tam pliki zamiast je usuwać.


99% tego postu istniało w innych odpowiedziach. Właśnie zebrałem wszystko przydatne w (mam nadzieję) łatwym do naśladowania poradniku i starałem się zwrócić szczególną uwagę na ważne szczegóły (takie jak cytowanie argumentów xarg i przechowywanie kopii zapasowych usuniętych plików).

ndemou
źródło
METODA 2 zadziałała dla mnie!
Aizzaac
10

make clean generalnie czyści tylko wbudowane pliki w katalogu zawierającym sam kod źródłowy i rzadko dotyka zainstalowanego oprogramowania.

Pliki Makefile na ogół nie zawierają celu do odinstalowania - zwykle musisz to zrobić samodzielnie, usuwając pliki z katalogu, w którym zostały zainstalowane. Na przykład, jeśli wbudowany program i zainstalować go (za pomocą make install) w /usr/local, którą chcesz przejrzeć /usr/local/bin, /usr/local/libexec, /usr/local/share/man, itd., I usunąć niepotrzebne pliki. Czasami plik Makefile zawiera uninstallcel, ale nie zawsze.

Oczywiście zazwyczaj w systemie Linux instaluje się oprogramowanie za pomocą menedżera pakietów , który jest w stanie „odinstalować” oprogramowanie „automatycznie”.

mipadi
źródło
8

Narzędzie „stow” zostało zaprojektowane w celu rozwiązania tego problemu: http://www.gnu.org/software/stow/

jjw
źródło
5
Jak można przejść stowdo rozwiązania tego problemu?
3D1T0R
Narzędzie do przechowywania zachęca do zainstalowania każdej wersji w osobnym miejscu, aby można było zarządzać wieloma wersjami na tym samym komputerze. Jeśli to zrobisz, odinstalowanie może być tak proste, jak usunięcie całego katalogu instalacyjnego.
Bruce Adams
6

Niestety nie ma standardu, jest to jedno z zagrożeń związanych z instalacją ze źródła. Niektóre pliki Makefile zawierają „odinstalowanie”, więc

make uninstall

z katalogu źródłowego może działać. W przeciwnym razie może to być kwestia ręcznego cofnięcia tego, co make installzrobiono.

make clean zwykle po prostu czyści katalog źródłowy - usuwając wygenerowane / skompilowane pliki i tym podobne, prawdopodobnie nie to, czego szukasz.

Brenton Alker
źródło
0

Znam kilka pakietów, które obsługują „dokonaj deinstalacji”, ale wiele innych, które obsługują, instalują DESTDIR = xxx dla instalacji etapowych.

Możesz użyć tego do stworzenia pakietu, który instalujesz zamiast instalować bezpośrednio ze źródła. Nie miałem szczęścia z checkinstall, ale fpm działa bardzo dobrze.

Może to również pomóc usunąć pakiet wcześniej zainstalowany przy użyciu make install . Po prostu wymuś zainstalowanie wbudowanego pakietu w stosunku do make install a następnie odinstaluj.

Na przykład ostatnio użyłem tego, aby poradzić sobie z protobuf-3.3.0. Na 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      

Jeśli to możliwe, wolę yum od rpm.

Na 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

Wolę apt na dpkg tam, gdzie możesz.

Odpowiedziałem również tutaj

Bruce Adams
źródło
0

Makemoże ci powiedzieć, co wie i co zrobi. Załóżmy, że masz cel instalacji, który wykonuje polecenia takie jak:

cp <filelist> <destdir>/

W ogólnych zasadach dodaj:

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

Podobna sztuczka może zrobić rodzajową make clean.

Mischa
źródło
0

Preambuła

poniżej może działać, ale nie musi, wszystko to jest podane w obecnym stanie, a Ty i tylko Ty jesteś osobą odpowiedzialną w przypadku uszkodzenia, utraty danych i tak dalej. Ale mam nadzieję, że wszystko pójdzie gładko!

Aby cofnąć make install, zrobiłbym (i zrobiłem) to:

Pomysł: sprawdź, co skrypt instaluje i cofnij to za pomocą prostego skryptu bash.

  1. Ponownie skonfiguruj katalog kompilacji, aby zainstalować go w niestandardowym katalogu. I zazwyczaj to zrobić: --prefix=$PWD/install. W przypadku CMake możesz przejść do katalogu kompilacji, otworzyć plik CMakeCache.txt i naprawić wartość CMAKE_INSTALL_PREFIX.
  2. Zainstaluj projekt w niestandardowym katalogu (po prostu uruchom make installponownie).
  3. Teraz wychodzimy z założenia, że make installskrypt instaluje w niestandardowym katalogu tylko tę samą zawartość, którą chcesz usunąć z innego miejsca (zwykle /usr/local). Potrzebujemy więc skryptu. 3.1 Skrypt powinien porównać niestandardowy katalog z katalogiem, który chcesz wyczyścić. Używam tego:

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 Teraz po prostu uruchom ten skrypt (będzie działał na sucho)

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

Np. Nie chcesz czyścić / usr / local, a twoim niestandardowym katalogiem instalacyjnym jest /user/me/llvm.build/install, to byłoby

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

3.3 Sprawdź dokładnie dziennik, jeśli polecenia są dla ciebie dobre, odkomentuj rm $RM_DIR/$fni uruchom je ponownie. Ale przestań! Czy naprawdę sprawdziłeś dokładnie? Czy można sprawdzić ponownie?

Źródło instrukcji: https://dyatkovskiy.com/2019/11/26/anti-make-install/

Powodzenia!

Stepan Dyatkovskiy
źródło