Bagaimana cara membangun paket Debian / Ubuntu dari sumber?

116

Saya memiliki sumber program (diambil dari cvs / svn / git / ...) dan saya ingin membuat paket Debian / Ubuntu untuknya. Paket ada di repositori, tetapi:

  • Ini adalah versi yang lebih lama (tidak memiliki fitur yang saya butuhkan)
  • Saya memerlukan opsi kompilasi yang sedikit berbeda dari default.

Apa cara termudah untuk melakukannya? Saya prihatin tentang beberapa hal

  • Bagaimana cara memeriksa apakah saya telah mencantumkan semua dependensi dengan benar? (Saya bisa mendapatkan beberapa petunjuk dengan melihat apa yang bergantung pada versi yang lebih lama, tetapi dependensi baru mungkin telah ditambahkan.)
  • Bagaimana saya dapat mencegah sistem pembaruan menginstal versi yang lebih lama di repo pada pembaruan?
  • Bagaimana saya dapat mencegah sistem menginstal versi yang lebih baru (ketika sudah keluar), menimpa paket kustom saya?
Ryszard Szopa
sumber
Serupa di AU: askubuntu.com/questions/28372/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Jawaban:

78

Anda dapat menggunakan paket khusus "checkinstall" untuk semua paket yang bahkan belum ada di debian / ubuntu.

Anda bisa menggunakan "uupdate" ( apt-get install devscripts) untuk membuat paket dari sumber dengan sumber debian yang ada:

Contoh untuk 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
Paweł Gościcki
sumber
Terima kasih! Saya baru saja menggunakan ini untuk mem-port Subversion 1.6.6 ke instalasi Ubuntu yang hanya memiliki 1.6.5 sebagai versi terbaru yang tersedia, dan bekerja dengan sempurna. Menyelamatkan saya beberapa jam bermain-main! :)
Carlos Villela
Bisakah Anda memberikan lebih banyak konteks seputar perintah ini? Dimana libdrm-2.3.1tepatnya? Juga dari mana libdrm-2.4.1.tar.gzasalnya (asumsi awal saya adalah kompilasi biner dari aplikasi yang ingin kita paketkan dalam deb, tetapi mengganti versi yang sudah ada, apakah itu benar?)
wheeler
Jika Anda mendapatkan kesalahan You must put some 'source' URIs in your sources.list, hapus komentar baris deb-src di/etc/apt/sources.list
Christian
27

Pertama, pertanyaan judul: Dengan asumsi direktori debian sudah ada, masuklah ke direktori sumber (direktori yang berisi direktori debian) dan panggil dpkg-buildpackage. Saya suka menjalankannya dengan opsi ini:

dpkg-buildpackage -us -uc -nc

yang artinya jangan menandatangani hasil dan jangan bersihkan.

Bagaimana cara memeriksa apakah saya telah mencantumkan semua dependensi dengan benar?

Mendapatkan dependensi adalah seni hitam. Cara "resmi" adalah memeriksa ketergantungan build jika paket dibangun hanya dengan sistem dasar, paket "build-essential", dan dependensi build yang telah Anda tentukan. Tidak tahu jawaban umum untuk Dependensi biasa, masuk saja :)

Bagaimana saya dapat mencegah sistem pembaruan menginstal versi yang lebih lama di repo pada pembaruan? Bagaimana saya dapat mencegah sistem menginstal versi yang lebih baru (ketika sudah keluar), menimpa paket kustom saya?

Pengetahuan saya mungkin sudah ketinggalan zaman tentang yang satu ini, tetapi untuk membahas keduanya: Gunakan dpkg --set-selection. Dengan asumsi nullidentd adalah paket yang ingin Anda simpan, jalankan sebagai root

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

Bergantian, karena Anda membangun dari sumber, Anda dapat menggunakan epoch untuk menyetel nomor versi tinggi secara artifisial dan tidak pernah diganggu lagi. Untuk menggunakan epoch, tambahkan entri baru ke file debian / changelog, dan letakkan 99: di depan nomor versi. Diberikan contoh nullidentd saya, baris pertama changelog Anda yang diperbarui akan membaca:

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

Link Bernard bagus, terutama jika Anda harus membuat direktori debian sendiri - referensi developer dan halaman resource umum juga berguna . Tautan Adam juga terlihat bagus tetapi saya tidak terbiasa dengannya.

Daniel Bungert
sumber
1
"dpkg --set-selection" masih berfungsi, tetapi metode yang lebih baik saat ini adalah "aptitude hold nullidentd".
Mark Baker
6

Untuk apa yang ingin Anda lakukan, Anda mungkin ingin menggunakan diff sumber debian, jadi paket Anda mirip dengan yang resmi selain versi upstream yang digunakan. Anda dapat mendownload source diff dari packages.debian.org , atau bisa mendapatkannya bersama dengan .dsc dan arsip sumber asli dengan menggunakan "apt-get source".

Kemudian Anda membongkar versi baru sumber upstream, mengubah ke direktori itu, dan menerapkan diff yang Anda unduh dengan melakukan

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

Kemudian buat perubahan yang Anda inginkan untuk mengkompilasi opsi, dan buat paket dengan melakukan

dpkg-buildpackage -rfakeroot -us -uc
Mark Baker
sumber
3
  • letakkan direktori "debian" dari paket asli ke direktori sumber Anda
  • gunakan " dch " untuk memperbarui versi paket
  • gunakan "debuild" untuk membangun paket
zowers
sumber
2

Saya percaya ini adalah 'bible' paket Debian.

Yah, ini adalah panduan pengelola baru Debian, jadi banyak di antaranya tidak akan berlaku, tetapi mereka mencakup apa yang terjadi di mana.

Bernard
sumber
1

Berikut adalah tutorial untuk membuat paket Debian.

Pada dasarnya, Anda perlu:

  1. Siapkan struktur folder Anda
  2. Buat file kontrol
  3. Opsional membuat postinst atau prerm script
  4. Jalankan dpkg-deb

Saya biasanya melakukan semua ini di Makefile saya jadi saya bisa mengetik make untuk memuntahkan biner dan mengemasnya sekaligus.

Adam Pierce
sumber
1

Bagaimana cara memeriksa apakah saya telah mencantumkan semua dependensi dengan benar?

Ini pbuilderadalah alat yang sangat baik untuk memeriksa dependensi dan dependensi build dengan menyiapkan sistem dasar yang bersih dalam lingkungan chroot. Dengan mengompilasi paket dalam pbuilder, Anda dapat dengan mudah memeriksa dependensi build, dan dengan mengujinya dalam lingkungan pbuilder, Anda dapat memeriksa dependensi tersebut.

ini
sumber
1

Jika Anda menginginkan cara cepat dan kotor untuk menginstal dependensi build, gunakan:

apt-get build-dep

Ini menginstal dependensi. Anda membutuhkan baris sumber di sources.list Anda untuk ini:

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

Jika Anda mem-backport paket dari pengujian ke stable, harap diperhatikan bahwa dependensi mungkin telah berubah. Perintah apt-get build-deb installs dependensi untuk paket sumber di repositori Anda saat ini.

Tetapi tentu saja, dpkg-buildpackage -us -uc akan menunjukkan kepada Anda semua dependensi yang dihapus instalasinya.

Jika Anda ingin mengkompilasi lebih sering, gunakan pembuat sapi.

apt-get install cowbuilder

Kemudian buat area build:

sudo DIST = peras ARCH = amd64 cowbuilder --create

Kemudian kompilasi paket sumber:

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

Perhatikan di mana pembuat sapi meletakkan paket yang dihasilkan.

Semoga berhasil!

Allard Hoeve
sumber