RPM 파일을 만들려면 어떻게해야합니까?


148

단지 몇 가지 의존성으로 Linux 바이너리 "foobar"를 배포하기 위해 RPM 파일을 만들고 싶습니다. 구성 파일 /etc/foobar.conf가 있으며 / usr / bin / foobar에 설치해야합니다.

불행히도 RPM에 대한 문서 는 27 장으로 구성되어 있으며 다른 플랫폼 용 .deb 및 EXE 설치 프로그램을 만드는 데 바쁘기 때문에 앉아서 읽을 시간이 없습니다.

RPM을 만들려면 어떻게해야합니까? foobar 바이너리와 foobar.conf가 현재 작업 디렉토리에 있다고 가정하십시오.


1
" RPM 패키지를 만드는 방법 "은 RPM 에 대한 훌륭한 글쓰기입니다 (Fedora 문서)
webwesen

6
그것을 '쓰기'라고 부르는 것은
과소

답변:


177

나는 종종 리눅스에서 독점적 인 앱을 패키징 할 때 바이너리 바이너리를 사용합니다. 따라서 가능한 경우 TRUE RPM을 사용하는 것이 좋습니다. 그러나 나는 산만하다.

따라서 (이진) 프로그램을 포장하는 기본 단계는 다음과 같습니다-프로그램이 버전 1.0의 toybinprog이고 /etc/toybinprog/toybinprog.conf에 conf를 설치하고 bin을 설치한다고 가정합니다. / usr / bin에서 tobinprog :

1. RPM <4.6,4.7에 대한 rpm 빌드 환경을 만듭니다.

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

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

cd ~/rpmbuild

2. 프로젝트의 타르볼 생성

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. 소스 디렉토리에 복사

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 <devzero2000@rpm5.org> 1.0-1
- First Build

EOF

4. 소스와 바이너리 rpm을 빌드하십시오

rpmbuild -ba SPECS/toybinprog.spec

그리고 그게 전부입니다.

이 도움을 바랍니다


6
"rpmbuild : command not found"가 발생하는 경우 wiki.centos.org/HowTos/SetupRpmBuildEnvironment를 참조하십시오 . 그러나이 안내서는 rpm의 내부 작업을 배우는 데있어 좋은 시작입니다.
icasimpan 5

4
귀하의 예에서 _bindir은 무엇입니까? 귀하의 솔루션을 따르려고하지만 바이너리를 / opt에 넣고 싶습니다. 그에 따라 targz 파일을 만들었습니다. 그리고 buildbuild / usr / bin의 "file not found"에서 rpmbuild가 실패합니다.
Kiss Viktoria

sudo dnf install rpm-build-rpmbuild v4.13 + 설치를위한 Fedora 23 명령
Ray Foss

1
@ devzero2000 TRUE RPM의 의미는 무엇입니까?
RubenLaguna

@ devzero2000 rpmbuild 폴더는 / root 디렉토리에 있거나 다른 곳에 놓을 수 있습니까?
Diogo Calazans

20

응용 프로그램 배포자 인 fpm은 고객의 요구에 완벽하게 부합합니다 . 이 여기에 예를 보여줍니다 방법 소스에서 응용 프로그램을 패키지로. FPM은 deb 파일과 RPM 파일을 모두 생성 할 수 있습니다.


2
FPM은 훌륭한 도구입니다.
Takashi

우리는 직장에서 항상이 도구를 사용합니다. 지금까지 가장 실용적인 도구는 필요에 맞습니다.
djhaskin987

2
FPM은 소프트웨어에서 얻을 수있는 최고의 기본 원칙을 가지고 있습니다. 도움이되지 않으면 버그가 있습니다. 내가 소중히 여기는 헌신입니다.
ribamar

16

빠른 RPM 구축을 위해 Togo를 확인하십시오.

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

이 프로젝트에는 빠른 시작 안내서가 있으며 3 분 이내에 기본 RPM을 만들 수있었습니다.

원래 질문에 제공된 데이터를 사용한 예 :

1) 스크립트를 사용하여 프로젝트 디렉토리를 작성하십시오.

$ togo project create foobar; cd foobar

2) ./root 아래에 원하는 디렉토리 구조를 만들고 파일을 복사하십시오.

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

3) RPM 소유에서 시스템 소유 디렉토리를 제외하십시오.

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

4) (선택 사항) 생성 된 스펙을 수정하여 패키지 설명 / 종속성 / 버전 / 무엇 등을 변경하십시오.

$ vi spec/header

5) RPM을 빌드하십시오.

$ togo build package

그리고 RPM은 ./rpms 디렉토리에 뱉어집니다.


원래 질문에 제공된 시나리오와 일치하도록 예제를 업데이트했습니다.
dadealeus

15

마찬가지로, 몇 개의 파일만으로 rpm을 만들어야했습니다. 이 파일들은 소스로 제어되었고 어리석은 것처럼 보였으므로 rpm untar로 만들기 위해 taring하는 것을 원하지 않았습니다. 나는 다음을 생각해 냈다.

  1. 환경을 설정하십시오.

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

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

  2. 다음 내용으로 스펙 파일 foobar.spec을 작성하십시오.

    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. rpm을 빌드하십시오. rpmbuild -bb foobar.spec

'source'를 현재 디렉토리로 지정하면 약간의 해커가 있지만 대안보다 훨씬 우아해 보였습니다. 제 경우에는 별도의 스크립트를 작성하여 tarball 등을 만드는 것입니다.

참고 : 특정 상황에서 내 파일은 다음과 같이 이동 해야하는 위치에 따라 폴더로 정렬되었습니다.

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

그래서 준비 섹션이되었습니다 :

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

조금 더 깨끗합니다.

또한 rpm 버전 4.4.2.3의 RHEL5.6을 사용하므로 마일리지가 다를 수 있습니다.


"Red Hat Enterprise Linux Server 릴리스 6.9"에서 작동 하도록 모든 기능 $RPM_BUILD_ROOT을 설정 %{buildroot}해야했습니다. 또한 rpmbuild를 실행할 때 설치된 두 파일이 현재 디렉토리에 있어야했습니다. 다른 컴퓨터에 다음과 같이 설치했습니다. sudo rpm -Uvh --nodeps foobar-0.1a-1.x86_64.rpm
user1683793

4

경우 make config프로그램이나 당신을위한 작품은 당신이 사용할 수있는 적절한 위치에 복사하여 두 개의 파일을 쉘 스크립트가 에서는 checkinstall을 . makefile이있는 디렉토리로 이동하여 매개 변수 -R( RPM 용 ) 및 선택적으로 설치 스크립트를 사용하여 호출하십시오 .


4

바이너리에서 rpm 패키지를 만드는 쉬운 방법 (이 단계는 Fedora 18로 테스트되었습니다) :

1) 먼저 rpmdevtools를 설치해야하므로 다음 명령을 실행하십시오 (주의 : 일반 사용자로 실행).

$ sudo yum install rpmdevtools rpmlint
$ rpmdev-setuptree

2) ~ / rpmbuild / SPECS 폴더에 package_name.spec이라는 새 파일을 만듭니다.

3) 편집기 (gedit 등)로 열고 다음과 같이 작성하십시오.

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) ~ / rpmbuild / BUILDROOT / package_name-version-release.i386을 만들고 파일이 위치 할 경로를 재현하십시오.

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

5) 패키지에 삽입 할 파일을 다음 폴더에 넣으십시오.

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

usr / share / pixmaps / package_name.png는 바이너리의 아이콘입니다 usr / share / applications / package_name.desktop은 메뉴 항목에 프로그램을 삽입하는 규칙입니다.

6) package_name.desktop은 다음과 같아야합니다.

[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;

카테고리는 다음과 같습니다. 표준 .freedesktop.org / menu-spec / latest / apa.html

7) 달리다 $ rpmbuild -bb ~/rpmbuild/SPECS/package_name.spec

8) 패키지가 ~ / rpmbuild / RPMS 폴더에 내장되었습니다

이 패키지를 설치하면 설치됩니다 :

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

덕분에 : losurs.org/docs/tips/redhat/binary-rpms

rpm 빌드에 대한 자세한 내용은이 링크를 참조하십시오 .

rpm을 빌드하는 GUI Java 소프트웨어 : https://sourceforge.net/projects/javarpmbuilder/


-1

Maven에 익숙하다면 rpm-maven-pluginRPM 작성을 단순화 pom.xml할 수 있습니다. RPM 작성에 사용될 것만 작성하면됩니다. 플러그인에 의해 RPM 빌드 환경이 내재적으로 작성됩니다.


-3

소스 파일에서 RPM을 생성하는 프로세스 :

  1. .gz 확장자를 가진 소스 파일을 다운로드하십시오.
  2. yum install에서 rpm-build 및 rpmdevtools를 설치하십시오. (rpmbuild 폴더가 생성됩니다 ... SPECS, SOURCES, RPMS .. 폴더는 rpmbuild 폴더 안에 생성되어야합니다).
  3. 소스 code.gz를 SOURCES 폴더에 복사하십시오. (rpmbuild / SOURCES)
  4. 다음 명령을 사용하여 타르 볼을 푸십시오. tar 파일이있는 SOURCES 폴더 : rpmbuild / SOURCES로 이동하십시오. 예 : tar -xvzf httpd-2.22.tar.gz httpd-2.22 폴더는 동일한 경로에 생성됩니다.
  5. 추출 된 폴더로 이동 한 후 아래 명령을 입력하십시오. ./configure --prefix = / usr / local / apache2 --with-included-apr --enable-proxy --enable-proxy-balancer --with-mpm = worker- -enable-mods-static = all (.configure는 RPM을 빌드해야하는 소스에 따라 달라질 수 있습니다. apr 및 apr-util 종속성 패키지가 필요한 아파치 HTTPD에 대해 수행했습니다).
  6. 구성에 성공하면 아래 명령을 실행하십시오.
  7. 성공적인 실행 후 od make 명령 실행 : 동일한 폴더에 checkinstall. (checkinstall 소프트웨어가없는 경우 사이트에서 최신 버전을 다운로드하십시오.) 또한 checkinstall 소프트웨어에 다음과 같은 방법으로 해결할 수있는 버그가 있습니다. 제외 패키지도 확인하십시오 : EXCLUDE = "/ selinux"
  8. checkinstall은 옵션을 요구합니다 (소스 파일에 대해 tp 빌드 rpm을 원하면 R을 입력하십시오)
  9. 완료된 .rpm 파일은 rpmbuild / RPMS 파일 내부의 RPMS 폴더에 생성됩니다 ... 모두 최고 ....

-4

RPM은 일반적으로 바이너리가 아닌 소스에서 빌드됩니다.

애플리케이션을 구성하고 컴파일하는 방법을 설명하는 스펙 파일을 작성해야합니다. 또한 RPM에 포함 할 파일도 있습니다.

매뉴얼을 간략히 살펴보면 필요한 대부분의 내용이 8 장에서 다룰 수 있습니다. 또한 대부분의 RPM 기반 배포판에는 소스가 있으므로 문자 그대로 볼 수있는 다양한 접근 방식의 예가 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.