Apa kebalikan dari 'make install', yaitu bagaimana Anda menghapus instalan perpustakaan di Linux?

396

Sambil berlari

./configure --prefix=/mingw 

pada sistem MinGW / MSYS untuk perpustakaan yang sebelumnya saya jalankan

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

Saya menemukan pesan ini:

PERINGATAN: Versi SDK plugin Vamp sudah diinstal. Harapkan kekhawatiran dan kesedihan jika Anda menginstal versi baru tanpa menghapus yang lama terlebih dahulu. (Melanjutkan)

Ini membuat saya khawatir. Apa kebalikan dari 'make install', yaitu bagaimana perpustakaan dihapus instalannya di Linux? Akankah 'membersihkan' melakukan pekerjaan, atau apakah ada langkah lain yang terlibat?

Alex Riley
sumber
serverfault.com/questions/422237/…
Ciro Santilli 郝海东 冠状 病 六四 事件 事件 法轮功
1
Lihat askubuntu.com/questions/87111/… untuk jawaban serupa, solusi utama saat ini tampaknya adalah sudo make uninstalljika file konfigurasi instalasi masih tersedia tetapi tidak ada solusi lain yang jelas jika tidak, selain menghapus instalasi dengan utilitas manajemen paket sistem jika diinstal dengan "checkinstall "utilitas.
Edward
7
Setelah menjalankan, make installsaya tidak perlu make uninstallmenghapusnya. Saya selalu menggunakanxargs rm < install_manifest.txt
John Strood

Jawaban:

508

make cleanmenghapus file antara atau output dari source / build tree Anda. Namun, itu hanya memengaruhi pohon source / build; itu tidak menyentuh sisa sistem file dan tidak akan menghapus perangkat lunak yang diinstal sebelumnya.

Jika Anda beruntung, berlari make uninstallakan berhasil. Namun, penulis perpustakaan harus menyediakannya; beberapa penulis memberikan uninstalltarget, yang lain tidak.

Jika Anda tidak beruntung, Anda harus menghapusnya secara manual. Menjalankan make -n installdapat bermanfaat, karena akan menunjukkan langkah-langkah yang akan dilakukan perangkat lunak untuk menginstalnya sendiri tetapi tidak akan benar-benar melakukan apa pun. Anda kemudian dapat membalikkan langkah-langkah tersebut secara manual.

Josh Kelley
sumber
10
+1; Watch out for file yang mungkin juga telah diinstal oleh paket lain. Cukup menghapus file-file ini (satu interpretasi "membalikkan langkah-langkah itu secara manual") dapat merusak paket lain. Inilah (salah satu dari banyak alasan) mengapa manajer paket ditemukan.
Merlyn Morgan-Graham
3
ini hanya mungkin jika Anda menyimpan direktori build yang dikonfigurasikan dan dikompilasi yang sama, benar? jadi tidak terlalu berguna karena kebanyakan orang akan menghapusnya setelah menginstal. Dia ingin menghapus instalan sesuatu tanpa peduli apakah dia menyimpan folder build, dan terlepas dari apakah paket telah dikonfigurasi dengan benar untuk opsi make uninstall. Klarifikasi: apa yang ingin dia lakukan adalah mengaktifkan semacam manajemen untuk paket yang berfungsi untuk hal-hal yang dia susun sendiri.
Nisse
360

Jika sudo make uninstalltidak tersedia:

Dalam sistem berbasis Debian, alih-alih (atau setelah *) melakukan make installAnda dapat menjalankan sudo checkinstalluntuk membuat .debfile yang terinstal secara otomatis. Anda kemudian dapat menghapusnya menggunakan manajer paket sistem (misalnya apt/ synaptic/ aptitude/ dpkg). Checkinstall juga mendukung pembuatan jenis paket lain, misalnya RPM.

Lihat juga http://community.linuxmint.com/tutorial/view/162 dan beberapa penggunaan dasar checkinstall dan paket debian checkinstall .


*: Jika Anda membaca ini setelah menginstal dengan make installAnda masih dapat mengikuti instruksi di atas dan melakukan dpkg -r $PACKAGE_NAME_YOU_CHOSENsesudahnya.

Nisse
sumber
53
Jawaban ini adalah bukti bahwa jawaban terbaik seringkali tidak mendapatkan banyak suara. Terima kasih! Saya ingin tahu bagaimana melakukan ini untuk waktu yang lama. Saya selalu ragu melakukan "make install" karena saya tahu hampir pasti akan sulit untuk dihapus.
doug65536
1
juga buku LFS memiliki beberapa informasi tentang sistem manajemen paket, Karena Anda harus mengaturnya sendiri. Informasi yang ada di sana harus membantu agar hal semacam ini bekerja lebih baik (lebih bersih, lebih umum). Ada skrip yang hanya mendengarkan apa yang diinstal dan kemudian membuat skrip yang ketika diluncurkan menghapus semua file itu, atau sesuatu seperti itu.
Nisse
13
Ini bekerja dengan baik untuk saya, meskipun saya sudah menjalankannya make installsebelum menggunakannya checkinstall.
LukeGT
9
Instal paket checkinstalluntuk jawaban yang sangat bagus ini untuk bekerja.
quimnuss
1
Demikian pula dengan apa yang dikomentari oleh pengguna "LukeGT", jika file konfigurasi instalasi tidak tersedia tetapi file installernya, mereka dapat dikompilasi dan diinstal dengan checkinstalldan jika kompilasi baru dibuat dengan pengaturan yang sama seperti yang lama, menghapus paket yang diinstal dengan checkinstallharus menghapus file yang diinstal sebelumnya.
Edward
62

Jika Anda memiliki manifestfile yang mencantumkan semua file yang diinstal dengan make installAnda, Anda dapat menjalankan perintah ini dari jawaban lain:

cat install_manifest.txt | xargs echo rm | sh

Jika sudah, sudo make installAnda perlu menambahkan sudo ke uninstall Anda:

cat install_manifest.txt | xargs echo sudo rm | sh
tiga
sumber
4
Saya terkejut melihat ini tidak mendapatkan upvotes. Ini berfungsi untuk menghapus file dari sistem ketika tidak ada opsi lain yang berfungsi. Dalam kasus saya, checkinstall tidak dapat membuat deb karena versi program tidak dimulai dengan angka, dan karenanya tidak dapat dibangun. Ini bekerja dengan baik.
DWils
3
@DWils Saya pikir itu tidak menerima lebih banyak upvotes karena sangat berbahaya. Selain itu xargs echo rm | sh,? Cukup jelas bahwa siapa pun yang menyarankan ini tidak terlalu berpengalaman atau berpengetahuan dalam menggunakan shell.
fstd
4
(untuk referensi, itu akan muntah pada setiap karakter dalam nama file yang ditafsirkan oleh shell (dan kemudian Anda memiliki rm 'rm sedang dieksekusi!), Selain itu akan melakukan segala macam ekspansi shell. Bayangkan apa yang terjadi jika install_manifest.txtmengandung asterisk ... rm *akan disalurkan ke shell.) Diturunkan, untuk alasan ini.
fstd
@ benar benar. Seperti biasa jawaban semacam ini harus digunakan dengan hati-hati. Periksa file manifes sebelum Anda menjalankan perintah ini. Tetapi jika Anda menggunakan shell saya berasumsi Anda tahu apa yang Anda lakukan.
tiga
Bisakah Anda menggambarkan keadaan di mana sebuah install_manifest.txtdiharapkan bisa ada?
einpoklum
28

Tergantung pada seberapa baik makefile / configure script / autofoo magic dari program yang dimaksud adalah hal berikut ini dapat menyelesaikan masalah Anda:

make uninstall

Masalahnya adalah Anda harus menjalankan ini pada pohon sumber dari versi yang telah Anda instal dan dengan konfigurasi yang sama persis dengan yang Anda gunakan untuk menginstal.

Joachim Sauer
sumber
19

Cara menghapus instalasi setelah "make install"

Metode # 1 (hapus penginstalan)

Langkah 1: Anda hanya perlu mengikuti langkah ini jika Anda telah menghapus / mengubah direktori build dengan cara apa pun: Unduh dan buat / buat instal menggunakan prosedur yang sama persis seperti yang Anda lakukan sebelumnya.

Langkah 2: coba buat hapus instalan.

cd $SOURCE_DIR 
sudo make uninstall

Jika ini berhasil Anda selesai. Jika Anda paranoid, Anda juga dapat mencoba langkah-langkah "Metode # 3" untuk memastikan make uninstalltidak ada file yang terlewatkan.

Metode # 2 (checkinstall - hanya untuk sistem berbasis debian)

Tinjauan umum proses

Dalam sistem berbasis debian (misalnya Ubuntu) Anda dapat membuat .debpaket dengan sangat mudah menggunakan alat bernama checkinstall. Anda kemudian menginstal paket deb. (Ini akan membuat sistem debian Anda menyadari bahwa semua bagian dari paket Anda memang telah diinstal) dan akhirnya uninstall untuk membiarkan manajer paket Anda dengan benar membersihkan sistem Anda.

Selangkah demi selangkah

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

Pada titik ini checkinstallakan muncul nama paket. Masukkan sesuatu yang sedikit deskriptif dan catat karena Anda akan menggunakannya sebentar lagi. Ini juga akan meminta beberapa data lagi yang dapat Anda abaikan. Jika mengeluh tentang versi yang tidak dapat diterima, cukup masukkan sesuatu yang masuk akal 1.0. Ketika selesai, Anda dapat menginstal dan akhirnya menghapus:

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

Metode # 3 (install_manifest.txt)

Jika install_manifest.txtada file dalam direktori sumber Anda, file tersebut harus berisi nama file dari setiap file yang dibuat oleh instalasi.

Jadi pertama-tama periksa daftar file dan mod-waktunya:

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

Anda harus mendapatkan nol kesalahan dan waktu mod dari file yang terdaftar harus pada atau setelah waktu instalasi. Jika semuanya OK, Anda dapat menghapusnya sekaligus:

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

Pengguna Merlyn Morgan-Graham memiliki pemberitahuan serius mengenai metode ini yang harus Anda ingat (disalin di sini kata demi kata): "Hati-hati terhadap file yang mungkin juga diinstal oleh paket lain. Cukup menghapus file-file ini [...] bisa hancurkan paket-paket lainnya. " . Itulah alasan mengapa kami membuat deleted-by-uninstalldir dan memindahkan file ke sana alih-alih menghapusnya.


99% dari posting ini ada di jawaban lain. Saya baru saja mengumpulkan segala sesuatu yang berguna dalam (mudah-mudahan) mudah untuk diikuti dan mencoba memberikan perhatian ekstra pada detail penting (seperti mengutip argumen xarg dan menyimpan cadangan file yang dihapus).

ndemou
sumber
METODE 2 berhasil untuk saya!
Aizzaac
10

make clean umumnya hanya membersihkan file yang dibangun dalam direktori yang berisi kode sumber itu sendiri, dan jarang menyentuh perangkat lunak yang diinstal.

Makefiles umumnya tidak mengandung target untuk penghapusan instalasi - Anda biasanya harus melakukannya sendiri, dengan menghapus file dari direktori tempat mereka diinstal. Sebagai contoh, jika Anda membangun sebuah program dan diinstal (menggunakan make install) ke /usr/local, Anda akan ingin melihat melalui /usr/local/bin, /usr/local/libexec, /usr/local/share/man, dll, dan menghapus file yang tidak diinginkan. Terkadang Makefile menyertakan uninstalltarget, tetapi tidak selalu.

Tentu saja, biasanya pada sistem Linux Anda menginstal perangkat lunak menggunakan manajer paket , yang mampu menghapus instalasi perangkat lunak "secara otomatis".

mipadi
sumber
8

Utilitas "stow" dirancang untuk mengatasi masalah ini: http://www.gnu.org/software/stow/

jjw
sumber
5
Bagaimana cara menggunakan stowuntuk mengatasi masalah ini?
3D1T0R
Utilitas penyimpanan mendorong Anda untuk menginstal setiap versi ke lokasi yang terpisah sehingga Anda dapat mengelola beberapa versi di mesin yang sama. Jika Anda melakukan ini, menghapus instalan dapat dengan mudah menghapus seluruh direktori instalasi.
Bruce Adams
6

Sayangnya tidak ada standar, ini adalah salah satu risiko memasang dari sumber. Beberapa Makefiles akan menyertakan "uninstall", jadi

make uninstall

dari direktori sumber dapat berfungsi. Kalau tidak, itu mungkin masalah membatalkan apa pun yang make installdilakukan secara manual .

make clean biasanya hanya membersihkan direktori sumber - menghapus file yang dihasilkan / dikompilasi dan sejenisnya, mungkin bukan apa yang Anda cari.

Brenton Alker
sumber
0

Saya tahu beberapa paket yang mendukung "make uninstall" tetapi banyak lagi yang mendukung make install DESTDIR = xxx "untuk instalasi bertahap.

Anda dapat menggunakan ini untuk membuat paket yang Anda instal alih-alih menginstal langsung dari sumbernya. Saya tidak beruntung dengan checkinstall tetapi fpm bekerja dengan sangat baik.

Ini juga dapat membantu Anda menghapus paket yang sebelumnya diinstal menggunakan make install . Anda cukup memaksa menginstal paket bawaan Anda di atas paket make instal dan kemudian mencopotnya.

Sebagai contoh, saya menggunakan ini baru-baru ini untuk menangani protobuf-3.3.0. Di 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      

Lebih suka yum ke rpm jika Anda bisa.

Di 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

Lebih suka apt ke dpkg di mana Anda bisa.

Saya juga memposting jawaban ini di sini

Bruce Adams
sumber
0

Makedapat memberi tahu Anda apa yang ia ketahui dan apa yang akan dilakukannya. Misalkan Anda memiliki target "instal", yang mengeksekusi perintah seperti:

cp <filelist> <destdir>/

Dalam aturan umum Anda, tambahkan:

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

Trik serupa dapat dilakukan secara umum make clean.

Mischa
sumber
0

Pembukaan

di bawah ini dapat berfungsi atau tidak, ini semua diberikan apa adanya, Anda dan hanya Anda yang bertanggung jawab jika terjadi kerusakan, kehilangan data, dan sebagainya. Tapi saya harap semuanya berjalan lancar!

Untuk membatalkan make installsaya akan melakukan (dan saya lakukan) ini:

Ide: periksa skrip apa pun yang diinstal dan batalkan ini dengan skrip bash sederhana.

  1. Konfigurasikan ulang dir build Anda untuk menginstal ke beberapa dir kustom. Saya biasanya melakukan ini: --prefix=$PWD/install. Untuk CMake, Anda bisa pergi ke dir build Anda, buka CMakeCache.txt, dan perbaiki nilai CMAKE_INSTALL_PREFIX.
  2. Instal proyek ke direktori khusus (jalankan make installlagi).
  3. Sekarang kita dorong dari asumsi, make installskrip itu menginstal ke dir kustom hanya konten yang sama yang ingin Anda hapus dari tempat lain (biasanya /usr/local). Jadi, kita perlu skrip. 3.1. Script harus membandingkan dir kustom, dengan dir yang ingin Anda bersihkan. Saya menggunakan ini:

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. Sekarang jalankan skrip ini (ini akan kering-lari)

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

Misalnya Anda tidak ingin membersihkan / usr / local, dan direktori instalasi khusus Anda adalah /user/me/llvm.build/install, maka itu akan menjadi

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

3.3. Periksa log dengan cermat, jika perintah baik untuk Anda, batalkan komentar rm $RM_DIR/$fndan jalankan lagi. Tapi berhentilah! Apakah Anda benar-benar memeriksa dengan cermat? Bisa cek lagi?

Sumber untuk instruksi: https://dyatkovskiy.com/2019/11/26/anti-make-install/

Semoga berhasil!

Stepan Dyatkovskiy
sumber