System Admin

본문 바로가기
사이트 내 전체검색


RedHat Linux >> System Administration for Redhat Linux
[목차]
제6장 RPM 패키지 관리

    8. 타르볼에서 RPM 패키지 만들기

1. 소스 복사하기

# cp xmms-1.2.5.tar.gz /usr/src/redhat/SOURCES

SOURCES 디렉토리는 패키지 작성에 쓰이는 소스의 타르볼이나 패치파일을 두는 곳이다.

 

2. xmms.spec 파일 작성하기

# cd /usr/src/redhat/SPECS
# vi xmms.spec

가 .데이터 정의부 작성

-  Summary

패키지의 간단한 설명을 영어로 쓴다. spec파일 타이틀을 겸해서 첫 번째 1행에 쓰여진 경우가 많다.

- Name, Version, Release

패키지명, 버전번호, 릴리즈 번호를 각각 기술한다. 패키지 파일명은 이런 정보를 기초로 만들어진다.

- Source, Patch

SOURCES 디렉토리에 둔 소스(타르볼)와 패치파일이름을 기술한다. 패키지를 작성할 때 참조되는 것은 파일명 뿐이지만, 입수한 곳을 나타내기 위해 URL로 기술하는 것이 바람직하다. 여러 가지 소스나 패키지가 있는 경우에는 'Source0:', 'Source1:', ..., 'Patch0:', 'Patch1:', ... 같이 0부터 시작하는 번호를 붙인다.

- Copyright, Group, URL, Packager

패키지 라이센스(GPL등), 카테고리, 소스 정보를 제공하는 URL, 패키지 작성자의 이름/메일주소를 각각 기술한다.

- Buildroot

패키지를 만들 때 가상 루트 디렉토(/)와 가정 디렉토리를 지정한다. '/var/tmp/패키지명-root'가 많이 쓰인다. 구체적인 작성 방법은 나중에 설명하겠다.

- Requires

패키지가 동작하는데 필요한 피키지 명과 버전을 기술한다. 복수 패키지를 콤마 단락으로 배열할 수도 있다. 이제 실행에 필요한 라이브러리 정보는 RPM이 자동으로 추가해 주기 때문에 spec파일에서 기술할 필요는 없다.

- %description

rpm -qi 옵션으로 표시되는 패키지 설명을 기술한다. 데이터 정의부에 포함되지 않고 독립한 섹션이지만, "%"로 시작하는 것으로도 알 수 있듯이 데이터 정의부와 나란히 적으면 알기 쉽다. 다음 섹션 직전까지가 내용으로 되므로, 한행만 Summary와 다르게 여러 행에 걸쳐 긴 문장을 쓸 수 있다.

그리고, Summary와 %description은 국제화 기능이 있다. 보통 Summary와 %description에 영어 설명을 적어 두고, Summary(ko)와 %description -l ko에 한글 설명을 적어 두면 된다. 환경변수 LANGUAGE내용을 참조하고 한글 환경에서는  한글메시지가 나타난다.

나. 스크립트 작성

스크립트는 패키지 작성방법이 기술된 중요부분으로서 '%prep', '%build', '%install' 등 몇 개의 섹션으로 분류되어 있다. 각 섹션은 bash 쉘 스크립트로 실행되므로 bash로 맞춰 넣은 커맨드나 외부 커맨드, if와 같은 제어문, ${변수명}에 의한 변수 참조 등을 할 수 있다.

- %prep 섹션

타르볼을 전개하고 패치 할당을 해보자, 타르볼을 전개하는 것은 '%setup', 패치할당은 '%patch'와 같이 맞춰 넣은 매크로로 기술하는 것이 보통이다.

'%setup'은 데이터 설정부의 소스 텝으로 지정된 소스(타르볼)를 타르를 사용해서 BUILD디렉토리에 전개해서, 전개할 디렉토리를 현재 디렉토리로 한다. -q 옵션에 의해 전개할 때의 파일명 표시를 제어할 수 있다. 타르볼에 포함된 디렉토리가 '버전명, 버전번호'와 엇갈린 경우에는 -n 옵션 다음에 디렉토리 명을 명시해야 한다.

'%Patch'는 데이터 정의부의 Patch텝으로 지정되는 패치 파일을 외부 커맨드 patch에 입력해서 전개된 소스에 대응하는 패치를 할당한다. %setup을 실행한 시점에서 현재 디렉토리는 BUILD/xmms-1.2.5으로 되기 때문에 패치파일명 정보에 포함된 디렉토리 부분을 한 단계 무시하는 -p1 옵션을 지정한다. 그리고 패치파일이 gzip으로 압축된 경우에는 자동으로 전개된다.

- %build 섹션

configure 스크립트 실행에 따라 동작 환경을 조사하고 환경에 맞는 Makefile이 만들어진다. 이어서 make에 의해 컴파일,링크로 실행파일이 작성된다. 현재 디렉토리는 BUILD/xmms-1.2.5이다.

configure 스크립트 실행은 매크로를 쓰지 않고 직접 './configrure'로 한다. '--prefix=/usr' 옵션에 따라 실행파일이나 매뉴얼 등 인스톨할 곳이 /usr 아래가 된다. 생략하면, /usr/local이 된다. RPM 3.0에서는 이런 설정이 자동으로 되는 '%configure'옵션이 있다.

- %install 섹션

실행파일이나 매뉴얼 등을 인스톨(파일복사)한다. 맞춰 넣은 매크로는 없으므로, 'make install' 처럼 커맨드명을 직접 기술하는 것이 보통이다.

단, 그대로 인스톨한 경우에는 패키지화되지 않은 파일을 직접 /usr/bin등에 두게 된다. 그리고 그전 버전 패키지가 인스톨되어 있는 경우에는 그것을 덮어쓰게 된다. 이런 사태가 일어나는 것을 방지하기 위해서 실제로는 루트 디렉토리(/)와 다른 디렉토리를 가상 루트 디렉토리로 간주해서 인스톨하는 방법이 쓰인다.

가상 루트 디렉토리는 데이터 정의부의 Buildroot 텝에서 지정한다. 여기서 주의 할 점은 Buildroot 텝을 지정해도 자동으로 인스톨 할 곳이 변경되는 것은 아니라는 것이다.

실제로는 Buildroot텝 내용이 설정된 변수 RPM_BUILD_ROOT를 이용해서 인스톨할 곳이 가상 디렉토리가 되도록 spec파일을 기술해야 된다. configure 스크립트를 사용하는 경우 'make install' 옵션으로 'prefix=$RPM_BUILD_ROOT/usr'를 지정한다.

- %clean 섹션

여기서는 패키지를 작성한 이후의 처리를 한다. 구체적으로 Buildroot 텝으로 지정한 가상 루트 디렉토리를 서브디렉토리도 포함해서 모두 삭제한다. 그리고 '%install' 섹션에서 인스톨을 실행하기 전에도 이와 같은 처리를 한다.

 

다. 파일 리스트부의 작성과 동작 체크

파일 리스트부에는 바이너리 패키지에 포함할 실행파일, 도큐멘트, 데이터 파일 등을 열거한다. 디렉토리 자체를 리스트에 포함하면, 언이스톨할 때에 디렉토리와 함께 삭제된다. 또 맞춰 넣은 매크로의 '%attr', '%defattr'에 따라 파일 특성, 소유자, 그룹을 변경할 수 있다.

파일은 한행에 하나씩 기술한다. 인스톨할 디렉토리를 기술할 때 주의하기 바란다. 단, 소스의 타르볼에 포함된 도큐멘트(README 등)는 '%doc'에 이어서 파일명만을 나열해서 기술한다. 이것은 /usr/doc 이하의 '패키지명-버전번호' 디렉토리에 정리해서 인스톨된다.

이것으로  spec 파일이 와성되었다. 마지막으로 -ba 옵션과 spec파일명을 지정해서 rpm을 실행하고 소스 페키지와 바이너리 패키지를 작성한다.

# rpm -ba xmms.spec

 

3.  xmms.spec 파일

%define name    xmms

%define version 1.2.5

%define release 1

%define serial  1

%define prefix  /usr

 

## Check to see if libGL is installed. Build xmms-gl if it is.

%define withGL  %(if [ -z "`rpm -q --whatprovides libGL.so.1 2>/dev/null`" ]; th

en echo 0; else echo 1; fi)

 

## Check to see if libmikmod is installed. Build xmms-mikmod if it is.

%define withmm  %(if [ -z "`rpm -q --whatprovides libmikmod.so.2 2>/dev/null`" ]

; then echo 0; else echo 1; fi)

%define wmmdev  %(if [ -z "`rpm -q --whatprovides $(/usr/bin/which libmikmod-con

fig) 2>/dev/null`" ]; then echo 0; else echo 1; fi)

 

## Check to see if libvorbisfile is installed.  Build xmms-vorbis if it is.

%define withvorbis %(if [ -z "`rpm -q --whatprovides libvorbisfile.so.0 2>/dev/n

ull`" ]; then echo 0; else echo 1; fi)

 

## Funky hack to get package names that provide libmikmod and libmikmod-config

## Becuase of the differing package names between redhat, mandrake, etc.

%if %{withmm} == 1

%define mikmod  %(rpm -q --qf '%{NAME}' --whatprovides libmikmod.so.2)

%if %{wmmdev} == 1

%define mmdev   %(rpm -q --qf '%{NAME}' --whatprovides $(/usr/bin/which libmikmo

d-config))

%endif

%endif

 

%define gnomedatadir %(gnome-config --datadir 2> /dev/null || echo "/usr/share")

%define gnomesysconfdir %(gnome-config --sysconfdir 2> /dev/null || echo "/etc")

 

Summary:        XMMS - Multimedia player for the X Window System.

Name:           %{name}

Version:        %{version}

Release:        %{release}

Serial:         %{serial}

Copyright:      GPL

Group:          Applications/Multimedia

Vendor:         XMMS Development Team <bugs@xmms.org>

Url:            http://www.xmms.org/

Source:         %{name}-%{version}.tar.gz

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

Obsoletes:      x11amp, x11amp0.7-1-1

Requires:       gtk+ >= 1.2.2

 

%description

X MultiMedia System is a sound player written from scratch. Since it

uses the WinAmp GUI, it can use WinAmp skins. It can play mp3s, mods, s3ms,

and other formats. It now has support for input, output, general, and

visualization plugins.

 

%package        devel

Summary:        XMMS - Static libraries and header files.

Group:          Applications/Multimedia

Obsoletes:      x11amp-devel

Requires:       %{name} = %{version}, glib-devel >= 1.2.2, gtk+-devel >= 1.2.2

 

%description    devel

Static libraries and header files required for compiling xmms plugins.

 

%package        esd

Summary:        XMMS - Output plugin for use with the esound package.

Group:          Applications/Multimedia

Requires:       %{name} = %{version}

Obsoletes:      x11amp-esd

Requires:       esound >= 0.2.8

 

%description    esd

Output plugin for xmms for use with the esound package

 

%package        gnome

Summary:        XMMS - applet for controlling xmms from the GNOME panel.

Group:          Applications/Multimedia

Requires:       %{name} = %{version}

Obsoletes:      x11amp-gnome

Requires:       gnome-libs >= 1.0.0

 

%description    gnome

GNOME applet for controlling xmms from the GNOME panel

 

%if %{withmm} == 1

%package        mikmod

Summary:        XMMS - Input plugin to play MODs.

Group:          Applications/Multimedia

Obsoletes:      x11amp-mikmod

Requires:       %{name} = %{version}

Requires:       %{mikmod} >= 3.1.6

%if %{wmmdev} == 1

BuildPrereq:    %{mmdev}

%else

BuildPrereq:    /usr/bin/libmikmod-config

%endif

 

%description    mikmod

Input plugin for XMMS to play MODs (.MOD,.XM,.S3M, etc)

%endif

 

%if %{withvorbis} == 1

%package        vorbis

Summary:        XMMS - Input plugin to play OGGs

Group:          Applications/Multimedia

Requires:       %{name} = %{version}

Requires:       libogg >= 1.0beta3

Requires:       libvorbis >= 1.0beta3

BuildPrereq:    libogg-devel

BuildPrereq:    libvorbis-devel

 

%description    vorbis

Input plugin for XMMS to play Ogg Vorbis files (.ogg).

%endif

 

%if %{withGL} == 1

%package        gl

Summary:        XMMS - Visualization plugins that use the Mesa3d library.

Group:          Applications/Multimedia

Requires:       %{name} = %{version}

Obsoletes:      xmms-mesa

 

%description    gl

Visualization plugins that use the Mesa3d library.

%endif

 

%prep

%setup -q

 

%build

export CFLAGS="$RPM_OPT_FLAGS" CPPFLAGS="$RPM_OPT_FLAGS" CXXFLAGS="$RPM_OPT_FLAG

S";

unset LINGUAS || :;

 

./configure --prefix=%{prefix};

make

 

%install

[ -d $RPM_BUILD_ROOT ] && rm -rf $RPM_BUILD_ROOT;

mkdir $RPM_BUILD_ROOT

make prefix=$RPM_BUILD_ROOT%{prefix} sysconfdir=$RPM_BUILD_ROOT/etc GNOME_DATADI

R=$RPM_BUILD_ROOT%{gnomedatadir} GNOME_SYSCONFDIR=$RPM_BUILD_ROOT%{gnomesysconfd

ir} install

 

# Strip binaries. But, not plugins.

strip --strip-unneeded $RPM_BUILD_ROOT%{prefix}/bin/*xmms;

 

# Install icons.

mkdir -p $RPM_BUILD_ROOT/usr/share/pixmaps/mini

install -m 644 xmms/xmms_logo.xpm \

        $RPM_BUILD_ROOT/usr/share/pixmaps/xmms_logo.xpm

install -m 644 xmms/xmms_mini.xpm \

        $RPM_BUILD_ROOT/usr/share/pixmaps/mini/xmms_mini.xpm

 

# Install wmconfig file

mkdir -p $RPM_BUILD_ROOT/etc/X11/wmconfig

install -m 644 xmms/xmms.wmconfig \

        $RPM_BUILD_ROOT/etc/X11/wmconfig/xmms

 

# Install applnk file

mkdir -p $RPM_BUILD_ROOT/etc/X11/applnk/Multimedia/

install -m 644 xmms/xmms.desktop \

        $RPM_BUILD_ROOT/etc/X11/applnk/Multimedia/

 

%post   -p /sbin/ldconfig

%postun -p /sbin/ldconfig

%clean

[ -d $RPM_BUILD_ROOT ] && rm -rf $RPM_BUILD_ROOT;

 

%files

%defattr(-, root, root)

%doc AUTHORS COPYING ChangeLog INSTALL NEWS README

/etc/X11/wmconfig/xmms

/etc/X11/applnk/Multimedia/xmms.desktop

%{prefix}/bin/xmms

%{prefix}/bin/wmxmms

%{prefix}/lib/libxmms.so.*

%{prefix}/lib/xmms/Input/libcdaudio*

%{prefix}/lib/xmms/Input/libidcin*

%{prefix}/lib/xmms/Input/libmpg123*

%{prefix}/lib/xmms/Input/libtonegen*

%{prefix}/lib/xmms/Input/libwav*

%{prefix}/lib/xmms/Output/libOSS*

%{prefix}/lib/xmms/Output/libdisk_writer*

%{prefix}/lib/xmms/General/*

%{prefix}/lib/xmms/Effect/*

%{prefix}/lib/xmms/Visualization/libbscope*

%{prefix}/lib/xmms/Visualization/libsanalyzer*

%{prefix}/share/xmms/*

%{prefix}/man/man1/*

/usr/share/locale/*/LC_MESSAGES/xmms.mo

/usr/share/pixmaps/xmms_logo.xpm

/usr/share/pixmaps/mini/xmms_mini.xpm

 

%files devel

%defattr(-, root, root)

%{prefix}/bin/xmms-config

%{prefix}/lib/lib*.so

%{prefix}/lib/lib*.a

%{prefix}/include/*

%{prefix}/share/aclocal/xmms.m4

 

%files esd

%defattr(-, root, root)

%{prefix}/lib/xmms/Output/libesdout*

 

%files gnome

%defattr(-, root, root)

%{prefix}/bin/gnomexmms

%{gnomesysconfdir}/CORBA/servers/gnomexmms.gnorba

%{gnomedatadir}/applets/Multimedia/gnomexmms.desktop

 

%if %{withmm} == 1

%files mikmod

%defattr(-, root, root)

%{prefix}/lib/xmms/Input/libmikmod*

%endif

 

%if %{withvorbis} == 1

%files vorbis

%defattr(-, root, root)

%{prefix}/lib/xmms/Input/libvorbis*

%endif

 

%if %{withGL} == 1

%files gl

%defattr(-, root, root)

%{prefix}/lib/xmms/Visualization/libogl_spectrum*

%endif

 

%changelog

 

 

마지막으로 패키지를 작성하는데 참고가 되는 URL을 소개하겠다.

http://www.rpm.org - Maximum RPM

 

[목차]

개인정보취급방침 서비스이용약관 모바일 버전으로 보기 상단으로

TEL. 063-469-4551 FAX. 063-469-4560 전북 군산시 대학로 558
군산대학교 컴퓨터정보공학과

Copyright © www.leelab.co.kr. All rights reserved.