Apa minimum yang harus saya lakukan untuk membuat file RPM?

148

Saya hanya ingin membuat file RPM untuk mendistribusikan biner Linux saya "foobar", dengan hanya beberapa dependensi. Ini memiliki file config, /etc/foobar.conf dan harus diinstal di / usr / bin / foobar.

Sayangnya dokumentasi untuk RPM panjangnya 27 bab dan saya benar-benar tidak punya waktu untuk duduk dan membaca ini, karena saya juga sibuk membuat installer .deb dan EXE untuk platform lain.

Apa minimum absolut yang harus saya lakukan untuk membuat RPM? Asumsikan biner foobar dan foobar.conf berada di direktori kerja saat ini.

Steve Hanov
sumber
1
" Cara membuat paket RPM " adalah baik write-up pada (Fedora docs) RPM
webwesen
6
Menyebutnya sebagai 'write-up' adalah pernyataan yang meremehkan
kernelK

Jawaban:

177

Saya sering melakukan rpm biner per kemasan aplikasi eksklusif - juga moster sebagai websphere - di linux. Jadi pengalaman saya bisa berguna juga bagi Anda, selain itu akan lebih baik untuk melakukan RPM BENAR jika Anda bisa. Tapi saya ngelantur.

Jadi langkah dasar untuk mengemas program (biner) Anda adalah sebagai berikut - di mana saya kira program tersebut adalah toybinprog dengan versi 1.0, memiliki conf untuk diinstal di /etc/toybinprog/toybinprog.conf dan memiliki bin untuk diinstal di / usr / bin dipanggil tobinprog:

1. buat rpm build env Anda untuk RPM <4.6,4.7

mkdir -p ~/rpmbuild/{RPMS,SRPMS,BUILD,SOURCES,SPECS,tmp}

cat <<EOF >~/.rpmmacros
%_topdir   %(echo $HOME)/rpmbuild
%_tmppath  %{_topdir}/tmp
EOF

cd ~/rpmbuild

2. buat tarball proyek Anda

mkdir toybinprog-1.0
mkdir -p toybinprog-1.0/usr/bin
mkdir -p toybinprog-1.0/etc/toybinprog
install -m 755 toybinprog toybinprog-1.0/usr/bin
install -m 644 toybinprog.conf toybinprog-1.0/etc/toybinprog/

tar -zcvf toybinprog-1.0.tar.gz toybinprog-1.0/

3. Salin ke sumber dir

cp toybinprog-1.0.tar.gz SOURCES/

cat <<EOF > SPECS/toybinprog.spec
# Don't try fancy stuff like debuginfo, which is useless on binary-only
# packages. Don't strip binary too
# Be sure buildpolicy set to do nothing
%define        __spec_install_post %{nil}
%define          debug_package %{nil}
%define        __os_install_post %{_dbpath}/brp-compress

Summary: A very simple toy bin rpm package
Name: toybinprog
Version: 1.0
Release: 1
License: GPL+
Group: Development/Tools
SOURCE0 : %{name}-%{version}.tar.gz
URL: http://toybinprog.company.com/

BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root

%description
%{summary}

%prep
%setup -q

%build
# Empty section.

%install
rm -rf %{buildroot}
mkdir -p  %{buildroot}

# in builddir
cp -a * %{buildroot}


%clean
rm -rf %{buildroot}


%files
%defattr(-,root,root,-)
%config(noreplace) %{_sysconfdir}/%{name}/%{name}.conf
%{_bindir}/*

%changelog
* Thu Apr 24 2009  Elia Pinto <[email protected]> 1.0-1
- First Build

EOF

4. bangun sumber dan rpm biner

rpmbuild -ba SPECS/toybinprog.spec

Dan itu saja.

Semoga bantuan ini

devzero2000
sumber
6
Jika Anda menemukan "rpmbuild: command not found", lihat wiki.centos.org/HowTos/SetupRpmBuildEnvironment . Tapi panduan ini adalah awal yang baik bagi saya dalam mempelajari cara kerja rpm
icasimpan
4
Dalam contoh Anda, apa yang membuat _bindir? Saya mencoba mengikuti solusi Anda, tetapi saya ingin menempatkan binari saya ke / opt. Saya membuat file targz sesuai dengan itu. Dan rpmbuild gagal pada "file not found" di buildroot / usr / bin.
Ciuman Viktoria
sudo dnf install rpm-build- Perintah Fedora 23 untuk menginstal rpmbuild v4.13 +
Ray Foss
1
@ devzero2000 Apa yang Anda maksud dengan TRUE RPM?
RubenLaguna
@ devzero2000 folder rpmbuild harus di direktori / root atau saya bisa meletakkannya di tempat lain?
Diogo Calazans
20

Sebagai distributor aplikasi, fpm terdengar sempurna untuk kebutuhan Anda . Ada contoh di sini yang menunjukkan cara mengemas aplikasi dari sumber. FPM dapat menghasilkan file deb dan file RPM.

timmow
sumber
2
FPM adalah alat yang luar biasa.
Takashi
Kami menggunakan alat ini setiap saat di tempat kerja. Sejauh ini, alat paling praktis yang sesuai dengan kebutuhan.
djhaskin987
2
FPM memiliki prinsip fundamental terbaik yang dapat diperoleh seseorang dalam perangkat lunak: jika tidak membantu, ada bug. Itu jenis komitmen yang saya hargai.
ribamar
16

Untuk membangun RPM cepat, lihat Togo:

https://github.com/genereese/togo-rpm

Proyek ini memiliki panduan Mulai Cepat dan saya dapat membuat RPM dasar dalam waktu kurang dari 3 menit.

Contoh menggunakan data yang disediakan dalam pertanyaan awal:

1) Buat direktori proyek menggunakan skrip:

$ togo project create foobar; cd foobar

2) Buat struktur direktori yang Anda inginkan di bawah ./root dan salin file Anda ke dalamnya:

$ mkdir -p root/etc; cp /path/to/foobar.conf root/etc/
$ mkdir -p root/usr/bin; cp /path/to/foobar root/usr/bin/

3) Kecualikan direktori yang dimiliki sistem dari kepemilikan RPM Anda:

$ togo file exclude root/etc root/usr/bin

4) (OPTIONAL) Ubah spec yang dihasilkan untuk mengubah deskripsi paket / dependensi / versi / apa pun, dll .:

$ vi spec/header

5) Bangun RPM:

$ togo build package

-dan RPM Anda diludahkan ke dalam direktori ./rpms.

Dadealeus
sumber
Diperbarui contoh untuk mencocokkan skenario yang disediakan dalam pertanyaan awal.
dadealeus
15

Demikian pula, saya perlu membuat rpm hanya dengan beberapa file. Karena file-file ini dikendalikan oleh sumber, dan karena itu tampak konyol, saya tidak ingin melanjutkannya dengan men-download rpm saja. Saya datang dengan yang berikut:

  1. Siapkan lingkungan Anda:

    mkdir -p ~/rpm/{BUILD,RPMS}

    echo '%_topdir %(echo "$HOME")/rpm' > ~/.rpmmacros

  2. Buat file spesifikasi Anda, foobar.spec, dengan konten berikut:

    Summary: Foo to the Bar
    Name: foobar
    Version: 0.1
    Release: 1
    Group: Foo/Bar
    License: FooBarPL
    Source: %{expand:%%(pwd)}
    BuildRoot: %{_topdir}/BUILD/%{name}-%{version}-%{release}
    
    %description
    %{summary}
    
    %prep
    rm -rf $RPM_BUILD_ROOT
    mkdir -p $RPM_BUILD_ROOT/usr/bin
    mkdir -p $RPM_BUILD_ROOT/etc
    cd $RPM_BUILD_ROOT
    cp %{SOURCEURL0}/foobar ./usr/bin/
    cp %{SOURCEURL0}/foobar.conf ./etc/
    
    %clean
    rm -r -f "$RPM_BUILD_ROOT"
    
    %files
    %defattr(644,root,root)
    %config(noreplace) %{_sysconfdir}/foobar.conf
    %defattr(755,root,root)
    %{_bindir}/foobar
    
  3. Bangun rpm Anda: rpmbuild -bb foobar.spec

Ada sedikit peretasan di sana yang menentukan 'sumber' sebagai direktori Anda saat ini, tetapi tampaknya jauh lebih elegan daripada alternatifnya, yaitu, dalam kasus saya, menulis skrip terpisah untuk membuat tarball, dll, dll.

Catatan: Dalam situasi khusus saya, file saya diatur dalam folder sesuai dengan tujuan mereka, seperti ini:

./etc/foobar.conf
./usr/bin/foobar

dan jadi bagian persiapan menjadi:

%prep
rm -rf $RPM_BUILD_ROOT
mkdir -p $RPM_BUILD_ROOT
cd $RPM_BUILD_ROOT
tar -cC %{SOURCEURL0} --exclude 'foobar.spec' -f - ./ | tar xf -

Yang sedikit lebih bersih.

Juga, saya kebetulan menggunakan RHEL5.6 dengan versi rpm 4.4.2.3, jadi jarak tempuh Anda mungkin berbeda.

glickbot
sumber
Saya harus mengubah semua $RPM_BUILD_ROOTagar %{buildroot}bisa berfungsi pada "Red Hat Enterprise Linux Server rilis 6.9" saya. Juga, dua file yang diinstal harus berada di direktori saat ini ketika saya menjalankan rpmbuild. Saya menginstalnya di komputer saya yang lain dengan: sudo rpm -Uvh --nodeps foobar-0.1a-1.x86_64.rpm
user1683793
4

Jika make configberfungsi untuk program Anda atau Anda memiliki skrip shell yang menyalin dua file Anda ke tempat yang tepat Anda dapat menggunakan checkinstall . Cukup buka direktori tempat makefile Anda berada dan panggil dengan parameter -R(untuk RPM ) dan secara opsional dengan skrip instalasi.

js.
sumber
4

Cara mudah untuk membuat paket rpm dari binary (langkah-langkah ini diuji dengan Fedora 18):

1) Pertama, Anda harus menginstal rpmdevtools, jadi jalankan perintah ini (perhatian: jalankan sebagai pengguna normal)

$ sudo yum install rpmdevtools rpmlint
$ rpmdev-setuptree

2) Dalam folder ~ / rpmbuild / SPECS buat file baru: package_name.spec

3) Buka dengan editor (seperti gedit) dan tulis ini:

Name:           package_name
Version:        1.0
Release:        1
Summary:        Short description (first char has to be uppercase)

License:        GPL
URL:            www. your_website/

BuildRequires:  package_required >= (or ==, or <=) 1.0.3 (for example)

%description
Description with almost 79 characters (first char has to be uppercase)

#This is a comment (just as example)

%files
/usr/bin/binary_file.bin
/usr/share/applications/package_name.desktop
/usr/share/pixmaps/package_name.png

%changelog
* date Packager's Name <packager's_email> version-revision
- Summary of changes

#For more details see: docs.fedoraproject.org/en-US/Fedora_Draft_Documentation/0.1/html/Packagers_Guide/sect-Packagers_Guide-Creating_a_Basic_Spec_File.html

4) Buat ~ / rpmbuild / BUILDROOT / package_name-version-release.i386 dan buat kembali jalur tempat file akan ditempatkan. Jadi dalam kasus ini misalnya buat:

  • ~ / rpmbuild / BUILDROOT / package_name-version-release.i386 / usr / bin /
  • ~ / rpmbuild / BUILDROOT / package_name-version-release.i386 / usr / share / aplikasi /
  • ~ / rpmbuild / BUILDROOT / package_name-version-release.i386 / usr / share / pixmaps /

5) Masukkan ke dalam folder-folder ini file yang ingin Anda masukkan ke dalam paket:

  • ~ / rpmbuild / BUILDROOT / package_name-version-release.i386 / usr / bin / binary_file.bin
  • ~ / rpmbuild / BUILDROOT / package_name-version-release.i386 / usr / share / aplikasi / package_name.desktop
  • ~ / rpmbuild / BUILDROOT / package_name-version-release.i386 / usr / share / pixmaps / package_name.png

usr / share / pixmaps / package_name.png adalah ikon biner usr / share / application / package_name.desktop adalah aturan untuk memasukkan program dalam entri menu

6) package_name.desktop harus seperti ini:

[Desktop Entry]
Encoding=UTF-8
Type=Application
Name=example
GenericName=Short description
Comment=Comment of the application
Exec=package_name
Icon=package_name
Terminal=false
Categories=System;

Kategorinya adalah ini: standards.freedesktop.org/menu-spec/latest/apa.html

7) Lari $ rpmbuild -bb ~/rpmbuild/SPECS/package_name.spec

8) Paket Anda dibangun ke dalam folder ~ / rpmbuild / RPMS

jika Anda menginstal paket ini instal:

  • /usr/bin/binary_file.bin
  • /usr/share/applications/package_name.desktop
  • /usr/share/pixmaps/package_name.png

Terima kasih kepada: losurs.org/docs/tips/redhat/binary-rpms

Untuk detail lebih lanjut untuk membuat rpm, lihat tautan ini .

Perangkat lunak GUI java untuk membangun rpm: https://sourceforge.net/projects/javarpmbuilder/

RobotMan
sumber
-1

Jika Anda terbiasa dengan Maven ada juga rpm-maven-pluginyang menyederhanakan membuat RPM: Anda harus menulis hanya pom.xmlyang akan digunakan untuk membangun RPM. Lingkungan RPM build dibuat secara implisit oleh plugin.

scrutari
sumber
-3

Proses menghasilkan RPM dari file sumber:

  1. unduh file sumber dengan ekstensi .zz.
  2. instal rpm-build dan rpmdevtools dari yum install. (folder rpmbuild akan dibuat ... SPECS, SOURCES, RPMS .. folder akan dibuat di dalam folder rpmbuild).
  3. salin kode sumber.gz ke folder SOURCES. (rpmbuild / SOURCES)
  4. Batalkan bola tar dengan menggunakan perintah berikut. buka folder SOURCES: rpmbuild / SOURCES tempat file tar ada. perintah: misalnya tar -xvzf httpd-2.22.tar.gz folder httpd-2.22 akan dihasilkan di jalur yang sama.
  5. pergi ke folder yang diekstraksi dan kemudian ketik perintah di bawah ini: ./configure --prefix = / usr / local / apache2 --dengan termasuk apr --enable-proxy --enable-proxy-balancer --with-mpm = pekerja - -enable-mods-static = all (.configure dapat bervariasi sesuai dengan sumber yang harus dibangun RPM - saya telah melakukan untuk apache HTTPD yang membutuhkan paket ketergantungan apr dan apr-util).
  6. jalankan perintah di bawah ini setelah konfigurasi berhasil: make
  7. setelah eksekusi berhasil membuat perintah dijalankan: checkinstall di folder yang sama. (Jika Anda tidak memiliki perangkat lunak checkinstall, silakan unduh versi terbaru dari situs) Perangkat lunak checkinstall juga memiliki bug yang dapat diselesaikan dengan mengikuti cara ::::: cari checkinstallrc lalu ganti TRANSLATE = 1 ke TRANSLATE = 0 menggunakan perintah vim. Periksa juga untuk mengecualikan paket: EXCLUDE = "/ selinux"
  8. checkinstall akan meminta opsi (ketik R jika Anda ingin tp build rpm untuk file sumber)
  9. File .rpm selesai akan dibangun dalam folder RPMS di dalam file rpmbuild / RPMS ... SEMUA YANG TERBAIK ....
pengguna3248738
sumber
-4

RPM biasanya dibangun dari sumber, bukan binari.

Anda perlu menulis file spesifikasi yang mencakup cara mengkonfigurasi dan mengkompilasi aplikasi Anda; juga, file mana yang akan disertakan dalam RPM Anda.

Pandangan sekilas ke manual menunjukkan bahwa sebagian besar dari apa yang Anda butuhkan tercakup dalam Bab 8 - juga, karena sebagian besar distribusi berbasis RPM memiliki sumber yang tersedia, ada sejuta contoh pendekatan berbeda yang dapat Anda lihat.

andri
sumber