จะสร้างแพ็คเกจ Debian / Ubuntu จากซอร์สได้อย่างไร


117

ฉันมีแหล่งที่มาของโปรแกรม (นำมาจาก cvs / svn / git / ... ) และฉันต้องการสร้างแพ็คเกจ Debian / Ubuntu สำหรับมัน แพคเกจมีอยู่ในที่เก็บ แต่:

  • เป็นรุ่นเก่ากว่า (ไม่มีคุณสมบัติที่ฉันต้องการ)
  • ฉันต้องการตัวเลือกการคอมไพล์ที่แตกต่างจากค่าเริ่มต้นเล็กน้อย

วิธีที่ง่ายที่สุดในการทำคืออะไร? ฉันกังวลเกี่ยวกับสองสิ่ง

  • ฉันจะตรวจสอบได้อย่างไรว่าฉันระบุการอ้างอิงทั้งหมดอย่างถูกต้องหรือไม่? (ฉันสามารถรับคำแนะนำได้โดยดูว่าเวอร์ชันเก่าขึ้นอยู่กับอะไร แต่อาจมีการเพิ่มการอ้างอิงใหม่)
  • ฉันจะป้องกันไม่ให้ระบบอัปเดตติดตั้งเวอร์ชันเก่าใน repo ในการอัปเดตได้อย่างไร
  • ฉันจะป้องกันไม่ให้ระบบติดตั้งเวอร์ชันที่ใหม่กว่า (เมื่อหมด) เขียนทับแพ็กเกจที่กำหนดเองของฉันได้อย่างไร

คำตอบ:


78

คุณสามารถใช้แพ็คเกจพิเศษ "checkinstall" สำหรับแพ็คเกจทั้งหมดที่ยังไม่ได้อยู่ใน debian / ubuntu

คุณสามารถใช้ "uupdate" ( apt-get install devscripts) เพื่อสร้างแพ็คเกจจากซอร์สที่มีแหล่งที่มาของเดเบียนที่มีอยู่:

ตัวอย่างสำหรับ libdrm2:

apt-get build-dep libdrm2
apt-get source libdrm2
cd libdrm-2.3.1
uupdate ~/Downloads/libdrm-2.4.1.tar.gz
cd ../libdrm-2.4.1
dpkg-buildpackage -us -uc -nc

ขอบคุณ! ฉันเพิ่งใช้สิ่งนี้เพื่อพอร์ต Subversion 1.6.6 ไปยังการติดตั้ง Ubuntu ที่มีเพียง 1.6.5 เป็นเวอร์ชันล่าสุดที่มีและทำงานได้อย่างไม่มีที่ติ ช่วยฉันไม่กี่ชั่วโมงในการซ่อมแซม! :)
Carlos Villela

คุณช่วยให้บริบทเพิ่มเติมเกี่ยวกับคำสั่งเหล่านี้ได้ไหม อยู่ที่ไหนlibdrm-2.3.1กันแน่? ยังlibdrm-2.4.1.tar.gzมาจากไหน (สมมติฐานเริ่มต้นของฉันคือไบนารีที่คอมไพล์แล้วของแอปพลิเคชันที่เราต้องการจัดแพคเกจใน deb แต่แทนที่เวอร์ชันที่มีอยู่นั้นถูกต้องหรือไม่)
ล้อ

หากคุณได้รับข้อผิดพลาดYou must put some 'source' URIs in your sources.listให้ยกเลิกการใส่เครื่องหมาย deb-src บรรทัดใน/etc/apt/sources.list
Christian

27

อันดับแรกคำถามหัวเรื่อง: สมมติว่ามีไดเร็กทอรี debian อยู่แล้วอยู่ในไดเร็กทอรีต้นทาง (ไดเร็กทอรีที่มีไดเร็กทอรี debian) และเรียกใช้ dpkg-buildpackage ฉันต้องการเรียกใช้ด้วยตัวเลือกเหล่านี้:

dpkg-buildpackage -us -uc -nc

ซึ่งหมายความว่าอย่าลงนามในผลลัพธ์และอย่าทำความสะอาด

ฉันจะตรวจสอบได้อย่างไรว่าฉันระบุการอ้างอิงทั้งหมดอย่างถูกต้องหรือไม่?

การพึ่งพาเป็นศิลปะสีดำ วิธี "อย่างเป็นทางการ" คือการตรวจสอบบิลด์ขึ้นอยู่กับว่าแพ็กเกจสร้างด้วยระบบฐานเท่านั้นแพ็กเกจ "build-essential" และการอ้างอิงบิวด์ที่คุณระบุไว้ ไม่รู้คำตอบทั่วไปสำหรับการพึ่งพาปกติเพียงแค่ลุย :)

ฉันจะป้องกันไม่ให้ระบบอัปเดตติดตั้งเวอร์ชันเก่าใน repo ในการอัปเดตได้อย่างไร ฉันจะป้องกันไม่ให้ระบบติดตั้งเวอร์ชันที่ใหม่กว่า (เมื่อหมด) เขียนทับแพ็กเกจที่กำหนดเองของฉันได้อย่างไร

ความรู้ของฉันอาจล้าสมัยในเรื่องนี้ แต่เพื่อจัดการกับทั้งสองอย่าง: ใช้ dpkg --set-selections สมมติว่า nullidentd เป็นแพ็กเกจที่คุณต้องการคงไว้ให้รันเป็นรูท

echo 'nullidentd hold' | dpkg --set-selections

อีกวิธีหนึ่งเนื่องจากคุณสร้างจากแหล่งที่มาคุณสามารถใช้ยุคเพื่อตั้งค่าหมายเลขเวอร์ชันให้สูงเกินจริงและไม่ต้องกังวลอีกต่อไป ในการใช้ epoch ให้เพิ่มรายการใหม่ในไฟล์ debian / changelog และใส่ 99: ไว้ข้างหน้าหมายเลขเวอร์ชัน จากตัวอย่าง nullidentd ของฉันบรรทัดแรกของบันทึกการเปลี่ยนแปลงที่อัปเดตของคุณจะอ่าน:

nullidentd (99:1.0-4) unstable; urgency=low

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


1
"dpkg --set-selections" ยังคงใช้งานได้ แต่วิธีที่ดีกว่าในปัจจุบันคือ "aptitude hold nullidentd"
Mark Baker


6

สำหรับสิ่งที่คุณต้องการทำคุณอาจต้องการใช้ debian source diff ดังนั้นแพ็คเกจของคุณจึงคล้ายกับอย่างเป็นทางการนอกเหนือจากเวอร์ชันอัปสตรีมที่ใช้ คุณสามารถดาวน์โหลด diff แหล่งที่มาจากpackages.debian.orgหรือจะได้รับพร้อมกับ .dsc และเก็บต้นฉบับโดยใช้ "แหล่ง apt-get"

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

zcat ~/downloaded.diff.gz | patch -p1
chmod +x debian/rules

จากนั้นทำการเปลี่ยนแปลงที่คุณต้องการรวบรวมตัวเลือกและสร้างแพ็คเกจโดยทำ

dpkg-buildpackage -rfakeroot -us -uc

3
  • ใส่ไดเร็กทอรี "debian" จากแพ็กเกจดั้งเดิมไปยังไดเร็กทอรีต้นทางของคุณ
  • ใช้ " dch " เพื่ออัปเดตเวอร์ชันของแพ็คเกจ
  • ใช้ "debuild" เพื่อสร้างแพ็คเกจ

2

ฉันเชื่อว่านี่คือแพ็คเกจ Debian 'bible'

มันเป็นคู่มือผู้ดูแลใหม่ของ Debian ดังนั้นหลาย ๆ อย่างจึงไม่สามารถใช้งานได้ แต่ครอบคลุมถึงสิ่งที่จะไปที่ไหน



1

นี่คือบทช่วยสอนสำหรับการสร้างแพ็คเกจ Debian

โดยทั่วไปคุณต้อง:

  1. ตั้งค่าโครงสร้างโฟลเดอร์ของคุณ
  2. สร้างไฟล์ควบคุม
  3. เลือกสร้างสคริปต์postinstหรือprerm
  4. เรียกใช้ dpkg-deb

ฉันมักจะทำทั้งหมดนี้ใน Makefile ของฉันดังนั้นฉันจึงสามารถพิมพ์makeเพื่อคายไบนารีออกมาและบรรจุในครั้งเดียว


1

ฉันจะตรวจสอบได้อย่างไรว่าฉันระบุการอ้างอิงทั้งหมดอย่างถูกต้องหรือไม่?

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


1

หากคุณต้องการวิธีที่รวดเร็วและสกปรกในการติดตั้งการอ้างอิงการสร้างให้ใช้:

apt-get build-dep

สิ่งนี้จะติดตั้งการอ้างอิง คุณต้องการสายแหล่งที่มาในรายการแหล่งที่มาของคุณสำหรับสิ่งนี้:

deb-src http://ftp.nl.debian.org/debian/ squeeze-updates main contrib non-free

หากคุณกำลังสำรองแพ็กเกจจากการทดสอบเป็นแบบเสถียรโปรดทราบว่าการอ้างอิงอาจมีการเปลี่ยนแปลง คำสั่ง apt-get build-deb ติดตั้งการอ้างอิงสำหรับแพ็กเกจต้นทางในที่เก็บปัจจุบันของคุณ

แต่แน่นอน dpkg-buildpackage -us -uc จะแสดงการอ้างอิงใด ๆ ที่ถอนการติดตั้ง

ถ้าคุณต้องการรวบรวมบ่อยขึ้นให้ใช้ cowbuilder

apt-get install cowbuilder

จากนั้นสร้างพื้นที่สร้าง:

sudo DIST = บีบ ARCH = amd64 cowbuilder - สร้าง

จากนั้นรวบรวมแพ็คเกจต้นทาง:

apt-get source cowsay

# do your magic editing
dpkg-source -b cowsay-3.03+dfsg1              # build the new source packages
cowbuilder --build cowsay_3.03+dfsg1-2.dsc    # build the packages from source

ดูว่า Cowbuilder วางแพ็คเกจที่เป็นผลลัพธ์ไว้ที่ไหน

โชคดี!

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