Що протилежне "зробити встановлення", тобто як ви можете видалити бібліотеку в Linux?


396

Під час бігу

./configure --prefix=/mingw 

в системі MinGW / MSYS для бібліотеки, яку я раніше запускав

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

Я наткнувся на це повідомлення:

ПОПЕРЕДЖЕННЯ: Версія SDK плагіна SDK вже встановлена. Очікуйте турбот і скорбот, якщо встановити нову версію, не попередньо видаляючи стару. (Продовження)

Це мене хвилювало. Що протилежне 'make install', тобто як видалено бібліотеку в Linux? Чи зроблять роботу «чисті» чи є інші кроки?



1
Дивіться у askubuntu.com/questions/87111/… для подібних відповідей, головне рішення наразі виглядає, sudo make uninstallякщо файли конфігурації інсталяції все ще доступні, але немає інших очевидних рішень, якщо немає, крім видалення з утилітою управління системним пакетом, якщо встановлено з "checkinstall "утиліта.
Едвард

7
Після запуску make installмені ніколи не потрібно make uninstallбуло їх видаляти. Я завжди використовувавxargs rm < install_manifest.txt
John Strood

Відповіді:


508

make cleanвидаляє будь-які проміжні або вихідні файли з вашого джерела / дерева збірки. Однак це впливає лише на джерело / дерево збору; він не торкається решти файлової системи і тому не буде видаляти раніше встановлене програмне забезпечення.

Якщо пощастить, біг make uninstallспрацює. Але автори бібліотеки повинні це передбачити; деякі автори задають uninstallціль, інші - ні.

Якщо вам не пощастило, вам доведеться видалити його вручну. Запуск make -n installможе бути корисним, оскільки він покаже кроки, які програмне забезпечення здійснить для встановлення, але насправді нічого не зробить. Потім ви можете вручну повернути ці кроки.


10
+1; Слідкуйте за файлами, які також могли бути встановлені іншими пакетами. Просто видалення цих файлів (одна інтерпретація "вручну повернути ці кроки") може порушити інші пакети. Це (одна з багатьох причин), чому були винайдені менеджери пакунків.
Мерлін Морган-Грехем

3
це можливо лише в тому випадку, якщо ви зберігаєте той самий конфігурований і складений каталог збірки? таким чином, не дуже корисно, оскільки більшість людей видалить його після встановлення. Він хоче видалити речі незалежно від того, чи зберігав він папку збірки, і незалежно від того, чи правильно налаштований пакет для опції make uninstall. Пояснення: що він хоче зробити, це включити якесь управління пакетами, які працюють на речі, які він склав сам.
Ніссе

360

Якщо sudo make uninstallйого немає:

В системі на основі Debian, замість (або після *) робити make installможна запустити , sudo checkinstallщоб зробити .debфайл , який автоматично встановлений. Потім можна видалити його за допомогою диспетчера системних пакетів (наприклад, apt/ synaptic/ aptitude/ dpkg). Checkinstall також підтримує створення інших типів пакунків, наприклад RPM.

Дивіться також http://community.linuxmint.com/tutorial/view/162 та деякі основні пакети використання і перевірки встановлення для debian .


*: Якщо ви читаєте це після встановлення, make installви все одно можете дотримуватися вищевказаних інструкцій та робити dpkg -r $PACKAGE_NAME_YOU_CHOSENнаступні дії.


53
Ця відповідь є доказом того, що найкращі відповіді часто не отримують багато голосів. Дякую! Я давно хотів знати, як це зробити. Я завжди вагаюся робити "зробити встановлення", тому що я знаю, що це майже напевно буде біль зняти.
doug65536

1
також книга LFS містить деяку інформацію про системи управління пакунками, оскільки ви повинні налаштувати її самостійно. Інформація, яка там є, повинна бути корисною для покращення роботи подібних речей (чистіших, загальніших). Є сценарії, які просто слухають, що встановлюється, а потім створюють сценарій, який при запуску видаляє всі ці файли, або щось подібне.
Ніссе

13
Це прекрасно працювало для мене, навіть якщо я вже працював make installперед тим, як використовувати checkinstall.
LukeGT

9
Встановіть пакет checkinstallдля цієї чудової відповіді на роботу.
quimnuss

1
Аналогічно тому, що прокоментував користувач "LukeGT", якщо файли конфігурації встановлення недоступні, але файли інсталятора є, їх можна компілювати та встановлювати, checkinstallі якщо нова компіляція виконана з тими ж налаштуваннями, що і стара, видалення встановленого пакету з checkinstallслід видалити раніше встановлені файли.
Едвард

62

Якщо у вас є manifestфайл, у якому перераховані всі файли, які були встановлені разом із make installвами, можна запустити цю команду, яку я отримав з іншої відповіді:

cat install_manifest.txt | xargs echo rm | sh

Якщо у вас є, sudo make installвам потрібно буде додати судо для видалення:

cat install_manifest.txt | xargs echo sudo rm | sh

4
Я здивований, побачивши, що це не отримало ніяких відгуків. Це працювало для видалення файлів із системи, коли не працювали інші параметри. У моєму випадку, checkinstall не міг створити деб, тому що версія програми не починалася з номера, а тому не збиралася. Це добре працювало.
DWils

3
@DWils Я думаю, що він не отримав більше оновлень, оскільки це досить небезпечно. Додатково xargs echo rm | sh,? Цілком очевидно, що той, хто запропонував це, не особливо досвідчений і не знає використання оболонки.
fstd

4
(Для довідки, він буде блювати на будь-які символи в іменах файлів , які інтерпретуються оболонкою (а потім у вас є шахрай гт » 's виконується!), Крім того , він буде робити все види розширення оболонки. Тільки уявіть , що станеться , якщо install_manifest.txtмістить зірочку ... rm *буде прокладено в оболонку.) З цієї причини.
fstd

@fstd цілком прав. Як завжди, подібну відповідь потрібно використовувати обережно. Перевірте файл маніфесту, перш ніж запустити цю команду. Але якщо ви використовуєте оболонку, я вважаю, що ви знаєте, що робите.
три

Чи можете ви описати обставини, за яких install_manifest.txtможна очікувати існування?
einpoklum

28

Залежно від того, наскільки добре makefile / configure script / autofoo magic відповідної програми може вирішити вашу проблему:

make uninstall

Проблема полягає в тому, що слід виконати це на дереві джерела встановленої версії та з точно такою ж конфігурацією, яку ви використовували для встановлення.


19

Як видалити після "зробити встановлення"

Спосіб №1 (видалення)

Крок 1: Ви повинні виконати цей крок, лише якщо ви будь-яким чином видалили / змінили каталог збірки : Завантажте та зробіть / зробіть установку, використовуючи точну таку ж процедуру, як і раніше.

Крок 2: спробуйте видалити.

cd $SOURCE_DIR 
sudo make uninstall

Якщо це вдасться, ви зробите. Якщо ви параноїк, ви також можете спробувати кроки "Метод №3", щоб переконатися, що make uninstallне пропустили жодні файли.

Спосіб №2 (перевірка встановлення - лише для систем на базі debian)

Огляд процесу

У системах на основі debian (наприклад, Ubuntu) ви можете створити .debпакет дуже легко, використовуючи інструмент з назвою checkinstall. Потім ви встановлюєте пакет .deb (це дозволить вашій системі debian зрозуміти, що всі частини вашого пакета були дійсно встановлені) і, нарешті, видаліть його, щоб ваш менеджер пакунків міг правильно очистити вашу систему.

Крок за кроком

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

У цей момент checkinstallбуде запропоновано ім'я пакета. Введіть щось трохи описово і відзначте це, оскільки ви використаєте це за хвилину. Також буде запропоновано ще кілька даних, які ви можете проігнорувати. Якщо скарга на версію не прийнятна, просто введіть щось розумне 1.0. Після її завершення ви можете встановити та остаточно видалити:

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

Спосіб №3 (install_manifest.txt)

Якщо файл install_manifest.txt є у вашому вихідному dir, він повинен містити імена кожного окремого файлу, який створила установка.

Тому спочатку перевірте список файлів та їх мод-час:

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

Ви повинні отримати нульові помилки, а модний час перерахованих файлів повинен бути увімкнено або після встановлення. Якщо все в порядку, ви можете видалити їх за один раз:

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

Користувач Мерлін Морган-Грехем має серйозне повідомлення щодо цього методу, про який слід пам’ятати (скопійовано тут дослівно): «Слідкуйте за файлами, які також могли бути встановлені іншими пакетами. Просто видалення цих файлів [...] могло б розбийте інші пакунки. " . Саме тому ми створили deleted-by-uninstallреж і перемістили туди файли, а не видаляти їх.


99% цієї публікації існували в інших відповідях. Я просто зібрав усе корисне в (сподіваюсь) простому слідування інструкціям і намагався приділити додаткову увагу важливим деталям (наприклад, цитування аргументів xarg та зберігання резервних копій видалених файлів).


МЕТОД 2 працював на мене!
Aizzaac

10

make clean як правило, очищає лише вбудовані файли в каталозі, що містить сам вихідний код, і рідко торкається будь-якого встановленого програмного забезпечення.

Makefiles, як правило, не містить цілі для видалення - зазвичай це потрібно робити самостійно, видаляючи файли з каталогу, в який вони були встановлені. Наприклад, якщо ви створили програму і встановив його ( з допомогою make install) в /usr/local, ви хочете переглянути /usr/local/bin, /usr/local/libexec, /usr/local/share/manі т.д., і видалити непотрібні файли. Іноді Makefile включає в себеuninstall ціль, але не завжди.

Звичайно, як правило, в системі Linux ви встановлюєте програмне забезпечення за допомогою менеджера пакетів , який здатний видаляти програмне забезпечення "автоматично".


8

Утиліта "stow" була розроблена для вирішення цієї проблеми: http://www.gnu.org/software/stow/


5
Як би можна було скористатися stowдля вирішення цієї проблеми?
3D1T0R

Утиліта Stow рекомендує встановити кожну версію в окремому місці, щоб ви могли керувати кількома версіями на одній машині. Якщо ви зробите це, то видалення може бути таким же простим, як і видалення всієї інсталяційної каталоги.
Брюс Адамс

6

На жаль, немає стандарту, це одна з небезпек встановлення з джерела. Деякі Makefiles включатимуть "видалення", так

make uninstall

з вихідного каталогу може працювати. В іншому випадку, це може бути справою в тому, щоб скасувати вручну все, що було make installзроблено.

make clean зазвичай просто очищає вихідний каталог - видаляє згенеровані / компільовані файли тощо, ймовірно, не те, що ви шукаєте.


0

Мені відомо декілька пакетів, які підтримують "видалити", але ще багато з них підтримують встановлення DESTDIR = xxx "для поетапних установок.

Ви можете використовувати це для створення пакету, який ви встановлюєте, а не встановлювати безпосередньо з джерела. Мені не пощастило з checkinstall але fpm працює дуже добре.

Це також може допомогти вам видалити попередньо встановлений пакет за допомогою make install . Ви просто змусите встановити вбудований пакет над встановленим пакетом, а потім видаліть його.

Наприклад, я нещодавно використовував це для боротьби з протобуфом-3.3.0. На 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      

Віддайте перевагу yum - rpm, якщо можете.

На 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

Віддавайте перевагу правильному dpkg, де можете.

Я також опублікував відповідь на це тут


0

Makeможе сказати вам, що він знає і що буде робити. Припустимо, у вас є ціль "встановити", яка виконує такі команди, як:

cp <filelist> <destdir>/

У своїх загальних правилах додайте:

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

Подібний трюк може зробити загальний make clean.


0

Преамбула

нижче це може спрацювати, а може і ні, це все є так, як ви, і ви лише ви відповідальна особа у разі пошкодження, втрати даних тощо. Але я сподіваюся, що справи проходять гладко!

Щоб скасувати, make installя зробив би це (і я це зробив):

Ідея: перевірте встановлення сценарію і скасуйте це простим скриптом bash.

  1. Переконфігуруйте свій dir dir для встановлення на якийсь користувальницький dir. Я зазвичай роблю це: --prefix=$PWD/install. Для CMake ви можете перейти до свого dir build, відкрити CMakeCache.txt та виправити значення CMAKE_INSTALL_PREFIX.
  2. Встановіть проект у спеціальний каталог (просто запустіть make installще раз).
  3. Тепер ми відштовхуємось від припущення, що make installскрипт встановлює в користувальницьку систему саме такий вміст, який ви хочете видалити з іншого місця (як правило /usr/local). Отже, нам потрібен сценарій. 3.1. Сценарій повинен порівнювати користувальницький режисер, з режисером, який ви хочете чисто. Я використовую це:

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. Тепер просто запустіть цей сценарій (він буде проходити сухим)

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

Наприклад, ви не хочете очищати / usr / local, а ваш користувальницький каталог встановлення - /user/me/llvm.build/install, тоді це буде

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

3.3. Уважно перевірте журнал, чи добре вам підійдуть команди, скаментуйте rm $RM_DIR/$fnта запустіть його знову. Але зупинись! Ви справді ретельно перевіряли? Може перевірити ще раз?

Джерело до інструкцій: https://dyatkovskiy.com/2019/11/26/anti-make-install/

Удачі!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.