Membangun paket RPM untuk Rosa Linux dalam praktiknya

Jika Anda telah menggunakan sistem operasi Linux untuk waktu yang lama dan bahkan tahu sedikit tentang pemrograman, cepat atau lambat Anda mungkin perlu mengkompilasi program dari kode sumber. Mungkin program yang diinginkan tidak akan berada dalam repositori distribusi. Atau program ini memiliki versi lama di repositori ini, dan Anda memerlukan yang terbaru. Atau mungkin Anda membuat program baru dan ingin membaginya dengan pengguna lain.


Tentu saja, Anda dapat menginstal program sesuai dengan instruksi yang disertakan dengan kode sumber. Tetapi kemudian Anda perlu mengelola file program secara manual dan memonitor dependensinya. Jauh lebih baik untuk membangun sebuah paket dengan program dan menggunakan manajer aplikasi yang dibangun ke dalam sistem operasi.


Saya harap artikel ini membantu Anda dengan cepat mengetahui cara membangun paket RPM untuk Rosa Linux atau untuk distribusi lain yang menggunakan manajer paket RPM (Mandriva, RedHat). Atau setidaknya beri tahu saya di mana mencari informasi.


Di sini saya akan menunjukkan cara membuat paket RPM di komputer lokal saya, menggunakan contoh sederhana. Kami akan membangun program xkb-switch di sistem operasi Rosa Linux . Kami akan mengambil kode sumber program dari GitHub .








Sedikit tentang Rosa Linux


Rosa Linux adalah distribusi yang dibuat dan didukung oleh pengembang Rusia . Ini didasarkan pada Mandriva , tetapi dengan beberapa fitur. Saya menggunakan versi 32-bit dari Rosa Fresh R8 , yang dirilis pada tahun 2014. Sekarang versi R8 tidak lagi didukung oleh pengembang (repositori untuk itu tidak diperbarui), tetapi berfungsi dengan baik di laptop saya, jadi saya tidak ingin menginstal versi baru.


Rosa Fresh R8 Menggunakan desktop KDE4 . Semua versi paket distribusi menggunakan manajer rpm dan urpm untuk mengelola paket dengan aplikasi, dan perintah yang sesuai adalah rpm , urpmi , urpme , urpmq , urpmf .


Prinsip-prinsip pembangunan paket perangkat lunak biasanya jarang diubah dalam keluarga distribusi Linux yang sama. Oleh karena itu, apa yang dijelaskan dalam artikel ini harus berfungsi di semua versi distribusi Rosa .


Membangun paket pada Rosa Linux sedikit lebih sederhana daripada pada beberapa distribusi berbasis RPM lainnya. Beberapa poin otomatis dan tidak perlu dikonfigurasi.




Sedikit tentang xkb-switch


Saya menyukai gagasan menggunakan plugin untuk editor teks Vim - xkbswitch , tentang yang ada artikel tentang HabrΓ© . Secara otomatis beralih tata letak keyboard ke Bahasa Inggris ketika Anda keluar dari mode input, dan sebaliknya - ke yang mana teks dimasukkan terakhir kali - jika Anda memasuki mode input lagi. Agar plugin ini berfungsi, Anda memerlukan program xkb-switch , yang memungkinkan Anda untuk mengubah tata letak keyboard dari baris perintah dan dari plugin untuk editor Vim . Program ini tidak ada dalam repositori Rosa Linux R8 (dan kemungkinan besar tidak ada yang akan menambahkannya, karena distribusinya sudah tua, dan program xkb-switch tidak terlalu populer).




Menyiapkan, menyelesaikan, memeriksa program


Seringkali perlu untuk mengkonfigurasi kompilasi program untuk bekerja dengan benar dalam distribusi tertentu atau bahkan untuk sistem tertentu. Kebetulan sebuah program perlu dibangun dengan opsi lain atau dengan dukungan beberapa driver khusus. Atau mungkin Anda ingin memperbaiki kesalahan dalam kode program atau hanya memeriksa apakah itu berfungsi. Untuk melakukan ini, lebih baik menyalin kode sumber ke komputer Anda sebelum membangun paket RPM, cobalah untuk mengkompilasinya dan memeriksa cara kerja program yang dikompilasi.


Jika Anda yakin tidak perlu mengubah file proyek, maka Anda dapat menggunakan kode sumber asli dari situs web proyek dan segera melanjutkan untuk membangun paket. Tetapi jika Anda perlu mengubah pengaturan kompilasi, biasanya jauh lebih mudah untuk mengubah file di folder sumber (yang disebut makefile ) daripada kemudian berurusan dengan opsi untuk perintah kompilasi dan perangkat makro internal untuk file spesifikasi.




Memeriksa kode sumber tanpa profil Anda di GitHub


Jika Anda memutuskan untuk bekerja dengan kode sumber atau pengaturan kompilasi proyek, tetapi Anda tidak memiliki profil Anda sendiri di GitHub atau tidak ingin menggunakannya, Anda dapat mengunduh dan membuka zip kode sumbernya. Dalam kasus kami, ini mungkin terlihat seperti ini (saya menggunakan folder ~/Projects/cpp untuk kode sumber C ++ ):



 cd ~/Projects/cpp git clone https://github.com/ierton/xkb-switch.git 


Ini akan membuat folder ~/Projects/cpp/xkb-switch berisi kode sumber. Tentu saja, alih-alih menggunakan git Anda dapat mengunduh arsip dengan program dan unzip.


Dari file README.md di folder proyek, mudah ditebak bahwa utilitas cmake digunakan untuk membangun program. Oleh karena itu, jika Anda perlu mengubah pengaturan kompilasi, dalam kasus kami mereka berada di file CMakeLists.txt . Dan kami hanya mencoba untuk mengkompilasi program dan memeriksa apakah itu berfungsi. Perintah apa yang perlu Anda gunakan untuk ini ditulis dalam file README.md sama di root proyek.



 cd xkb-switch mkdir build && cd build cmake .. make ./xkb-switch #         ./xkb-switch -l #       ./xkb-switch -s ru #       (  ) 


Setelah itu, untuk menggunakan proyek yang diubah, Anda harus menghapus atau menghapus folder build dari proyek dan mengemas kode sumber ke dalam arsip. Mungkin terlihat seperti ini:



 cd ~/Projects/cpp/xkb-switch rm -rf ./build cd ~/Projects/cpp zip -r xkb-switch.zip xkb-switch 


File xkb-switch.zip kemudian perlu digunakan untuk membangun paket.




Verifikasi dengan menyimpan proyek ke profil GitHub Anda


Saya berasumsi bahwa siapa pun yang membaca bagian ini setidaknya sedikit terbiasa dengan bekerja dengan git dan telah membuat profil di GitHub . Saya pikir metode ini adalah yang terbaik, sehingga sisa artikel akan menyiratkan bahwa itu digunakan, kecuali dinyatakan sebaliknya.


Pertama, Anda perlu mem-fork proyek asli ke dalam GitHub Anda. Setelah itu, seperti pada metode sebelumnya, kami mengkloning proyek ke komputer kami, tetapi dari repositori kami (dalam kasus saya, nama pengguna adalah alexandersolovyov ):



 cd ~/Projects/cpp git clone https://github.com/alexandersolovyov/xkb-switch.git 


Untuk menambahkan perubahan, lebih baik menggunakan cabang baru. Kemudian, jika diinginkan, dimungkinkan untuk menggunakan versi program yang berbeda. Dan juga dimungkinkan untuk mengusulkan perubahan pada penulis proyek menggunakan permintaan-tarik. Misalnya, jika Anda memutuskan untuk sedikit memperbaiki file CMakeLists.txt , sebelum itu Anda perlu membuat cabang baru dengan:



 git branch cmake_corrections 


Setelah perubahan dibuat, dicentang dan ditambahkan ke cabang (menggunakan git commit -am " " ), Anda dapat menambahkan cabang baru ke GitHub Anda:



 git push origin cmake_corrections 


Setelah itu, Anda dapat membuat permintaan tarik, jika perlu.


Anda dapat membuat tautan ke repositori asli:



 git remote add ierton https://github.com/ierton/xkb-switch.git 


Dan kemudian perbarui cabang utama repositori Anda sehingga cocok dengan aslinya:



 git pull ierton master 


Kode program yang terkait dengan cabang yang dikoreksi dapat digunakan saat membangun RPM. Untuk melakukan ini, Anda harus menentukan alamat arsip dalam formulir di file spesifikasi:



 Source0: https://github.com/-/-/archive/---.zip 


Tapi, seperti yang diminta pengguna specblog , ini sebenarnya tidak terjadi. Lebih baik menyampaikan perubahan Anda dalam bentuk tambalan. Untuk melakukan ini, Anda perlu membuat file tambalan dari perubahan di cabang Anda dan menyalinnya ke folder sumber untuk membangun paket ( ~/rpmbuild/SOURCES/ ). Maka Anda harus menentukannya dalam file spesifikasi. Kami akan mempertimbangkan ini nanti, tetapi jika Anda mau, Anda bisa membacanya di sini . Jika Anda tidak tahu cara membuat tambalan, Anda bisa melihat di bawah spoiler.




Cara membuat tambalan menggunakan git

Membuat tambalan


Tambalan , mereka Tambalan - ini adalah file di mana perubahan dicatat dalam kode sumber program. Mereka digunakan sebagai alternatif untuk perintah git pull dan git push untuk komunikasi antara repositori kode lokal jika tidak nyaman untuk "menarik" perubahan dari repositori jarak jauh, atau sejarah perubahan proyek dan prinsip-prinsip bekerja dengannya sedemikian rupa sehingga lebih baik menggunakan tambalan.



Mari kita bayangkan bahwa kita perlu melakukan perubahan pada file CMakeLists.txt . Pertama, Anda perlu melakukan semuanya seperti yang dijelaskan di atas: cabang master di repositori GitHub kami harus sesuai dengan cabang utama dari proyek asli, dan untuk perubahan Anda, Anda perlu menggunakan cabang cmake_corrections . Maka Anda harus pergi ke cabang ini, melakukan perubahan yang diperlukan dan menyimpannya di git menggunakan commit.


Sekarang Anda perlu menyimpan perubahan sebagai tambalan file ke folder ~/rpmbuild/SOURCES (jika Anda tidak menggunakan Rosa Linux, jalur ke folder SOURCES mungkin berbeda). Sebagai contoh, ini (maksud saya kita berada di folder proyek - misalnya, ~/Projects/cpp/xkb-switch - dan pada cabang cmake_corrections ):


 git format-patch -o ~/rpmbuild/SOURCES origin/master 

Perintah git format-patch membuat satu file git format-patch untuk setiap komit. Dalam formulir ini, itu akan membuat tambalan mulai dari komit yang ditentukan oleh argumen terakhir, dan berakhir dengan komit terakhir dari cabang saat ini. Anda dapat menentukan komit dengan cara apa pun: di awal hash, menggunakan pointer HEAD atau nama cabang, yang sekarang menunjukkan komit yang diinginkan. Hal utama adalah bahwa salah satu komit yang terlihat ketika git log dijalankan diambil sebagai permulaan. Artinya, Anda tidak bisa mulai membuat tambalan dari komit yang ada di cabang lain.


Dan Anda dapat mengingat (atau melihat) berapa banyak komit yang kita cabut dari cabang utama, dan membuat tambalan untuk sejumlah komit kembali. Misalnya, jika kita membuat dua komit, perintahnya adalah:


 git format-patch -o ~/rpmbuild/SOURCES -2 

Di sini jumlah komit diatur menggunakan -2 . Anda dapat menentukan jumlah mereka sebagai ganti angka ini.


Anda dapat menentukan rentang komit dari mana tambalan harus dibuat dengan menempatkan dua poin antara tautan ke komit awal dan akhir:


 git format-patch -o ~/rpmbuild/SOURCES master..cmake_corrections 

Nama setiap file tambalan terdiri dari nomor seri dan baris pertama dari komentar komit. Oleh karena itu, lebih baik untuk mengganti nama setiap file sehingga deskripsi tambalan lebih singkat dan jelas menjelaskan esensinya. Misalnya, seperti ini:


 mv 0001-Return-memory-allocated-by-XkbRf-getNamesProp()-for-tmp.patch 001-Fix-memory-leak.patch 

konvensi penamaan untuk tambalan dalam artikel tentang sintaks dari file spesifikasi merekomendasikan menambahkan package_name-version-rosa- sebelum deskripsi dari masing-masing file tambalan. Mungkin ini praktik yang baik jika Anda mengirim tambalan melalui email, tetapi tidak untuk membangun paket. Kami membuat paket di komputer kami, jadi lebih baik mengosongkan folder ~/rpmbuild/SOURCES setiap kali sebelum ~/rpmbuild/SOURCES paket dengan program lain atau paket versi baru.


Sekarang jika Anda perlu memperbarui cabang repositori utama ( master ) agar sesuai dengan aslinya, maka setelah itu cabang perubahan ( cmake_corrections ) perlu diperbarui menggunakan perintah git rebase . Anda dapat melihat bagaimana melakukan ini di sini . Setelah itu, tambalan perlu dibuat ulang.





Persiapkan "tempat kerja" untuk membuat paket


Pertama, Anda perlu membuat struktur direktori. Semua perakitan terjadi di folder rpmbuild di folder rumah rpmbuild . Buat struktur direktori awal dan buka folder untuk file spesifikasi:



 mkdir -p ~/rpmbuild/SPECS && cd ~/rpmbuild/SPECS 


Untuk Rosa Linux, ini sudah cukup: folder yang tersisa akan dibuat secara otomatis.


Distribusi lain dapat menggunakan lokasi file yang berbeda untuk membangun paket. Dan mungkin Anda harus membuat seluruh hierarki folder secara manual. Cari informasi untuk distribusi Anda jika Anda tidak menggunakan Rosa Linux. Misalnya, ini mungkin terlihat seperti ini di Red Hat .


Jika paket dibangun dengan kesalahan, maka semua file yang dibuat oleh perintah rpmbuild tidak dihapus - sama seperti dengan build yang berhasil. Kami akan mencoba mengumpulkan paket berkali-kali, dan file yang tersisa setelah terakhir kali akan mengganggu. Karena itu, lebih baik membuat skrip sederhana yang akan membantu menghapusnya dengan cepat. Buat file cleanup.sh dan letakkan di ~/rpmbuild/SPECS . Berikut isinya:



 !#/bin/sh rm -rf ~/rpmbuild/BUILD/* rm -rf ~/rpmbuild/BUILDROOT/* rm -rf ~/rpmbuild/RPMS/* rm -rf ~/rpmbuild/SRPMS/* 


Tentu saja, lebih baik menambahkan hak eksekusi untuk itu menggunakan perintah chmod u+x cleanup.sh .


Jika Anda ingin mengumpulkan paket dari file yang ada di komputer lokal - jika Anda tidak menggunakan GitHub dan membuat perubahan pada file proyek, atau ingin membuat paket dari program Anda sendiri yang hanya disimpan di komputer Anda - Anda perlu mengemas proyek ke dalam arsip ( mis. .zip , .tar atau .tar.gz ) dan letakkan di folder SOURCES . Misalnya, seperti ini:



 cd ~/Projects/cpp/ zip -r xkb-switch.zip xkb-switch mkdir -p ~/rpmbuild/SOURCES cp xkb-switch.zip ~/rpmbuild/SOURCES/ 


Jika setelah membuat program Anda ingin membuat yang lain atau yang sama, tetapi versi yang berbeda, Anda harus menghapus semua file dari folder ~/rpmbuild/SOURCES , dan setelah itu salin arsip Anda di sana (jika Anda tidak mengunduhnya dari GitHub ) dan menambal file (jika digunakan). Jika tidak, file arsip, kemungkinan besar, tidak akan diunduh dari GitHub (mengapa - lihat nanti), dan juga akan sulit untuk mengetahui file tambalan mana yang termasuk dalam program mana.




Mari kita mulai membuat file spesifikasi


Dasar untuk membangun paket RPM adalah file speck yang disebut. File ini berisi instruksi untuk program rpmbuild (atau lebih tepatnya rpm ) yang diperlukan untuk membangun paket.


Buat file xkb-switch.spec di folder ~/rpmbuild/SPECS/ . Cara termudah untuk memulai adalah dengan templat yang dapat ditemukan di situs web File Templat Templat .


Dari README pada halaman proyek switch xkb , diketahui bahwa program dikompilasi menggunakan utilitas cmake . Oleh karena itu, kami akan memilih file Spec untuk program yang dibangun menggunakan CMake dan menyalin seluruh templat ke file spec kami. Tentu saja, untuk merakit paket RPM kami dengan benar, template ini perlu banyak diubah, yang akan kami lakukan.




Sedikit tentang sintaks file spesifikasi


  • Sintaks file spesifikasi memungkinkan Anda untuk menambahkan komentar gaya bash.
  • Anda bisa menggunakan spasi sebagai spasi di antara nilai-nilai pada baris yang sama untuk membuat tampilan kolom genap, tetapi dokumentasi sangat menganjurkan menggunakan karakter tab (satu atau dua selama diperlukan untuk menjaga kolom tetap rata). Catatan: dalam semua contoh kode dalam artikel ini, hanya spasi yang digunakan, jadi lebih baik untuk tidak menyalin semua teks dari sini ke file spesifikasi Anda, tetapi cetak sendiri.
  • Bidang opsi terdiri dari nama opsi khusus dengan titik dua dan nilai berikutnya melalui tab (atau spasi). Kasus karakter dalam nama bidang tidak masalah. Sebagai contoh:
      Name: xkb-switch 

  • Jika kata tersebut didahului dengan simbol % (misalnya, %description ), maka ini adalah kata kunci khusus. Ini bisa berupa perintah, makro, atau panggilan skrip. Kemudian setelah itu parameter yang digunakannya dapat ditunjukkan. Dan ada kata kunci yang menunjukkan awal dari blok perintah atau opsi. Kemudian, parameter dapat ditunjukkan di sebelahnya, dan pada baris berikutnya harus ada perintah atau daftar opsi yang saya jelaskan di paragraf sebelumnya. Setelah blok seperti itu, sebuah baris kosong harus dibiarkan.
  • Untuk menggunakan nilai konstanta, Anda harus memasukkan konstruksi form %{_} . Nilainya dapat ditentukan sebelumnya, atau dapat ditentukan dengan opsi (misalnya, Name: xkb-switch ) atau menggunakan kata kunci %define . Semua konstanta ini juga dianggap makro. Penggunaannya akan dibahas lebih rinci di bawah ini.



Header file spesifikasi


Dalam file spesifikasi, tajuk selalu ditulis terlebih dahulu. Ini adalah daftar opsi yang berlaku untuk paket RPM utama. Ketika paket sudah siap, hampir semua informasi ini akan ditampilkan saat melihat deskripsinya. Inilah yang ditunjukkan oleh masing-masing garis:



Ringkasan:
Deskripsi singkat tentang paket. Saya melihat deskripsi dalam file README.md di proyek xkb-switch : Query and change XKB layout state .

Nama:
Nama paket. Dalam kasus kami, ini adalah xkb-switch .

Versi:
Versi program. Untuk mengetahuinya, yang terbaik adalah melihat file CMakeLists.txt di folder root proyek. Tentu saja, Anda perlu mengambil file dari salinan proyek yang akan digunakan untuk perakitan. Jika Anda menggunakan proyek asli, Anda dapat membuka file langsung di halaman GitHub-nya . Seperti yang Anda lihat, versi ini terdiri dari MAJOR_VERSION , MINOR_VERSION , dan RELEASE_VERSION . Saya menggunakan program versi 1.6.0 .

Rilis:
Nomor versi paket itu sendiri. Menampilkan waktu paket dengan program dengan versi yang sama sedang dirakit. Dalam kasus kami, ini adalah "1", karena tidak ada yang pernah membuat program versi ini. Dalam kasus yang ideal, jika kami sudah mencoba untuk mengkompilasi paket dan perakitan mencapai akhir (bahkan jika ada kesalahan), maka setelah setiap upaya baru Anda perlu menambah nomor ini dengan 1 dan pada saat yang sama jangan menghapus paket-paket lama yang dirakit dari rpmbuild/SRPMS rpmbuild/RPMS dan rpmbuild/SRPMS : Selanjutnya, paket baru dengan nomor build baru akan dibuat. Mungkin ini harus dilakukan jika Anda menggunakan server khusus untuk perakitan. Kami menggunakan komputer kami dan sebagai gantinya kami akan membersihkan folder. Jika sebuah paket dengan program versi ini sudah ada dalam repositori distribusi Linux, tetapi Anda mengkompilasi dengan pengaturan lain, maka lebih baik untuk menentukan nomor rilis 1 lebih dari paket itu.

Lisensi:
Nama pendek lisensi tempat program ini didistribusikan. Menurut aturan Rosa Linux, Anda hanya dapat membangun paket dengan lisensi yang memungkinkan distribusi gratis. README.md dapat mengetahui dari file README.md bahwa lisensinya adalah GNU GPLv3 . Jadi kami menulis: GPLv3+ .

Kelompok:
Grup atau kategori tempat program tersebut berada. Dengan menggunakan grup ini, program diurutkan dalam menu peluncuran aplikasi dan di window program manager (β€œTambah atau Hapus Program”). Daftar grup untuk Rosa Linux dapat ditemukan di sini . Saya pikir Development\X11 adalah yang terbaik bagi kami, karena program ini terkait dengan X11 dan terutama diperlukan untuk membuat skrip dan plugin untuk Vim.

URL:
Alamat internet tempat Anda dapat mengunduh kode sumber asli program. Ini akan ditentukan saat melihat informasi paket RPM. Item ini opsional, tetapi kami akan menunjukkan: https://github.com/ierton/xkb-switch

Sumber0:
Nama file arsip yang berisi kode sumber, atau alamat Internet tempat file itu dapat diunduh. Jika Anda menentukan alamat di Internet, maka selama pembangunan pertama file akan diunduh ke ~/rpmbuild/SOURCES/ . Jika file seperti itu sudah ada, itu tidak akan lagi diunduh, yaitu, program rpmbuild hanya akan menggunakan nama file yang ditentukan di akhir URL ini. Anda dapat menentukan hanya nama file, tetapi kemudian harus ditempatkan di folder ~/rpmbuild/SOURCES/ secara manual. Lebih baik memberikan alamat salinan proyek Anda di GitHub. Saya menggunakan file https://github.com/alexandersolovyov/xkb-switch/archive/master.zip . Anda dapat menentukan beberapa sumber berbeda untuk mengumpulkan sumber dari beberapa arsip dengan bantuan satu file speck. Kemudian, atas nama opsi untuk menambahkan setiap arsip berikutnya, jumlahnya harus bertambah ( Source2 , Source2 , dll.). Alamat file ini tidak terlihat saat melihat informasi paket RPM.

Patch0:
Opsi ini tidak ada dalam file templat. Mungkin berguna jika Anda memutuskan untuk mentransfer perubahan Anda dalam file proyek program dalam bentuk tambalan. Adapun opsi Source0 , setiap file harus ditunjukkan pada baris yang terpisah, dan jumlah di akhir nama opsi harus bertambah setiap kali. File tambalan harus berada di folder ~/rpmbuild/SOURCES (di sebelah arsip sumber yang diunduh). Nama setiap file harus ditulis tanpa jalur ke sana. Tidak perlu menentukan semua file tambalan di sini - hanya yang ingin Anda terapkan yang dapat digunakan.

BuildRequires:
Paket diperlukan untuk membangun program. Templat cmake . File CMakeLists.txt menunjukkan bahwa versi minimum CMake untuk perakitan tidak boleh lebih rendah dari 2,6 , jadi lebih baik untuk menentukan cmake >= 2.6 . Anda dapat menambahkan paket lain, masing-masing pada baris yang berbeda, menggunakan opsi BuildRequires: terpisah. Daftar paket yang dibutuhkan untuk perakitan dapat ditemukan dengan membaca README proyek dan dengan cermat melihat file CMakeLists.txt (terutama FIND_PACKAGE , TARGET_LINK_LIBRARY , FIND_PROGRAM ). Maka Anda perlu menemukan nama paket yang benar di repositori menggunakan perintah urpmq -a __ . Dalam kasus kami, file pengaturan kompilasi ( CMakeLists.txt ) sudah berisi baris yang memeriksa keberadaan paket yang diperlukan dalam sistem. Tetapi lebih baik untuk menentukan seluruh daftar di sini juga:
 # CMake  2.6   BuildRequires: cmake >= 2.6 #  C/C++ BuildRequires: gcc #    libxkbfile BuildRequires: libxkbfile-devel #   X11   libxkbfile, #  libx11-devel   . #    man: BuildRequires: xz 


Membutuhkan:, Menyediakan:
Opsi-opsi ini tidak ada dalam sampel, tetapi kadang-kadang bisa berguna. Mereka membangun dependensi antar paket.Opsi ini Providesmenentukan fitur yang disediakan oleh paket yang sedang dibangun. Hal ini dapat nama file bahasa sundulan C , atau dinamis nama link library, atau fungsi khusus. Dan opsi Requiresmenunjukkan Kemampuan paket mana yang tergantung pada paket tersebut. Package Manager ( rpm, urpm, atau orang lain yang menggunakan distribusi), ketika mencari dependensi mencari ini peluang daripada nama paket. Oleh karena itu, Provideslebih baik untuk menunjukkan versi Peluang yang disediakan , dan untuk Requiresversi Peluang yang disediakan mana yang cocok. Versi ditunjukkan dengan tanda >=,=, atau <=, dikelilingi oleh spasi. Biasanya, semua opsi ditunjukkan terlebih dahulu Requires, lalu - Provides, satu nama fitur per baris - sama seperti untuk BuildRequires:. Biasanya, ketika membangun paket di Rosa Linux, dependensi secara otomatis dikenali, dan opsi ini jarang perlu ditentukan.

AutoReq:, AutoProv:
Jika Anda sedang membangun sebuah program yang ditulis dalam bahasa yang membuat manajer rpm baru, atau yang berpemilik, dan dependensi tidak terdeteksi secara otomatis secara otomatis, Anda dapat menonaktifkan deteksi otomatis Kemampuan (dengan AutoProv: no) dan / atau Ketergantungan (dengan) bantuan AutoReq: no).

% deskripsi
Blok ini bukan lagi bagian dari tajuk, tetapi terkait dengannya. Dia akan menambahkan deskripsi lengkap program ke paket RPM. Baris kosong harus ditinggalkan setelahnya. Uraiannya mungkin sebagai berikut:
 %description xkb-switch is a C++ program that allows to query and change the keyboard layout state for X11 Window System (XKB) via command line. It provides a command 'xkb-switch', and bindings for API of the Vim text editor via 'libxkbswitch.so'. It is mainly used by a plugin for Vim text editor, vim-xkbswitch. Originally ruby-based code written by J.Broomley. 




Baris dari template dimulai dengan %filesdan %find_langdiperlukan hanya jika Anda membangun aplikasi dengan dukungan untuk beberapa bahasa, jadi hapuslah.


Selanjutnya, setelah membagi komentar-baris, diikuti oleh perintah dan makro yang harus diselesaikan sebelum mengemas file. Semua perintah ini dibagi menjadi beberapa blok yang ditentukan menggunakan kata kunci khusus.




Persiapan sumber


Yang pertama adalah blok %prepyang menunjukkan perintah-perintah untuk persiapan kompilasi. Di dalamnya ada perintah makro %setup. Dia menjalankan skrip yang melakukan hal berikut:



  • , SourceX: ( β€” Source0: ). , .
  • ~/rpmbuild/SOURCES/ .
  • ~/rpmbuild/BUILD/ .
  • .


-q , .


, %prep :



 rpmbuild -bp ~/rpmbuild/SPECS/xkb-switch.spec 


rpmbuild . , rpm : rpmbuild , . ( root sudo ). rpmbuild , man rpmbuild . , , , β€” , rpmbuild .


: xkb-switch-1.6.0: No such file or directory . , ~/rpmbuild/BUILD/xkb-switch-1.6.0 , .



 ls ~/rpmbuild/BUILD/ 


, xkb-switch-master . %setup -n . %prep - :



 %prep %setup -q -n xkb-switch-master 


~/rpmbuild/SPECS/cleanup.sh , BUILD , , %prep . , exit 0 . , .


, . %prep . , , :


 %apply_patches 

rpmbuild -bp xkb-switch.spec . β€” .


Maximum RPM .


.





%build . README , cmake .. make , - . : , . , %build :



 ~/rpmbuild/SPECS/cleanup.sh rpmbuild -bc ~/rpmbuild/SPECS/xkb-switch.spec 


exit 0 : .


, . shell ( bash zsh, ). rpmbuild , . shell - β€” . ( .)


- , , , %build shell .


, , . cmake , , , %cmake - , , . ( β€” CMakeLists.txt ). , .




Instalasi


, . %install , , , ~/rpmbuild/BUILDROOT/__-buildroot/ .


__ , Name: -, ( Version: -), ( Release: -), , .


README , make install , build . - - %makeinstall_std -C build , . ( , ):



 ~/rpmbuild/SPECS/cleanup.sh rpmbuild -bi ~/rpmbuild/SPECS/xkb-switch.spec 


, RPM. - , .





, - . , ~/rpmbild/BUILDROOT/ . ( , , tree , - Linux.) , , .debug . , , : .


, , %files -. , , . .


%files -. , . Rosa Linux %prep ( - ). , , , , β€” . - (, , ).


%files , RPM. , :



 %files %{_bindir}/%{name} %{_libdir}/libxkbswitch.so %{_libdir}/libxkbswitch.so.1 %{_libdir}/libxkbswitch.so.%{version} %{_mandir}/man1/%{name}.1.xz 


-. , , /usr/lib/rpm/macros . , %{_bindir} , %{_libdir} β€” , %{_mandir} β€” man. %{name} %{version} Name: Version: -.


:



 ~/rpmbuild/SPECS/cleanup.sh rpmbuild -ba ~/rpmbuild/SPECS/xkb-switch.spec 


… 2 1 . rpmlint , . , , Rpmlint Errors , :


`xkb-switch.i586: E: incoherent-version-in-name (Badness: 50) 1`
Kesalahan: Versi dalam nama paket perpustakaan tidak ditentukan dengan benar.

`xkb-switch.i586: E: executable-in-library-package (Keburukan: 1) / usr / bin / xkb-switch`
Kesalahan: paket perpustakaan berisi file yang dapat dieksekusi.

`xkb-switch.i586: W: devel-file-in-non-devel-package / usr / lib / libxkbswitch.so`
Peringatan bahwa file paket pengembangan ( -devel) ditemukan dalam paket yang tidak dimaksudkan untuk pengembangan.



Apakah semuanya jelas? Saya kira tidak. Mari kita lihat lebih dekat apa yang terjadi di sini.




Apa itu rpmlint


Rosa Linux rpmbuild rpmlint , . rpmlint , , . , Rosa Linux ( , rpmlint ) .


, , . ~/rpmbuild/RPMS/_/ rpmlint -i __ .


, RPM - , , , , Rosa Linux, rpmlint -i __ .




RPM Rosa Linux


Rosa Linux 6 . , .


Paket yang dapat dieksekusi
Ini adalah biner. Ini hanya berisi file biner atau skrip yang ditujukan langsung untuk dieksekusi. File-file dari paket-paket ini paling sering dipasang di folder /bin/atau di /usr/bin. Mungkin juga berisi tautan - untuk kemungkinan memanggil program menggunakan beberapa nama berbeda. Nama paket sesuai dengan nama program. Paket-paket seperti itu seringkali tergantung pada perpustakaan.

Library
Berisi file yang dikompilasi dari library yang terhubung secara dinamis ("shared", "shared") yang digunakan oleh program. Biasanya ini adalah file perpustakaan itu sendiri, yang namanya berakhir dengan versi, dan tautan ke file ini, yang namanya berakhir dengan nomor versi pertama. Misalnya, untuk perpustakaan libxkbfileversi 1.0.2 itu akan menjadi file libxkbfile.so.1.0.2dan tautan ke sana,libxkbfile.so.1. Nama paket perpustakaan, di mana ia dikenali dalam repositori installer, diakhiri dengan nomor versi pertama dan dimulai dengan awalan lib. Perpustakaan memiliki libxkbfilenama yang benar - libxkbfile1. Ini disebabkan oleh fakta bahwa biasanya nomor versi pertama hanya berubah dengan perubahan pustaka yang tidak kompatibel, dan dengan demikian akan mungkin untuk menginstal beberapa paket dengan pustaka dari versi yang berbeda jika beberapa program menggunakan versi pustaka yang lama dan yang lain menggunakan versi yang lebih baru.

Paket untuk pengembang
File yang diperlukan untuk menyusun program yang menggunakan pustaka, tetapi tidak perlu untuk pekerjaan program yang sudah jadi. Untuk program C / C ++ sederhana , ini adalah tautan ke file pustaka, tetapi tanpa versi dalam namanya (misalnya,libxkbfile.so), serta file header (dengan ekstensi .h). Nama paket berakhir dengan -devel, misalnya: libxkbfile-devel. Selama instalasi, selalu tergantung pada perpustakaan yang sesuai. Misalnya, paket libxkbfile-develtergantung pada libxkbfile1.

Source Code
Rosa Linux repositori memiliki paket RPM yang berisi kode sumber untuk beberapa program - pada dasarnya hanya mereka yang benar - benar perlu dibangun kembali. Nama-nama paket ini diakhiri dengan -srcatau -source(misalnya, apache-source). rpmbuildselalu membuat paket seperti itu secara otomatis dan memasukkannya ke dalam ~/rpmbuild/SRPMS/.

Simbol debugging
Ini adalah informasi yang dapat digunakan untuk men-debug program yang sudah selesai. Ini mengaitkan lokasi dalam file yang dikompilasi dengan kode sumber. Paket-paket semacam itu rpmbuildsecara otomatis dibuat oleh tim , sebuah akhiran ditetapkan untuk namanya -debuginfo. Saya tidak menemukan paket seperti itu di repositori Rosa Linux.

Dokumentasi
Rosa repositori Linux memiliki paket dokumentasi untuk berbagai program dan perpustakaan. Saya (untuk saat ini) tidak tahu fitur membangun paket-paket seperti itu. Nama-nama mereka biasanya berakhir di doc: misalnya libx11-doc, java-1.7.0-openjdk-javadoc. Ngomong-ngomong, hampir semuanya dibuat dalam gaya situs web, dan untuk melihatnya, yang terbaik adalah membuka browser, pergi ke alamat file:///usr/share/doc/dan pilih folder dan file yang diinginkan.




Hasil kami


Sekarang semuanya menjadi lebih jelas.



  • xkb-switch libxkbswitch.so , , , . , : xkb-switch.i586: W: devel-file-in-non-devel-package /usr/lib/libxkbswitch.so .
  • , /usr/lib/libxkbswitch.so.1 /usr/lib/libxkbswitch.so.1.6.0 . , . : xkb-switch.i586: E: executable-in-library-package (Badness: 1) /usr/bin/xkb-switch .
  • , (1). : xkb-switch.i586: E: incoherent-version-in-name (Badness: 50) 1 .


, rpmlint , . . xkb-switch , libxkbswitch.so.1.6.0 , Vim . xkb-switch , C C++ . RPM- .


-:



- xkb-switch
 Summary: Query and change XKB layout state Name: xkb-switch Version: 1.6.0 Release: 1 License: GPLv3+ Group: Development/X11 URL: https://github.com/ierton/xkb-switch Source0: https://github.com/alexandersolovyov/xkb-switch/archive/master.zip BuildRequires: cmake >= 2.6 BuildRequires: gcc BuildRequires: libxkbfile-devel BuildRequires: xz %description xkb-switch is a C++ program that allows to query and change the keyboard layout state for X11 Window System (XKB) via command line. It provides a command 'xkb-switch', and bindings for API of the Vim text editor via 'libxkbswitch.so'. It is mainly used by a plugin for Vim text editor, vim-xkbswitch. Originally ruby-based code written by J.Broomley. %files %{_bindir}/%{name} %{_libdir}/libxkbswitch.so %{_libdir}/libxkbswitch.so.1 %{_libdir}/libxkbswitch.so.%{version} %{_mandir}/man1/%{name}.1.xz #------------------------------------------------------------------ %prep %setup -q -n xkb-switch-master %build %cmake %make %install %makeinstall_std -C build 





β€” , . , , xkb-switch 3 : , . :



  • /usr/bin/xkb-switch /usr/share/man/man1/xkb-switch.1.xz ,
  • β€” /usr/lib/libxkbswitch.so.1 /usr/lib/libxkbswitch.so.1.6.0 ,
  • β€” /usr/lib/libxkbswitch.so .


-. , ,
- Maximum RPM . - libxkbfile Rosa Linux .


.





β€” - libxkbfile . - :



 %define major 1 %define libname %mklibname xkbswitch %{major} %define develname %mklibname -d xkbswitch 


%define . , ( ) β€” , . , %{major} 1 , .


%mklibname Β«libΒ», , β€” ( ). %{libname} Β«libΒ» + Β«xkbswitchΒ» + ( %{major}) = libxkbswitch1 β€” .


-d %mklibname -devel . %{develname} libxkbswitch-devel β€” .





Version:



 Version: %{major}.6.0 


, -.


- . . :


 Name: xkb-switch Version: %{major}.6.0 Release: 1 Summary: Query and change XKB layout state License: GPLv3+ Group: Development/X11 URL: https://github.com/alexandersolovyov/xkb-switch Source0: https://github.com/alexandersolovyov/xkb-switch/archive/master.zip BuildRequires: cmake >= 2.6 BuildRequires: gcc BuildRequires: libxkbfile-devel BuildRequires: xz %description xkb-switch is a C++ program that allows to query and change the keyboard layout state for X11 Window System (XKB) via command line. It provides a command 'xkb-switch', and bindings for API of the Vim text editor, a library 'libxkbswitch'. It is mainly used for some plugins for Vim text editor, such as vim-xkbswitch. Originally ruby-based code written by J.Broomley. 




- . - , - ( rpm ). %package . -. , -. Version , Summary , Group . Provides Requires , . Name : , %package .


. %description β€” , %package .


Rosa Linux - %description -. libxkbswitch1 :


 %package -n %{libname} Version: %{version} Summary: A library for xkb-switch tool, provides API bindings for Vim text editor Group: Development/X11 %description -n %{libname} libxkbswitch library, required by xkb-switch tool. It provides bindings for API of the Vim text editor, which can be used via 'libxkbswitch.so.1'. 


-n %package %description , . - , xkb-switch-libxkbswitch1 . libxkbswitch1 . .


:


 %package -n %{develname} Version: %{version} Summary: Development library libxkbswitch, provides API bindings for Vim text editor Group: Development/X11 %description -n %{develname} Development files for libxkbswitch. Provides bindings for API of the Vim text editor via 'libxkbswitch.so'. 




, . %files .


, , %package , %description %files . , %description - . , , β€” xkb-switch .


- Rosa Linux %files , %prep . :


 %files %{_bindir}/%{name} %{_mandir}/%{name}.1.xz %files -n %{libname} %{_libdir}/libxkbswitch.so.%{major} %{_libdir}/libxkbswitch.so.%{version} %files -n %{develname} %{_libdir}/libxkbswitch.so 


, :



  • xkb-switch ~/usr/bin/xkb-switch ~/usr/share/man/man1/xkb-switch.1 ,
  • libxkbswitch1 ~/usr/lib/libxkbswitch.so.1 ~/usr/lib/libxkbswitch.so.1.6.0 ,
  • libxkbswitch-devel ~/usr/lib/libxkbswitch.so .


cleanup.sh rpmbuild -ba ~/rpmbuild/SPECS/xkb-switch.spec . 3 :



 libxkbswitch1.i586: W: no-documentation libxkbswitch-devel.i586: W: no-documentation libxkbswitch-devel.i586: W: no-dependency-on libxkbswitch/libxkbswitch-libs/liblibxkbswitch 


, . , . . Mari kita coba mencari tahu.





, , , README.md . %files β€” %doc :



 %doc README.md 


. %doc β€” . ~/rpmbuild/BUILD/xkb-switdh-master/README.md .


: libxkbswitch-devel.i586: W: no-dependency-on libxkbswitch/libxkbswitch-libs/liblibxkbswitch . , libxkbswitch-devel libxkbswitch .


rpm -qp -- . :


 [user@pc ~] $ cd ~/rpmbuild/RPMS/i586/ [user@pc ~/rpmbuild/RPMS/i586] $ ls libxkbswitch1-1.6.0-1-rosa2014.1.i586.rpm xkb-switch-1.6.0-1-rosa2014.1.i586.rpm libxkbswitch-devel-1.6.0-1-rosa2014.1.i586.rpm xkb-switch-debuginfo-1.6.0-1-rosa2014.1.i586.rpm [user@pc ~/rpmbuild/RPMS/i586] $ rpm -qp --provides libxkbswitch1-1.6.0-1-rosa2014.1.i586.rpm libxkbswitch.so.1 libxkbswitch1 = 1.6.0-1:2014.1 [user@pc ~/rpmbuild/RPMS/i586] $ rpm -qp --provides libxkbswitch-devel-1.6.0-1-rosa2014.1.i586.rpm devel(libxkbswitch) libxkbswitch-devel = 1.6.0-1:2014.1 [user@pc ~/rpmbuild/RPMS/i586] $ rpm -qp --requires libxkbswitch-devel-1.6.0-1-rosa2014.1.i586.rpm devel(libX11) devel(libgcc_s) devel(libstdc++) devel(libxkbfile) rpmlib(PayloadIsXz) <= 5.2-1 [user@pc ~/rpmbuild/RPMS/i586] $ rpm -qp --requires xkb-switch-1.6.0-1-rosa2014.1.i586.rpm libc.so.6 libc.so.6(GLIBC_2.0) libc.so.6(GLIBC_2.1.3) libgcc_s.so.1 libgcc_s.so.1(GCC_3.0) libstdc++.so.6 libstdc++.so.6(CXXABI_1.3) libstdc++.so.6(GLIBCXX_3.4) libstdc++.so.6(GLIBCXX_3.4.11) libstdc++.so.6(GLIBCXX_3.4.20) libstdc++.so.6(GLIBCXX_3.4.9) libxkbswitch.so.1 rpmlib(PayloadIsXz) <= 5.2-1 


, libxkbswitch1 libxkbswitch.so.1 libxkbswitch1 . xkb-switch libxkbswitch.so.1 , libxkbswitch-devel libxkbswitch1 . , %package libxkbswitch-devel . :



 %package -n %{develname} Version: %{version} Summary: Development library libxkbswitch, provides API bindings for Vim text editor Group: Development/X11 Requires: %{libname} >= %{version} 


, … . libxkbswitch-devel , , . , , rpmbuild .


-, ( README.md ), β€” :



-
 %define major 1 %define libname %mklibname xkbswitch %{major} %define develname %mklibname -d xkbswitch # Main package. Automaticaly requires libxkbswitch and libxkbswitch-devel Name: xkb-switch Version: %{major}.6.0 Release: 1 Summary: Query and change XKB layout state License: GPLv3+ Group: Development/X11 URL: https://github.com/alexandersolovyov/xkb-switch Source0: https://github.com/alexandersolovyov/xkb-switch/archive/master.zip BuildRequires: cmake >= 2.6 BuildRequires: gcc BuildRequires: libxkbfile-devel BuildRequires: xz %description xkb-switch is a C++ program that allows to query and change the keyboard layout state for X11 Window System (XKB) via command line. It provides a command 'xkb-switch', and bindings for API of the Vim text editor, a library 'libxkbswitch'. It is mainly used for some plugins for Vim text editor, such as vim-xkbswitch. Originally ruby-based code written by J.Broomley. # libxkbswitch %package -n %{libname} Version: %{version} Summary: A library for xkb-switch tool, provides API bindings for Vim text editor Group: Development/X11 %description -n %{libname} libxkbswitch library, required by xkb-switch tool. It provides bindings for API of the Vim text editor, which can be used via 'libxkbswitch.so.1'. # libxkbswitch-devel %package -n %{develname} Version: %{version} Summary: Development library libxkbswitch, provides API bindings for Vim text editor Group: Development/X11 Requires: %{libname} >= %{version} %description -n %{develname} Development files for libxkbswitch. Provides bindings for API of the Vim text editor via 'libxkbswitch.so'. # xkb-switch %files %{_bindir}/%{name} %{_mandir}/man1/%{name}.1.xz # libxkbswitch1 %files -n %{libname} %{_libdir}/libxkbswitch.so.%{major} %{_libdir}/libxkbswitch.so.%{version} %doc README.md # libxkbswitch-devel %files -n %{develname} %{_libdir}/libxkbswitch.so %doc README.md #------------------------------------------------------------------ %prep %setup -q -n xkb-switch-master %build %cmake %make %install %makeinstall_std -C build 




Kesimpulan


, RPM Rosa Linux ( ). , -. , β€” , , rpmrc , ABF , β€” .


β€” , -, - , β€” .








rpmbuild -bp specfile.spec
Menjalankan persiapan (persiapan%).

rpmbuild -bc specfile.spec
Run kompilasi (% build) dan semua tindakan sebelumnya.

rpmbuild -bi specfile.spec
Lakukan pseudo- instal (% instal) dan semua langkah sebelumnya.

rpmbuild -ba specfile.spec
Membangun paket sepenuhnya.




Memeriksa paket yang sudah selesai


rpmlint -i package_file_name.rpm
Pemeriksaan umum - seberapa baik paket itu dibangun.

rpm -qp --menyediakan package_filename.rpm
Periksa "fitur" mana yang disediakan oleh paket.

rpm -qp --membutuhkan package_filename.rpm
Periksa "kemampuan" paket mana yang bergantung pada paket ini.

rpm -qpl package_file_name.rpm
Daftar file yang terkandung dalam paket.

rpm -qpi package-file-name.rpm
Informasi tentang paket (dari "header" file spesifikasi atau dari blok % package ).



, p . , Rosa Linux, . urpmq , rpm -q . , urpmq -l _ , urpmq --requires _ .




( )


  1. Building RPMs β€” Quick Start β€” RPM Rosa Linux.
  2. RPM β€” , , . .
  3. RPM: spec β€” - Rosa Linux.
  4. Maximum RPM β€” rpm RPM- RedHat Linux. , Rosa Linux. .
  5. Template Spec Files β€” .spec . , -.
  6. Automatic Build Farm (ABF) β€” Rosa Linux. , , , .spec . -.
  7. Rpmlint Errors β€” , rpmlint .
  8. Packaging Group β€” Rosa Linux.
  9. Rosa Linux .
  10. Git β€” β€” Git .

Source: https://habr.com/ru/post/id464993/


All Articles