Что противоположно «make install», то есть как вы удаляете библиотеку в Linux?


396

Во время пробежки

./configure --prefix=/mingw 

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

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

Я наткнулся на это сообщение:

ВНИМАНИЕ: Версия SDK плагина Vamp уже установлена. Ожидайте беспокойства и печали, если вы устанавливаете новую версию, не удаляя старую. (Продолжение)

Это меня беспокоило. Что противоположно «make install», то есть как библиотека удалена в Linux? Будет ли «сделать чистым» делать работу, или есть другие шаги?



1
Смотрите аналогичные ответы на сайте askubuntu.com/questions/87111/…. Основное решение в настоящее время, по-видимому, заключается в sudo make uninstallтом, что файлы конфигурации установки все еще доступны, но нет других очевидных решений, если нет, кроме удаления с помощью утилиты управления пакетами системы, если установлено с помощью «checkinstall». " утилита.
Эдвард

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

Ответы:


508

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

Если вам повезет, бег make uninstallбудет работать. Однако, это зависит от авторов библиотеки; некоторые авторы предоставляют uninstallцель, другие нет.

Если вам не повезло, вам придется удалить его вручную. Запуск make -n installможет быть полезен, поскольку он покажет шаги, которые программа предпримет для установки, но на самом деле ничего не сделает. Затем вы можете вручную отменить эти шаги.


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

3
это возможно только в том случае, если вы сохраняете тот же настроенный и скомпилированный каталог сборки правильно? таким образом, не очень полезно, так как большинство людей будет удалять его после установки. Он хочет удалить вещи независимо от того, сохранил ли он папку сборки, и независимо от того, был ли пакет правильно настроен для опции make uninstall. Пояснение: что он хочет сделать, так это включить какое-то управление для пакетов, которые работают для вещей, которые он сам скомпилировал.
Nisse

360

Если sudo make uninstallнедоступно:

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

Смотрите также http://community.linuxmint.com/tutorial/view/162 и некоторые основные использование Checkinstall и Debian пакет Checkinstall .


*: Если вы читаете это после установки с make installвами, вы все равно можете следовать приведенным выше инструкциям и сделать dpkg -r $PACKAGE_NAME_YOU_CHOSENпотом.


53
Этот ответ является доказательством того, что лучшие ответы часто не получают большого количества положительных голосов. Спасибо! Я давно хотел знать, как это сделать. Я всегда стесняюсь делать «make install», потому что знаю, что удалить ее будет почти наверняка.
doug65536

1
также в книге LFS есть некоторая информация о системах управления пакетами, так как вы должны настроить ее самостоятельно. Полученная там информация должна быть полезной для того, чтобы заставить подобные вещи работать лучше (чище, более общие). Существуют сценарии, которые просто прослушивают то, что устанавливается, а затем создают сценарий, который при запуске удаляет все эти файлы или что-то в этом роде.
Nisse

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вам нужно добавить sudo для удаления:

cat install_manifest.txt | xargs echo sudo rm | sh

4
Я удивлен видеть, что это не получило никаких голосов. Это работало для удаления файлов из системы, когда не работали другие параметры. В моем случае checkinstall не смог создать deb, потому что версия программы не начиналась с цифры и поэтому не собиралась. Это сработало хорошо.
DWils

3
@DWils Я думаю, что он не получил больше голосов, потому что это довольно опасно. Дополнительно xargs echo rm | sh? Совершенно очевидно, что тот, кто предложил это, не особенно опытен или не знает, как использовать оболочку.
FSTD

4
(для справки, он будет раздражать любые символы в именах файлов, которые интерпретируются оболочкой (и тогда вы выполняете мошенническое выполнение!), кроме того, он будет выполнять все виды расширения оболочки. Просто представьте, что произойдет, если в нем install_manifest.txtсодержится звездочка ... rm *будет передан в оболочку.)
FSTD

@ fstd совершенно верно. Как обычно, такой ответ следует использовать осторожно. Проверьте файл манифеста перед запуском этой команды. Но если вы используете оболочку, я предполагаю, что вы знаете, что делаете.
три

Можете ли вы описать обстоятельства, при которых install_manifest.txtможно ожидать существование?
einpoklum

28

В зависимости от того, насколько хорошо магия makefile / configure script / autofoo рассматриваемой программы может решить вашу проблему:

make uninstall

Проблема заключается в том, что вы должны выполнить это в дереве исходников установленной версии и с точно такой же конфигурацией, которую вы использовали для установки.


19

Как удалить после "сделать установку"

Способ № 1 (сделать удаление)

Шаг 1: Вам нужно только следовать этому шагу , если вы удалили / изменили каталог сборки в любом случае: Скачать и сделать / сделать установку с помощью точного такого же процедур , как вы делали раньше.

Шаг 2: попробуйте сделать деинсталляцию.

cd $SOURCE_DIR 
sudo make uninstall

Если это удастся, вы сделали. Если вы параноик, вы также можете попробовать выполнить «Метод № 3», чтобы убедиться, что make uninstallне пропустили ни одного файла.

Метод № 2 (checkinstall - только для систем на основе 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существует в вашем исходном каталоге, он должен содержать имена файлов каждого отдельного файла, созданного установкой.

Итак, сначала проверьте список файлов и их время мод:

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

Однако у пользователя Merlyn Morgan-Graham есть серьезное замечание относительно этого метода, о котором вы должны помнить (дословно скопировано здесь): «Следите за файлами, которые также могли быть установлены другими пакетами. Простое удаление этих файлов [...] может сломать другие пакеты. " , По этой причине мы создали deleted-by-uninstallкаталог и переместили туда файлы вместо того, чтобы удалить их.


99% этого поста существовали в других ответах. Я просто собрал все полезное в (надеюсь) простом практическом руководстве и попытался уделить дополнительное внимание важным деталям (таким как цитирование аргументов xarg и хранение резервных копий удаленных файлов).


МЕТОД 2 работал на меня!
Aizzaac

10

make clean обычно очищает только встроенные файлы в каталоге, содержащем сам исходный код, и редко касается любого установленного программного обеспечения.

Как правило, файлы Makefile не содержат цели для удаления - вам обычно приходится делать это самостоятельно, удаляя файлы из каталога, в который они были установлены. Например, если вы создали программу и установил его ( с помощью 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

К сожалению, стандартов нет, это одна из опасностей установки из исходного кода. Некоторые файлы Makefile будут включать «деинсталляцию», поэтому

make uninstall

из исходного каталога может работать. Иначе, это может быть вопросом ручного удаления чего бы то make installни было.

make clean обычно просто очищает исходный каталог - удаляя сгенерированные / скомпилированные файлы и т.п., вероятно, не то, что вам нужно.


0

Я знаю несколько пакетов, которые поддерживают "make uninstall", но многие другие поддерживают make install DESTDIR = xxx "для поэтапной установки.

Вы можете использовать это для создания пакета, который вы устанавливаете, вместо того, чтобы устанавливать прямо из источника. Я не везло с Checkinstall но FPM работает очень хорошо.

Это также может помочь вам удалить пакет, ранее установленный с помощью make install . Вы просто принудительно устанавливаете собранный пакет поверх установленного, а затем удаляете его.

Например, я использовал это недавно, чтобы иметь дело с protobuf-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      

Предпочитаю ням рпм, если можете.

На 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может рассказать вам, что он знает и что он будет делать. Предположим, у вас есть цель «install», которая выполняет такие команды:

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. Переконфигурируйте вашу директорию сборки, чтобы установить ее в какую-либо другую директорию. Я обычно делаю это: --prefix=$PWD/install. Для CMake вы можете перейти в каталог сборки, открыть 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.