Ubuntu Packaging Howto

Ubuntu Korea Community Wiki
둘러보기로 이동 검색으로 이동

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

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

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

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

첫번째 소스 - hellogtk.c <syntaxhighlight lang="c"> /* hellogtk.c */

  1. 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; } </syntaxhighlight> 두번째 소스 - Makefile <syntaxhighlight lang="make"> 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 </syntaxhighlight> 이제 소스를 컴파일 해야 합니다. 컴파일을 위해 필요한 패키지는 build-essential와 libgtk2.0-dev 입니다.

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

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

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

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

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

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

터미널에서 저장한 디렉토리로 이동해서 아래와 같이 입력합니다. <syntaxhighlight lang="bash"> make </syntaxhighlight> 아무런 텍스트도 뜨지 않고 프롬프트가 나왔다면, 컴파일에 성공한겁니다.

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

이제 터미널에서 <syntaxhighlight lang="bash"> ls </syntaxhighlight> 라고 명령어를 넣어보면, hellogtk라는 파일이 생성된 것을 보실 수 있을 겁니다.

이제 실행을 해보죠 <syntaxhighlight lang="bash"> ./hellogtk </syntaxhighlight> 파일: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을 붙이도록 하겠습니다. <syntaxhighlight lang="bash"> mv ~/hellogtk ~/hellogtk-0.1 </syntaxhighlight> 이제 hellogtk-0.1 디렉토리로 이동합니다. <syntaxhighlight lang="bash"> cd ~/hellogtk-0.1 </syntaxhighlight> 디렉토리 안에 있는 구성물을 볼까요? <syntaxhighlight lang="bash"> find . </syntaxhighlight> 이렇게 하면 디렉토리 안의 구성물을 볼 수 있습니다. 저는 이렇게 나옵니다.

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

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

이제 아래의 명령어로 디렉토리를 직접 구성합니다. <syntaxhighlight lang="bash"> dh_make -n -s -e test@test.com </syntaxhighlight> 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 디렉토리 안에 예제 파일이 있으나, 필요가 없으니 지우도록 하겠습니다. <syntaxhighlight lang="bash"> rm debian/*.ex debian/*.EX </syntaxhighlight> 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 항목에서 수정해야할 곳은 딱 한군데 입니다. <syntaxhighlight lang="make"> $(MAKE) DESTDIR=$(CURDIR)/debian/hellogtk install </syntaxhighlight> 이 부분을 아래와 같이 수정합니다. <syntaxhighlight lang="make"> $(MAKE) PREFIX=$(CURDIR)/debian/hellogtk/usr install </syntaxhighlight>


rules파일 내용

<syntaxhighlight lang="make">

  1. !/usr/bin/make -f
  2. See debhelper(7) (uncomment to enable)
  3. output every command that modifies files on the build system.
  4. export DH_VERBOSE = 1


  1. see FEATURE AREAS in dpkg-buildflags(1)
  2. export DEB_BUILD_MAINT_OPTIONS = hardening=+all
  1. see ENVIRONMENT in dpkg-buildflags(1)
  2. package maintainers to append CFLAGS
  3. export DEB_CFLAGS_MAINT_APPEND = -Wall -pedantic
  4. package maintainers to append LDFLAGS
  5. export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed


%:

       dh $@ 


  1. dh_make generated override targets
  2. This is example for Cmake (See https://bugs.debian.org/641051 )
  3. override_dh_auto_configure:
  4. dh_auto_configure -- # -DCMAKE_LIBRARY_PATH=$(DEB_HOST_MULTIARCH)

</syntaxhighlight> rules 파일을 여시면 이렇게 나옵니다.


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

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

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

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

이제 패키징을 해봅시다.

아래의 명령어로 패키징을 수행합니다. <syntaxhighlight lang="bash"> fakeroot debian/rules binary </syntaxhighlight> 저는 이렇게 나오는군요.

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). 우분투 버그 시스템에 등록된걸로 봐서는 버그인 것 같습니다. (사실 이 부분은 저도 해결 못하고 있습니다.)

이제 상위 디렉토리로 이동합니다. <syntaxhighlight lang="bash"> cd .. </syntaxhighlight> 만들어졌는지 살펴볼까요? <syntaxhighlight lang="bash"> ls hellogtk* </syntaxhighlight> 저는 이렇게 나옵니다.

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가 만들어진 것을 볼 수 있습니다.

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

이제 설치를 해볼까요? <syntaxhighlight lang="bash"> sudo dpkg -i hellogtk_0.1_i386.deb </syntaxhighlight> 이제 hellogtk 라고 실행을 해보면… 잘됩니까? 축하드립니다. ^_^

어떻게 설치가 되어 있는지 볼까요? <syntaxhighlight lang="bash"> dpkg -L hellogtk </syntaxhighlight> 저는 이렇게 나옵니다.

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