Ubuntu Packaging Howto

깊이있는 삽질 Ubuntu Korea Community Wiki
이동: 둘러보기, 검색

1. GTK+2.0을 이용한 "Hello, World" 버튼을 만들며, 개발시 필요한 기본 패키지와 GTK+2.0 라이브러리 패키지 깔아보기[편집]

먼저, 자신의 계정에 hellogtk라는 디렉토리를 만들어주세요.

그리고, 아래 두개의 소스를 vim이나 우분투 메뉴에서 “프로그램 → 보조 프로그램 → 텍스트 편집기“를 사용해 입력합니다. (간단히 마우스로 긁어서 복사&붙여넣기를 해도 되겠죠)

첫번째 소스는 hellogtk 디렉토리 안에 hellogtk.c 라고 저장을 하고 두 번째 소스는 Makefile 이라고 저장합니다.

첫번째 소스 - hellogtk.c

/* hellogtk.c */
#include <gtk/gtk.h>
 
static void hello( GtkWidget *widget,
			gpointer data )
{
	g_print ("Hello World\n");
}
 
static gboolean delete_event( GtkWidget *widget,
					GdkEvent *event,
					gpointer   data )
{
	g_print ("delete event occurred\n");
 
	return TRUE;
}
 
static void destroy( GtkWidget *widget,
			gpointer   data )
{
	gtk_main_quit ();
}
 
int main( int argc, char *argv[] )
{
	GtkWidget *window;
	GtkWidget *button;
 
	gtk_init (&argc, &argv);
 
	window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
 
	g_signal_connect (G_OBJECT (window), "delete_event",
				G_CALLBACK (delete_event), NULL);
 
	g_signal_connect (G_OBJECT (window), "destroy",
				G_CALLBACK (destroy), NULL);
 
	gtk_container_set_border_width (GTK_CONTAINER (window), 10);
 
	button = gtk_button_new_with_label ("Hello World");
 
	g_signal_connect (G_OBJECT (button), "clicked",
				G_CALLBACK (hello), NULL);
 
	g_signal_connect_swapped (G_OBJECT (button), "clicked",
				G_CALLBACK (gtk_widget_destroy),
				G_OBJECT (window));
 
	gtk_container_add (GTK_CONTAINER (window), button);
 
	gtk_widget_show (button);
 
	gtk_widget_show (window);
 
	gtk_main ();
 
	return 0;
}

두번째 소스 - Makefile

PREFIX ?= /usr
 
hellogtk : hellogtk.c
	gcc -Wall -g hellogtk.c -o hellogtk `pkg-config --cflags gtk+-2.0` `pkg-config --libs gtk+-2.0`
 
clean :
	if [ -f hellogtk ]; then\
		rm hellogtk;\
	fi
 
install :
	cp hellogtk $(PREFIX)/bin/
 
uninstall :
	if [ -f $(PREFIX)/bin/hellogtk ]; then\
		rm $(PREFIX)/bin/hellogtk;\
	fi

이제 소스를 컴파일 해야 합니다. 컴파일을 위해 필요한 패키지는 build-essential와 libgtk2.0-dev 입니다.

시냅틱 패키지 관리자를 이용하는 방법과 터미널을 통해 패키지를 설치하는 방법이 있습니다.

여기서는 그놈 터미널(프로그램 → 보조 프로그램 → 터미널)을 사용해 설치해 보겠습니다.

sudo apt-get install build-essential libgtk2.0-dev 위와 같이 입력하면 비밀번호를 요구하고, 계정의 비밀번호를 입력하면 설치를 합니다.

여기서 기억할 것은 libgtk2.0-dev가 사용되었다는 것입니다. 이후 패키징을 할 때 의존 패키지 항목에 입력할 때 이 정보가 필요하니 기억하면 좋겠죠.

뭐… 기억 못하셔도 좋습니다. 뒤에 다시 언급하겠습니다.

이제 패키지 설치가 끝났으면, 컴파일을 해봅시다.

터미널에서 저장한 디렉토리로 이동해서 아래와 같이 입력합니다.

make

아무런 텍스트도 뜨지 않고 프롬프트가 나왔다면, 컴파일에 성공한겁니다.

(만약 무엇인가 글자가 뜬다면, 위 소스를 보고 정확하게 수정해 주세요.)

이제 터미널에서

ls

라고 명령어를 넣어보면, hellogtk라는 파일이 생성된 것을 보실 수 있을 겁니다.

이제 실행을 해보죠

./hellogtk

Hellogtk.png 위와 같은 멋진 창이 떴나요? (멋지지 않다고요? 세상을 좀 여유를 가지고 살아보세요 ;-))

이제 패키징을 해서 깔아보기 위한 소스와 의존 라이브러리(build-essential, libgtk2.0-dev)가 깔아졌습니다.

그리고, 실행을 해서 잘 작동하는지도 살펴보았습니다.

2. 패키징을 위해 필요한 패키지 깔기[편집]

앞에서 소스를 입력하고 실행되는 프로그램을 만들어 봤습니다.

좀 지루했나요?

하지만, 조금만 더 저와 여행을 한다면 여러분이 만든 프로그램이나 데이타들이 여러분들이 원한다면 어디든 자유롭고 편하게 설치할 수 있는 마법을 부릴 수 있습니다.

이 마법을 부리기 위해 저와 조금 더(아니 한참동안?) 여행을 같이 갑시다. ;-)

여기서는 패키징을 위해 필요한 패키지를 깔아보겠습니다.

이번에도 터미널을 열고,

sudo apt-get install dpkg-dev debhelper devscripts fakeroot lintian dh-make 물론 필요한 패키지들이 더 있습니다만, 이 정도 설치를 하면 나머지는 의존성 문제로 자동으로 깔립니다.

이제 필요한 패키지 설치도 끝났습니다.

3. 패키징을 위한 디렉토리 구성하기[편집]

이제 패키징을 위한 본격적인 준비에 들어가겠습니다.

1장에서 우리는 hellogtk 라는 디렉토리를 만들고, 그 디렉토리 안에 소스를 입력하고 hellogtk.c 와 Makefile 를 이용해 실행되는 hellogtk 라는 프로그램을 만들어 봤습니다.

여기서는 hellogtk 디렉토리 안에 패키지를 만들기 위한 디렉토리 구성을 해보도록 하겠습니다.

디렉토리를 구성하기 위해서는 소스가 들어있는 디렉토리를 프로그램이름-버전 형태로 바꾸어주어야 합니다.

여기서는 프로그램이름은 hellogtk가 될 것이고, 버전은 일단 0.1을 붙이도록 하겠습니다.

mv ~/hellogtk ~/hellogtk-0.1

이제 hellogtk-0.1 디렉토리로 이동합니다.

cd ~/hellogtk-0.1

디렉토리 안에 있는 구성물을 볼까요?

find .

이렇게 하면 디렉토리 안의 구성물을 볼 수 있습니다. 저는 이렇게 나옵니다.

.
./hellogtk.c
./Makefile
./hellogtk

어떤 분들은 이전에 만들어진 실행 파일인 hellogtk 가 나올 수도 있습니다. 나오든 안 나오든 상관없으니 그냥 패스~

이제 아래의 명령어로 디렉토리를 직접 구성합니다.

dh_make -n -s -e test@test.com

test@test.com에는 자신의 이메일 주소를 넣어주세요.

저는 이렇게 나오네요.

shriekout@shriekout-laptop:~/source/hellogtk-0.1$ dh_make -n -s -e shriekout@gmail.com
Maintainer name : shriekout
Email-Address   : shriekout@gmail.com 
Date            : Sat, 15 Aug 2009 22:16:45 +0900
Package Name    : hellogtk
Version         : 0.1
License         : gpl
Using dpatch    : no
Using quilt     : no
Type of Package : Single
Hit <enter> to confirm: 
Done. Please edit the files in the debian/ subdirectory now. You should also
check that the hellogtk Makefiles install into $DESTDIR and not in / .

마지막에 체크해야할 사항을 알려주지만, 여기서는 생략하도록 하겠습니다.

확인하지 않아도 만들어지거든요.

ls 명령어로 디렉토리를 확인해 보면 debian 이라는 디렉토리가 만들어진 것을 볼 수 있습니다.

debian 디렉토리 안에 예제 파일이 있으나, 필요가 없으니 지우도록 하겠습니다.

rm debian/*.ex debian/*.EX

debian 디렉토리에 무엇이 들어 있는지 볼까요?

shriekout@shriekout-laptop:~/source/hellogtk-0.1$ find debian
debian
debian/README.Debian
debian/README
debian/dirs
debian/rules
debian/docs
debian/copyright
debian/changelog
debian/control
debian/compat

여기서 2개의 파일을 편집해야 합니다. control 파일과 rules 파일입니다.

일단 debian/control 파일을 편집기로 엽니다.

내용은 아래와 같습니다.

Source: hellogtk
Section: unknown
Priority: extra
Maintainer: shriekout <shriekout@gmail.com>
Build-Depends: debhelper (>= 7)
Standards-Version: 3.8.0
Homepage: <insert the upstream URL, if relevant>

Package: hellogtk
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: <insert up to 60 chars description>
 <insert long description, indented with spaces>

여기서 우리는 Section, Build-Depends, Homepage, Description을 수정하도록 하겠습니다.

참고로 Build-Depends는 의존 패키지를 적어주면 됩니다.

현재 우리는 hellogtk를 가지고 작업중이고, 기억하시겠지만, hellogtk는 libgtk2.0-dev 패키지를 사용해 컴파일을 했으니, libgtk2.0-dev 패키지에 의존성을 갖습니다. 그냥 libgtk2.0-dev이걸 넣어주기만 하면 됩니다.

섹션

Section: gnome
패키지 의존성
<pre>
Build-Depends: debhelper (>= 7), libgtk2.0-dev

홈페이지

Homepage: http://mysite.com

패키지와 프로그램에 대한 설명

Description: Hi everyone :)
 I am a boy. You are a girl. We are the world. ;)

이제 debian/rules를 수정합니다.

install 항목에서 수정해야할 곳은 딱 한군데 입니다.

$(MAKE) DESTDIR=$(CURDIR)/debian/hellogtk install

이 부분을 아래와 같이 수정합니다.

$(MAKE) PREFIX=$(CURDIR)/debian/hellogtk/usr install

이제 디렉토리에 대한 모든 구성은 끝났습니다.

이제 마지막으로 패키지를 빌드하고 설치하는 작업만 남았습니다.

4. 직접 패키징 해보고 설치하기[편집]

여기서는 패키징을 해보고 설치하고, 설치가 잘 되었는지 확인해 보도록 하겠습니다.

이제 패키징을 해봅시다.

아래의 명령어로 패키징을 수행합니다.

fakeroot debian/rules binary

저는 이렇게 나오는군요.

shriekout@shriekout-laptop:~/source/hellogtk-0.1$ fakeroot debian/rules binary
dh_testdir
dh_testroot
dh_prep  
dh_installdirs
# Add here commands to install the package into debian/hellogtk.
/usr/bin/make PREFIX=/home/shriekout/source/hellogtk-0.1/debian/hellogtk/usr install
make[1]: Entering directory `/home/shriekout/source/hellogtk-0.1'
cp hellogtk /home/shriekout/source/hellogtk-0.1/debian/hellogtk/usr/bin/
make[1]: Leaving directory `/home/shriekout/source/hellogtk-0.1'
dh_testdir
dh_testroot
dh_installchangelogs 
dh_installdocs
dh_installexamples
dh_installman
dh_link
dh_strip
dh_compress
dh_fixperms
dh_installdeb
dh_shlibdeps

...

dh_gencontrol
dpkg-gencontrol: warning: unknown substitution variable ${misc:Depends}
dh_md5sums
dh_builddeb
dpkg-deb: `hellogtk' 패키지 빌드하는 중입니다 (`../hellogtk_0.1_i386.deb'에서).
shriekout@shriekout-laptop:~/source/hellogtk-0.1$

위에서 …으로 표현한 부분은 제가 임의적으로 생략한 부분입니다. 이런 문구들이 나오는데요. dpkg-shlibdeps: warning: dependency on libpangoft2-1.0.so.0 could be avoided if “debian/hellogtk/usr/bin/hellogtk” were not uselessly linked against it (they use none of its symbols). 우분투 버그 시스템에 등록된걸로 봐서는 버그인 것 같습니다. (사실 이 부분은 저도 해결 못하고 있습니다.)

이제 상위 디렉토리로 이동합니다.

cd ..

만들어졌는지 살펴볼까요?

ls hellogtk*

저는 이렇게 나옵니다.

shriekout@shriekout-laptop:~/source$ ls hellogtk*
hellogtk_0.1.dsc     hellogtk_0.1_i386.build    hellogtk_0.1_i386.deb
hellogtk_0.1.tar.gz  hellogtk_0.1_i386.changes

hellogtk-0.1:
Makefile  build-stamp  configure-stamp  debian  hellogtk  hellogtk.c

위 내용을 보시면 hellogtk_0.1_i386.deb가 만들어진 것을 볼 수 있습니다.

패키지가 만들어졌군요. ^_^

이제 설치를 해볼까요?

sudo dpkg -i hellogtk_0.1_i386.deb

이제 hellogtk 라고 실행을 해보면… 잘됩니까? 축하드립니다. ^_^

어떻게 설치가 되어 있는지 볼까요?

dpkg -L hellogtk

저는 이렇게 나옵니다.

shriekout@shriekout-laptop:~/source$ dpkg -L hellogtk
/.
/usr
/usr/bin
/usr/bin/hellogtk
/usr/sbin
/usr/share
/usr/share/doc
/usr/share/doc/hellogtk
/usr/share/doc/hellogtk/README.Debian
/usr/share/doc/hellogtk/changelog.gz
/usr/share/doc/hellogtk/copyright
shriekout@shriekout-laptop:~/source$ 

시냅틱에서는 어떻게 나오는지 볼까요? Synaptic.png


이제 저와의 긴 여정이 끝났습니다. 사실 지금까지 만든 패키징 방식에는 문법적인 문제도 내포하고 있습니다.

또, 각 상황에 맞게 수정해야 하는 부분도 있습니다.

이러한 부분은 http://www.debian.org/doc/manuals/maint-guide/index.ko.html#contents 문서를 참고 하시기 바랍니다.

그리고, 우분투 패키지와 데비안 패키지는 똑같습니다.

단지 하나 차이가 있다면, debian/changelog 안의 첫줄에서 unstable를 우분투 코드명에 맞게 바꾸어주어야 합니다.

만약 9.04를 사용하신다면, unstable을 jaunty로 바꾸어 주시면 됩니다.

마지막 인사를 해야하는데 마땅한 문구가 생각나지 않네요. 그냥 한 단어로 끝내겠습니다.

끗! LOL