Rpmbuild spec file

From 탱이의 잡동사니
Jump to navigation Jump to search

Overview

RPM spec file 내용 정리

Preamble

Preamble 에는 패키지 기본 정보 및 누가 작업을 했는지 등을 입력한다. 아래는 간단한 예제이다.

#
# Example spec file for cdplayer app...
#
Summary: A CD player app that rocks!
Name: cdplayer
Version: 1.0
Release: 1
Copyright: GPL
Group: Applications/Sound
Source: ftp://ftp.gnomovision.com/pub/cdplayer/cdplayer-1.0.tgz
URL: http://www.gnomovision.com/cdplayer/cdplayer.html
Distribution: WSS Linux
Vendor: White Socks Software, Inc.
Packager: Santa Claus <sclaus@northpole.com>

%description
It slices!  It dices!  It's a CD player app that
can't be beat.  By using the resonant frequency
of the CD itself, it is able to simulate 20X
oversampling.  This leads to sound quality that
cannot be equaled with more mundane software...

Name

RPM 패키지의 이름을 설정한다.

Version

생성되는 패키지의 버전 정보를 설정한다. 여기에 설정된 버전 정보는 패키지 레이블 및 패키지 filename 에 설정되게 된다.

Release

Release 번호는 이 패키지가 현재 버전에서 몇번째 릴리즈 되었는지를 나타낸다. 패키지 레이블은 버전 정보와 릴리즈 번호가 합쳐져서 나타난 정보이다.

Copyright

Copyright 는 패키징된 소프트웨어의 카피라이트 정보를 나타낸다. 위의 예제에서는 GPL 을 사용한다고 나타나있다.

License

라이센스 정보를 나타낸다. Copyright 와 비슷하다.

URL

해당 소프트웨어의 더욱 자세한 정보를 알수 있는 URL 정보를 입력한다.

Group

Group 은 해당 패키지가 어떤 종류의 소프트웨어 인지를 나타낸다.

Source

RPM을 만들기 위해 사용할 압축파일(*.tar.gz)를 지정한다. Source 뒤에 숫자를 붙여 여러 소스파일을 지정해 줄 수 있다. 숫자는 '0'부터 시작해야 한다.

Source0: ftp://ftp.gnomovision.com/pub/cdplayer/cdplayer-1.0.tgz

BuildRoot

RPM 파일 빌드에 사용할 루트 디렉토리를 지정한다. RPM 패키지를 빌드할 때 소스를 컴파일하고 컴파일한 프로그램을 BuildRoot 필드가 지정하는 디렉토리를 루트 디렉토리(/)로 간주하여 설치한다. 이렇게 설치된 디렉토리 구조를 묶어서 CONTENTS.cpio 파일을 만들어 RPM 파일을 만들게 된다.

Requires

생성되는 RPM 의 설치 의존성을 설정한다. 기본적으로는 이름만 써도 되지만, 버전을 체크하도록 할 수 있다. 비교 연산자로는 (>, <, =, >=, <=)를 지원한다.

Requires: python < 2.7, python-redis, tar, freeswitch

BuildRequires

때로는 RPM을 Build 하기 위해서도 필요한 패키지가 있을 수 있다. RPM을 Build 하기 위해 필요한 RPM 패키지를 지정한다.

BuildRequires: python

%description

패키지에 대한 상세 설명을 설정한다.

Summary 에서는 한줄로만 간단하게 패키지의 설명을 적을 수 있었지만 %description 에서는 하나 이상의 라인을 이용하여 더욱 많은 정보를 설정할 수 있다.

%prep

이곳에서부터 명령 부분이 시작된다. 소스를 빌드할 준비를 하는데 쓰이며, 소스 패치, make 같은 셋업을 하는데 필요한 것들을 할 수 있다.

한가지 주의할 점으로 각각의 단락에는 실행할 쉘 스크립트가 와야한다. 간단히 소스를 풀고 패치할 쉘 스크립트를 만들어 %prep 아래에 적으면 된다. 주로 미리 정의된 %setup, %patch 매크로를 사용한다.

%prep
rm -rf $RPM_BUILD_DIR/cdplayer-1.0
zcat $RPM_SOURCE_DIR/cdplayer-1.0.tgz | tar -xvf -

%setup

간단한 양식으로써 소스를 풀고 소스 디렉토리로 이동하는 동작을 하는 매크로이다. 이를 풀어쓰면, 다음과 같은 동작을 한다고 생각하면 된다.

cd /usr/src/redhat/BUILD
rm -rf cd-player
gzip -dc /usr/src/redhat/SOURCES/cdplayer-1.0.tgz | tar -xvvf -
if [ $? -ne 0 ]; then
  exit $?
fi
cd cd-player
cd /usr/src/redhat/BUILD/cd-player
chown -R root.root .
chmod -R a+rX,g-w,o-w .

추가 옵션은 다음과 같다.

  • -n <name>
리스트된 이름에 빌드할 디렉토리의 이름을 정하는데, 기본값은 $NAME-$VERSION 이다.

%build

%install

%build 에서 컴파일된 프로그램을 설치하는 명령어를 적어주는 부분이다. 달리말하면 %build 다음에 실행되는 부분이며, 빌드 수행결과 생성된 파일들을 설치 폴더로 복사하는 역할을 수행한다. 이것 역시 실제 어떠한 매크로가 아니다.

기본적으로 설치하는데 필요한 명령을 적어준다. make install 에 쓰일 makefile 을 패치하거나 make install 을 여기서 할 수 있다. 또는 수동적인 쉘 명령으로 설치할 수도 있다. 현재 디렉토리가 소스 디렉토리의 가장 상위 디렉토리가 된다는 것에 주의해야 한다.

대부분 make install 을 수행해서 실행 파일들을 ~/rpmbuild/BUILDROOT 디렉토리 아래로 넣는 작업을 수행한다.

%install
%{__install} -p -D -m 755 etc/%{name}.init      %{buildroot}%{_initrddir}/%{name}

%files

RPM 파일에 패키징되어야하는 파일의 이름들을 지정한다. 즉, 여기서 지정한 파일들만 RPM 파일에 묶이게 된다. 디렉토리 이름을 지정할 경우, 하위 디렉토리를 포함한 모든 파일을 묶는 의미로 사용횐다.

파일 리스트에서 가장 주의해야 할 것은 디렉토리 리스트이다. 실수로 /usr/bin 을 써 두었다면, RPMbuild 는 /usr/bin 에 있는 모든 파일들을 추가하게 된다.

%doc

소스 패키지 내의 문서 파일을 지정하는데 사용된다. 문서는 /usr/doc/$NAME-$VERSION-$RELEASE 에 설치된다. 매크로를 써서 명령행에서 여러 문서를 리스트하거나, 각각을 매크로로 사용해서 리스트 할 수도 있다.

%config

패키지에서 설정 파일을 지정하는데 사용된다. RPM 패키지에 추가될 뿐만 아니라 해당 패키지가 제거될 때 패키지에 포함된 다른 파일은 시스템에서 삭제가 되지만 %config 매크로로 지정된 설정파일은 [설정파일패스].rpmsave 형태로 백업된다.

이미 기존에 사용중이던 설정 파일이 있을 경우, %config 옵션을 통해 어떻게 할 것인지를 지정할 수 있다. 아무런 옵션 값이 없을 경우, 기존의 파일은 .rpmsave 파일로 변경하고 새로이 패키지에 포함된 파일이 해당 위치로 가게 된다.

  • %config(missingok)
해당 config file이 없어도 된다. 이 옵션은 /etc/rc.d/rc2.d/S55named 와 같은 심볼릭 링크와 같은 파일의 경우에 자주 사용된다.
  • %config(noreplace)
만약 설정 파일이 이미 존재하고 있을 경우(이미 기존에 사용중이던 설정파일이 있을 경우) 여기에 설정된 파일은 .rpmnew 파일로 저장된다(즉, 덮어쓰기를 하지 않는다)
  • Config file update
약간의 삽질이 있었다.
패키지 설치 -> 로컬 호스트에서 사용중인 설정 파일 수정 -> 업그레이된 패키지 설치
당연히 변경했던 설정 파일이 다시 엎어쓰기가 될 줄 알았다. 하지만 수정했던 설정파일이 그대로 있었던 것. 여러차례의 테스트를 한 뒤 겨우 확인할 수 있었다.
RPM에서 생성된 설정파일을 적용하기 위해서는 RPM 패키지를 만들 때의 설정 파일 역시 변경이 된 상태여야 한다.

%dir

패키지에 추가할 디렉토리를 지정할 때 사용한다. 예를 들어 /usr/lib 디렉토리를 지정하면 /usr/lib 디렉토리 자체가 RPM 패키지 안에 추가된다. 주의해야 할 점은 지정된 디렉토리만 추가된다는 점이다. 디렉토리 안에 있는 다른 디렉토리나 파일들을 추가하기 위해서는 %files 지시자 밑에 해당 경로를 추가로 입력해야만 한다.

%files
%dir /opt/var/www/html
/opt/var/www/html

%attr

%attr 지시자는 다음 세자기 속성값들을 설정하는 지시자이다.

  • 파일의 "permission" 혹은 "mode"
  • 파일의 "user id"
  • 파일의 "group id"

다음과 같이 사용한다.

%attr(<mode>, <user>, <group>) file

%attr(755, root, root) foo.bar

만약 특별한 설정값이 필요없는 상황이라면 '-'으로 대신할 수도 있다.

%attr(755, -, root) foo.bar

%defattr

%defattr 지시자는 파일이나 다른 지시자들의 기본 속성값들을 설정하는 지시자이다. %defattr 지시자는 %attr 지시자와 거의 유사한 설정값을 가진다.

  • 파일의 기본 "permission" 혹은 "mode"
  • 디렉토리의 기본 "permissino" 혹은 "mode"
  • 기본 user id
  • 기본 group id
%defattr(<file mode>, <user>, <group>, <dir mode>)

%post

RPM 설치 이후에 뭔가 추가 작업을 해줘야 할 때 사용한다. 예를 들면 설정 파일에서 값을 변경하거나, chkconfig 와 같은 작업 지정이 가능하다.

%post 
-p /sbin/ldconfig

%postun

RPM 삭제 명령 이후, 추가 작업을 해줘야 할 때 사용한다.

%postun 
-p /sbin/ldconfig

%changelog

Statement

if

  • -e, exists check.
if [ -e %{_initrddir}/cb_queues_names_hack ] ; then
    /sbin/service cb_queues_names_hack stop > /dev/null 2>&1 || :
    /sbin/chkconfig cb_queues_names_hack off
    /sbin/chkconfig --del cb_queues_names_hack
    rm %{_initrddir}/cb_queues_names_hack
fi

See also