สิ่งที่ตรงกันข้ามกับ '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ว่าจะยังคงมีไฟล์การกำหนดค่าการติดตั้ง แต่ไม่มีวิธีแก้ไขปัญหาอื่นที่ชัดเจนถ้าไม่ติดตั้งนอกเหนือจากการถอนการติดตั้งยูทิลิตีการจัดการแพคเกจระบบ ยูทิลิตี้
Edward

7
หลังจากทำงานmake installฉันไม่จำเป็นต้องmake uninstallลบออก ฉันใช้เสมอxargs rm < install_manifest.txt
John Strood

คำตอบ:


508

make cleanลบไฟล์ระดับกลางหรือไฟล์เอาต์พุตใด ๆ ออกจากซอร์ส / บิลด์ทรีของคุณ อย่างไรก็ตามมันจะมีผลกับต้นไม้ที่มา / สร้าง; มันไม่ได้สัมผัสส่วนที่เหลือของระบบไฟล์และดังนั้นจะไม่ลบซอฟต์แวร์ที่ติดตั้งไว้ก่อนหน้านี้

หากคุณโชคดีการทำงานmake uninstallจะได้ผล อย่างไรก็ตามมันขึ้นอยู่กับผู้เขียนของห้องสมุดที่จะให้สิ่งนั้นอย่างไรก็ตาม ผู้เขียนบางคนให้uninstallเป้าหมาย แต่คนอื่นทำไม่ได้

หากคุณไม่โชคดีคุณจะต้องถอนการติดตั้งด้วยตนเอง การทำงานmake -n installจะมีประโยชน์เนื่องจากจะแสดงขั้นตอนที่ซอฟต์แวร์ใช้ในการติดตั้งตัวเอง แต่จะไม่ทำอะไรเลย จากนั้นคุณสามารถย้อนกลับขั้นตอนเหล่านั้นได้ด้วยตนเอง


10
+1; ระวังไฟล์ที่อาจถูกติดตั้งโดยแพ็คเกจอื่น เพียงแค่การลบไฟล์เหล่านี้ (การตีความหนึ่งของ "การย้อนกลับขั้นตอนเหล่านั้นด้วยตนเอง") อาจทำให้แพ็คเกจอื่น ๆ เสียหายได้ นี่คือ (หนึ่งในหลายเหตุผล) สาเหตุที่ผู้จัดการแพคเกจถูกคิดค้น
Merlyn Morgan-Graham

3
เป็นไปได้เฉพาะถ้าคุณเก็บไดเรกทอรีบิลด์ที่คอมไพล์แล้วที่คอมไพล์แล้วใช่ไหม? ดังนั้นจึงไม่ค่อยมีประโยชน์เพราะคนส่วนใหญ่จะลบมันหลังจากติดตั้ง เขาต้องการถอนการติดตั้งสิ่งต่าง ๆ โดยไม่คำนึงว่าเขาเก็บโฟลเดอร์บิลด์ไว้หรือไม่และหากแพ็กเกจนั้นได้รับการกำหนดค่าอย่างถูกต้องสำหรับตัวเลือกการถอนการติดตั้ง การชี้แจง: สิ่งที่เขาต้องการทำคือเปิดใช้งานการจัดการบางอย่างสำหรับแพ็คเกจที่เหมาะกับสิ่งที่เขารวบรวมเอง
Nisse

360

ถ้า sudo make uninstallไม่พร้อมใช้งาน:

ในระบบที่ใช้เดเบียนแทน (หรือหลังจาก *) make installคุณสามารถเรียกใช้sudo checkinstallเพื่อสร้าง.debไฟล์ที่ได้รับการติดตั้งโดยอัตโนมัติ จากนั้นคุณสามารถลบออกได้โดยใช้ตัวจัดการแพ็คเกจระบบ (เช่นapt/ synaptic/ aptitude/ dpkg)Checkinstallยังรองรับการสร้างแพ็คเกจประเภทอื่นเช่น RPM

ดูเพิ่มเติมhttp://community.linuxmint.com/tutorial/view/162และบางส่วนใช้ checkinstall พื้นฐานและแพคเกจ checkinstall เดเบียน


*: หากคุณอ่านข้อความนี้หลังจากติดตั้งแล้วmake installคุณยังคงสามารถปฏิบัติตามคำแนะนำข้างต้นและทำdpkg -r $PACKAGE_NAME_YOU_CHOSENต่อไป


53
คำตอบนี้เป็นข้อพิสูจน์ว่าคำตอบที่ดีที่สุดมักไม่ได้รับการโหวตมากนัก ขอบคุณ! ฉันต้องการทราบวิธีการทำสิ่งนี้มาเป็นเวลานาน ฉันมักจะลังเลที่จะทำการ "ติดตั้ง" เพราะฉันรู้ว่าเกือบจะเป็นความเจ็บปวดที่จะลบออก
doug65536

1
หนังสือ LFS ยังมีข้อมูลบางอย่างเกี่ยวกับระบบการจัดการบรรจุภัณฑ์เนื่องจากคุณต้องตั้งค่าด้วยตัวเอง ข้อมูลที่ควรมีประโยชน์ในการทำให้สิ่งนี้ดีขึ้น (สะอาดกว่าทั่วไปมากขึ้น) มีสคริปต์ที่ฟังสิ่งที่ได้รับการติดตั้งแล้วสร้างสคริปต์ที่เมื่อเปิดใช้งานจะลบไฟล์เหล่านั้นทั้งหมดหรืออะไรทำนองนั้น
Nisse

13
มันใช้งานได้ดีสำหรับฉันแม้ว่าฉันจะใช้งานmake installมาก่อนcheckinstallแล้วก็ตาม
LukeGT

9
ติดตั้งแพคเกจcheckinstallสำหรับคำตอบที่ยอดเยี่ยมในการทำงาน
quimnuss

1
เช่นเดียวกับสิ่งที่ผู้ใช้ "LukeGT" แสดงความคิดเห็นหากไฟล์การกำหนดค่าการติดตั้งไม่สามารถใช้งานได้ แต่ไฟล์ตัวติดตั้งนั้นสามารถคอมไพล์และติดตั้งได้checkinstallและหากการคอมไพล์ใหม่ทำด้วยการตั้งค่าเดียวกับอันเก่า กับcheckinstallควรลบไฟล์ที่ติดตั้งก่อนหน้า
Edward

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
ฉันประหลาดใจที่เห็นว่าไม่ได้รับ upvotes ใด ๆ สิ่งนี้ทำงานเพื่อลบไฟล์ออกจากระบบเมื่อไม่มีตัวเลือกอื่นทำงาน ในกรณีของฉัน checkinstall ไม่สามารถสร้าง deb ได้เนื่องจากรุ่นของโปรแกรมไม่ได้ขึ้นต้นด้วยตัวเลขดังนั้นจะไม่สร้าง มันใช้งานได้ดี
DWils

3
@Dils ฉันคิดว่ามันไม่ได้รับ upvotes มากขึ้นเพราะมันค่อนข้างอันตราย นอกจากนี้xargs echo rm | sh? ค่อนข้างชัดเจนว่าใครก็ตามที่แนะนำสิ่งนี้ไม่ได้มีประสบการณ์โดยเฉพาะหรือมีความรู้ในการใช้เชลล์
fstd

4
(สำหรับการอ้างอิงก็จะ barf ตัวอักษรใด ๆ ในชื่อไฟล์ที่มีการตีความโดยเปลือก (แล้วคุณมีโกง 'RM ของถูกประหารชีวิต!) นอกจากนี้ก็จะทำทุกประเภทของการขยายตัวเปลือก. แค่คิดว่าเกิดอะไรขึ้นถ้าinstall_manifest.txtมีเครื่องหมายดอกจัน ... rm *จะถูกไพพ์ลงในเชลล์) Downvoted ด้วยเหตุผลนี้
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 (ตรวจสอบการติดตั้ง - เฉพาะสำหรับระบบที่ใช้เดเบียน)

ภาพรวมของกระบวนการ

ในเดเบียนตามระบบ (เช่น Ubuntu) คุณสามารถสร้างแพคเกจได้อย่างง่ายดายมากโดยใช้เครื่องมือที่มีชื่อว่า.deb checkinstallจากนั้นคุณติดตั้งแพคเกจ. deb (ซึ่งจะทำให้ระบบเดเบียนของคุณรู้ว่าทุกส่วนของแพ็คเกจของคุณได้รับการติดตั้งแล้ว) และสุดท้ายถอนการติดตั้งเพื่อให้ผู้จัดการแพคเกจของคุณทำการล้างระบบอย่างถูกต้อง

เป็นขั้นเป็นตอน

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มีอยู่ในแหล่งที่มาของคุณควรมีชื่อไฟล์ของทุกไฟล์เดียวที่การติดตั้งสร้างขึ้น

ดังนั้นก่อนตรวจสอบรายการของไฟล์และ mod-time:

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

คุณควรจะได้รับข้อผิดพลาดเป็นศูนย์และ mod-times ของไฟล์ที่แสดงควรอยู่ในหรือหลังเวลาการติดตั้ง หากทั้งหมดเป็นปกติคุณสามารถลบได้ในครั้งเดียว:

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

ผู้ใช้ Merlyn Morgan-Graham มีข้อสังเกตที่ร้ายแรงเกี่ยวกับวิธีนี้ที่คุณควรจำไว้ (คัดลอกที่นี่ทุกคำ): "ระวังไฟล์ที่อาจถูกติดตั้งโดยแพ็คเกจอื่น ๆ เพียงแค่ลบไฟล์เหล่านี้ [... ] ทำลายแพ็คเกจอื่น ๆ " . นั่นคือเหตุผลที่เราได้สร้างdeleted-by-uninstalldir และย้ายไฟล์ไว้ที่นั่นแทนที่จะลบทิ้ง


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

ยูทิลิตี้การจัดเก็บสนับสนุนให้คุณติดตั้งแต่ละเวอร์ชันไปยังตำแหน่งที่แยกต่างหากเพื่อให้คุณสามารถจัดการหลายรุ่นในเครื่องเดียวกัน หากคุณทำสิ่งนี้การถอนการติดตั้งอาจทำได้ง่ายเหมือนการลบไดเรกทอรีการติดตั้งทั้งหมด
Bruce Adams

6

ไม่มีมาตรฐานที่น่าเสียดายนี่เป็นหนึ่งในอันตรายของการติดตั้งจากแหล่งที่มา Makefiles บางตัวจะมี "ถอนการติดตั้ง" ดังนั้น

make uninstall

จากไดเรกทอรีแหล่งอาจทำงานได้ มิฉะนั้นอาจเป็นเรื่องของการเลิกทำสิ่งที่make installทำด้วยตนเอง

make clean โดยปกติจะล้างข้อมูลไดเรกทอรีต้นทางโดยการลบไฟล์ที่สร้าง / รวบรวมแล้วและสิ่งที่คล้ายกันซึ่งอาจไม่ใช่สิ่งที่คุณต้องการ


0

ฉันรู้แพคเกจบางอย่างที่รองรับ "ถอนการติดตั้ง" แต่อีกมากมายที่รองรับทำการติดตั้ง DESTDIR = xxx "สำหรับการติดตั้งตามฉาก

คุณสามารถใช้สิ่งนี้เพื่อสร้างแพ็คเกจที่คุณติดตั้งแทนการติดตั้งโดยตรงจากแหล่งที่มา ฉันไม่มีโชคกับ checkinstall แต่fpmทำงานได้ดีมาก

นอกจากนี้ยังสามารถช่วยให้คุณเอาแพคเกจก่อนหน้านี้ติดตั้งโดยใช้ให้ติดตั้ง คุณเพียงแค่บังคับให้ติดตั้งแพคเกจที่สร้างขึ้นของคุณเหนือการติดตั้งแพคเกจแล้วถอนการติดตั้ง

ตัวอย่างเช่นฉันใช้สิ่งนี้เมื่อเร็ว ๆ นี้เพื่อจัดการกับ 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      

ต้องการ 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

ชอบฉลาดถึง dkg ที่คุณสามารถทำได้

ฉันโพสต์คำตอบไว้ที่นี่ด้วย


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ฉันจะทำสิ่งนี้ (และฉันทำ):

แนวคิด: ตรวจสอบสิ่งที่สคริปต์ติดตั้งและยกเลิกสิ่งนี้ด้วยสคริปต์ทุบตีแบบง่าย

  1. กำหนดค่า build dir ของคุณใหม่เพื่อติดตั้งกับ dir ที่กำหนดเอง --prefix=$PWD/installฉันมักจะทำสิ่งนี้: สำหรับ CMake คุณสามารถไปที่ build ของคุณเปิด CMakeCache.txt และแก้ไขค่า CMAKE_INSTALL_PREFIX
  2. ติดตั้งโครงการไปยังไดเรกทอรีที่กำหนดเอง (เพิ่งทำงานmake installอีกครั้ง)
  3. ตอนนี้เราเปลี่ยนจากสมมติฐานmake installสคริปต์นั้นติดตั้งลงใน dir ที่กำหนดเองเพียงเนื้อหาเดียวกับที่คุณต้องการลบออกจากที่อื่น (ปกติ/usr/local) ดังนั้นเราต้องการสคริปต์ 3.1 สคริปต์ควรเปรียบเทียบ dir ที่กำหนดเองกับ dir ที่คุณต้องการทำความสะอาด ฉันใช้สิ่งนี้:

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 และ dir การติดตั้งแบบกำหนดเองของคุณคือ /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/

โชคดี!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.