เหตุใด makefiles จึงควรมีเป้าหมาย“ ติดตั้ง”?


18

มาจากโลกของซีและซี ++ สร้างระบบส่วนใหญ่มีinstallเป้าหมายสะดุดตา Makefiles (ซึ่งจะมีการแนะนำโดย GNUตัวอย่าง) หรือCMake เป้าหมายนี้คัดลอกไฟล์รันไทม์ (ไฟล์เรียกทำงาน, ไลบรารี, ... ) ในระบบปฏิบัติการ (ตัวอย่างเช่นในC:\Program Files\บน Windows)

นี่รู้สึกแฮ็คจริงๆเพราะสำหรับฉันมันไม่ใช่ความรับผิดชอบของระบบบิลด์ที่จะติดตั้งโปรแกรม (ซึ่งจริงๆแล้วเป็นความรับผิดชอบของผู้จัดการระบบปฏิบัติการ / ผู้จัดการแพ็คเกจ) นอกจากนี้ยังหมายถึงระบบการสร้างหรือสคริปต์การสร้างจะต้องรู้ว่าองค์กรของโปรแกรมที่ติดตั้งพร้อมกับตัวแปรสภาพแวดล้อมตัวแปรรีจิสทรี, symlink, สิทธิ์ ฯลฯ

ที่ดีที่สุดในการสร้างระบบควรจะมีreleaseเป้าหมายที่จะส่งออกโปรแกรมที่ติดตั้ง (ตัวอย่าง.debหรือ.msi) แล้วขอให้ระบบปฏิบัติการเพื่อติดตั้งโปรแกรมที่ make uninstallนอกจากนี้ยังจะช่วยให้ผู้ใช้สามารถถอนการติดตั้งโดยไม่ต้องพิมพ์

ดังนั้นคำถามของฉัน: ทำไมระบบสร้างมักจะแนะนำให้มีinstallเป้าหมาย


7
การโต้แย้งว่า "ทำการติดตั้ง" ไม่ได้อยู่ในความรับผิดชอบของระบบการสร้าง แต่มีส่วนเกี่ยวข้องมากขึ้นและความรับผิดชอบเฉพาะแพลตฟอร์มในการสร้างแพ็คเกจที่ติดตั้งได้
pmf

2
อย่างไรก็ตาม: บางครั้งคุณต้องการติดตั้งแอปพลิเคชันที่ไม่ได้รับการจัดการโดยตัวจัดการ OS / แพ็คเกจ (เนื่องจากมีการอ้างอิงที่อาจทำให้เกิดความขัดแย้งเป็นไปไม่ได้ที่จะแก้ไขโดยใช้ตัวจัดการแพคเกจ ฯลฯ ) make installมักจะติดตั้งภายใต้/usr/local(หรือแม้กระทั่ง/opt) ซึ่งเป็นไดเรกทอรีที่ไม่ได้จัดการโดย "ระบบปฏิบัติการหลัก / ระบบการจัดการบรรจุภัณฑ์" ไม่รู้เลยว่า Windows มีแบบแผนที่คล้ายกันบ้างไหม
บากูริว

11
"นี่รู้สึกแฮ็คจริงๆ" คุณคาดหวังอะไรจากโลกแห่ง C / C ++ ;-)
Mason Wheeler

1
โปรดทราบว่าmake installไม่มีเหตุผลเมื่อเราพูดถึงการรวบรวมข้าม
Hagen von Eitzen

1
@HagenvonEitzen DESTDIRมันจะมี
Nax 'vi-vim-nvim'

คำตอบ:


23

บิลด์สคริปต์หรือ Makefiles หลายตัวมีเป้าหมายการติดตั้งเพราะถูกสร้างขึ้นก่อนที่ผู้จัดการแพ็กเกจจะมีอยู่และเพราะแม้กระทั่งทุกวันนี้ระบบจำนวนมากยังไม่มีผู้จัดการแพ็คเกจ Plus มีระบบที่make installจริงเป็นวิธีที่ต้องการในการจัดการแพคเกจ


ฉันอยากรู้เกี่ยวกับระบบที่make installเป็นที่ต้องการ นอกเหนือจากนั้นฉันหมายถึงผู้จัดการโปรแกรมเมื่อฉันบอกว่า makefiles ควรสร้างแพ็คเกจที่ติดตั้งได้ ฉันคิดว่าระบบปฏิบัติการเกือบทั้งหมดมาพร้อมกับวิธีจัดการโปรแกรมที่ติดตั้งหรือไม่ ตัวอย่างเช่น Windows ไม่มีตัวจัดการแพคเกจ (นอกเหนือจากร้านค้า) แต่ยังคงมีวิธีจัดการโปรแกรมที่ติดตั้ง (ผ่าน.msiแพ็คเกจสำหรับตัวอย่าง)
Synxis

2
@Synxis BSD, Linux, Unix ทั้งหมดใช้ makefiles ไม่ว่าจะเป็นการแนะนำการใช้พวกเขาสำหรับการติดตั้งผมไม่ทราบ make installแต่คุณมักจะมีความสามารถที่ใช้
Rob

1
ในเดเบียนอย่างน้อยก็ควรใช้checkinstallเกินmake installสองเหตุผล: "คุณสามารถลบแพ็คเกจได้ง่ายๆด้วยขั้นตอนเดียว" และ "คุณสามารถติดตั้งแพ็กเกจผลลัพธ์บนเครื่องหลายเครื่อง" - เนื่องจาก checkinstall สร้าง. deb และติดตั้งมันจะใช้ตัวจัดการแพกเกจ ...
Aaron Hall

1
@Synxis - มีการแจกแจงลินุกซ์หลายอย่าง (มักเรียกว่า source distros) ซึ่งตัวจัดการแพ็กเกจติดตั้งโปรแกรมโดยการดาวน์โหลดไฟล์ tar, คลายการบีบอัดจากนั้นเรียกใช้make install
slebetman

1
@AaronHall แก้ไขให้ถูกต้องหากฉันทำผิด แต่ฉันได้รับความประทับใจว่าการcheckinstallเรียกใช้จะใช้ จริงmake installและตรวจสอบการกระทำของการสร้างแพ็คเกจ
cmaster - คืนสถานะโมนิกา

5

A makefileอาจไม่มีinstallเป้าหมายและที่สำคัญคุณสามารถมีโปรแกรมที่ไม่ควรติดตั้งได้ (เช่นเพราะควรรันจากไดเรกทอรีการสร้างหรือเพราะสามารถติดตั้งได้ทุกที่) installเป้าหมายเป็นเพียงการประชุมสำหรับปกติmakefile-s

อย่างไรก็ตามหลายโปรแกรมต้องการให้เรียกใช้ทรัพยากรภายนอก (ตัวอย่างเช่น: แบบอักษรฐานข้อมูลไฟล์กำหนดค่า ฯลฯ ) และปฏิบัติการของพวกเขามักจะตั้งสมมติฐานเกี่ยวกับทรัพยากรเหล่านี้ ตัวอย่างเช่นbashเชลล์ของคุณโดยทั่วไปจะอ่านไฟล์เริ่มต้นบางอย่างจาก/etc/bash.bashrcฯลฯ ... ทรัพยากรเหล่านี้โดยทั่วไปในระบบไฟล์ (ดูhier (7)สำหรับข้อตกลงเกี่ยวกับลำดับชั้นของไฟล์) และเส้นทางไฟล์เริ่มต้นถูกสร้างขึ้นในปฏิบัติการของคุณ

ลองใช้สตริง (1)กับไฟล์ที่รันได้ในระบบของคุณ คุณจะพบเส้นทางไฟล์ที่ทราบ

BTW สำหรับโปรแกรม GNU จำนวนมากที่ใช้autoconfคุณสามารถเรียกใช้make install DESTDIR=/tmp/destdir/โดยไม่ต้องรูท จากนั้น/tmp/destdir/จะเต็มไปด้วยไฟล์ที่ควรได้รับการบรรจุในภายหลัง

FWIW ฉันมีแนวโน้มที่จะเชื่อว่าโปรแกรม bismon (GPLv3 + ที่ได้รับอนุญาต) ของฉัน (อธิบายไว้ในรายงาน bismon-chariot-doc.pdfของฉัน) ไม่สามารถ "ติดตั้ง" ได้ ฉันไม่แน่ใจว่าจะสามารถพิสูจน์ได้และฉันไม่สามารถจินตนาการได้ว่าฉันจะทำให้โปรแกรมนั้นติดตั้งได้อย่างไร


2
DESTDIR หรือคำนำหน้าอื่น ๆ มักถูกลืม ทันทีที่ทรัพยากรภายนอกเช่นไลบรารีแบบไดนามิกมีส่วนเกี่ยวข้องจะไม่สามารถสร้างซอฟต์แวร์โดยไม่ทราบว่าจะอยู่ที่ใดติดตั้งที่ใด ยังเหมาะสำหรับการติดตั้งไปยังสถานที่ที่ไม่ได้มาตรฐานเช่นหรือเข้าไป/opt $HOMEวิธีเดียวที่จะหลีกเลี่ยงคำนำหน้าที่แตกต่างกันคือการใช้ภาชนะบรรจุ แต่แน่นอนว่าเป็นโซลูชันเฉพาะของ Linux
amon

2
ฉันเห็นมากกว่าหนึ่งแพ็คเกจว่าถ้าคุณลอง DESTDIR = / tmp / destdir จะไม่ทำงานในภายหลังเมื่อติดตั้งไปยังตำแหน่งปกติเนื่องจาก DESTDIR ถูกใช้ในการสร้างพา ธ
โจชัว

@ มอน: ฉันไม่แน่ใจว่าฉันจะกำหนดลักษณะภาชนะเป็นเฉพาะ Linux Linux อาจเป็นแพลตฟอร์มเป้าหมายทั่วไปสำหรับการจัดทำคอนเทนเนอร์ แต่เทคโนโลยีคอนเทนเนอร์บางรูปแบบมีอยู่ในระบบปฏิบัติการที่ทันสมัย
เควิน

1
@Joshua ไม่ควร DESTDIR ควรเกี่ยวข้องในระหว่างขั้นตอนการติดตั้งเท่านั้น คุณควรจะทำ: ./configure --prefix="/opt/foo" && make && DESTDIR=/tmp/foo make install และสามารถย้ายแพ็คเกจไปได้/opt/fooโดยไม่มีปัญหาใด ๆ
Nax 'vi-vim-nvim'

3

มีหลายเหตุผลที่นึกขึ้นมาได้

  • ซอฟต์แวร์สร้างแพคเกจจำนวนมาก - ตัวอย่างเช่นระบบสร้างDebianและ IIRC rpm เช่นกัน - คาดว่าจากสคริปต์การสร้างเพื่อ "ติดตั้ง" โปรแกรมไปยังไดเรกทอรีย่อยพิเศษบางอย่าง ดังนั้นจึงขับเคลื่อนด้วยความเข้ากันได้ย้อนหลังในทั้งสองทิศทาง
  • ผู้ใช้อาจต้องการติดตั้งซอฟต์แวร์ลงในพื้นที่ท้องถิ่นเช่นใน$HOMEไดเรกทอรี ผู้จัดการแพคเกจไม่สนับสนุนทั้งหมด
  • อาจยังมีสภาพแวดล้อมที่ไม่มีแพ็คเกจ

ฉันตั้งคำถามใหม่ฉันหมายถึงผู้จัดการโปรแกรมเมื่อฉันบอกว่า makefiles ควรสร้างแพ็คเกจที่ติดตั้งได้
ซินซิส

1

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

สมมติว่าคุณกำลังใช้โครงการโอเพ่นซอร์ส FOO ซึ่งปัจจุบันเป็นรุ่น 2.0.1 และคุณกำลังใช้รุ่น 1.3.0 คุณไม่ต้องการใช้อะไรข้างต้นเนื่องจากรุ่น 2.0.0 ไม่เข้ากันกับสิ่งที่คุณกำลังทำอยู่ แต่มีการแก้ไขข้อผิดพลาดเดียวใน 2.0.1 ที่คุณต้องการอย่างยิ่ง การมีmake installตัวเลือกให้คุณติดตั้งซอฟต์แวร์ 1.3.0 ที่ถูกดัดแปลงโดยไม่ต้องกังวลกับการสร้างแพ็คเกจและติดตั้งในระบบของคุณ


1

การกระจาย Linux โดยทั่วไปแยกการบำรุงรักษาโปรแกรมจากการบำรุงรักษาแพคเกจ ระบบการสร้างที่รวมการสร้างแพ็คเกจจะบังคับให้ผู้ดูแลโปรแกรมดำเนินการบำรุงรักษาแพ็คเกจด้วย

นี่เป็นความคิดที่ไม่ดี การแจกจ่ายมีโครงสร้างพื้นฐานจำนวนมากเพื่อตรวจสอบความสอดคล้องภายในให้ไบนารีสำหรับแพลตฟอร์มเป้าหมายหลายดำเนินการเปลี่ยนแปลงเล็กน้อยเพื่อรวมกับส่วนที่เหลือของระบบและให้ประสบการณ์ที่สอดคล้องสำหรับผู้ใช้รายงานข้อบกพร่อง

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

นี่เป็นหนึ่งในปัญหา "ด้านบนสุดของห่วงโซ่อาหาร" ซึ่งเป็นเรื่องปกติในระบบหลายฝ่าย หากคุณมีระบบที่ซับซ้อนหลายระบบจำเป็นต้องมีลำดับชั้นที่ชัดเจนว่าระบบใดที่รับผิดชอบในการประสานงานระบบอื่นทั้งหมด

ในกรณีของการจัดการการติดตั้งซอฟต์แวร์ตัวจัดการแพคเกจเป็นส่วนประกอบนี้และมันจะเรียกใช้ระบบการสร้างของแพคเกจจากนั้นนำเอาข้อมูลผ่านอินเทอร์เฟซที่สะดวก ("ไฟล์ในไดเรกทอรีหลังจากขั้นตอนการติดตั้ง") สร้างแพ็คเกจและเตรียม เพื่ออัพโหลดไปยังที่เก็บ

ตัวจัดการแพ็กเกจยืนอยู่ตรงกลางระหว่างระบบบิลด์และที่เก็บที่นี่และอยู่ในตำแหน่งที่ดีที่สุดในการผสานรวมเข้ากับทั้งสองอย่างได้ดี

คุณอาจสังเกตเห็นว่ามีเพียงไม่กี่แพคเกจจาวาสคริปต์ที่มีให้ใช้npmงานผ่านapt- นี่เป็นเพราะคนจาวาสคริปต์ตัดสินใจว่าnpmและพื้นที่เก็บข้อมูลที่เกี่ยวข้องจะเป็นด้านบนของห่วงโซ่อาหารของพวกเขาซึ่งทำให้มันเป็นไปไม่ได้ จัดส่งแพ็คเกจเหล่านี้เป็นแพ็คเกจ Debian

ด้วยการเปิดใช้ Debian Developer hat ของฉัน: ถ้าคุณปล่อยซอฟต์แวร์โอเพนซอร์ซกรุณาทิ้งบรรจุภัณฑ์ไว้กับผู้ดูแลการแจกจ่าย มันช่วยทั้งคุณและเราทำงานเยอะ


คุณไม่ได้พูดอะไรเกี่ยวกับสาเหตุที่มีเป้าหมายในการติดตั้งและสำหรับฉันแล้วสิ่งที่คุณเขียนส่วนใหญ่จะนำไปใช้กับมันเช่นกัน ...
อยากรู้อยากเห็น dannii

1
@crowndannii จำเป็นต้องมีส่วนต่อประสานระหว่าง build system และ package manager และสิ่งนี้เกิดขึ้นได้ง่ายที่สุดดังนั้นมันจึงชนะ
Simon Richter

1

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

เขาสามารถเขียนสคริปต์การติดตั้งด้วยชื่อที่กำหนดเองหรืออาจเป็นส่วนหนึ่งของขั้นตอนของสคริปต์อื่น อย่างไรก็ตามการมีคำสั่งติดตั้งมาตรฐานmake install(การประชุมที่ลงวันที่ก่อนหน้านี้ผู้จัดการแพคเกจ) มันกลายเป็นเรื่องง่ายที่จะสร้างแพคเกจ ถ้าคุณมองไปที่แม่แบบ PKGBUILD สำหรับการทำแพคเกจ ArchLinuxmake DESTDIR="$pkgdir/" installคุณจะเห็นว่าฟังก์ชั่นแพคเกจที่จริงก็ไม่ได้ อาจใช้งานได้กับแพ็คเกจส่วนใหญ่และอาจมีการปรับเปลี่ยนเล็กน้อย ขอบคุณmake(และ autotools) เป็นมาตรฐานบรรจุภัณฑ์เป็นเรื่องง่ายจริงๆ

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