Ubuntu Packaging Howto
1. GTK+2.0을 이용한 "Hello, World" 버튼을 만들며, 개발시 필요한 기본 패키지와 GTK+2.0 라이브러리 패키지 깔아보기[편집]
먼저, 자신의 계정에 hellogtk라는 디렉토리를 만들어주세요.
그리고, 아래 두개의 소스를 vim이나 우분투 메뉴에서 “프로그램 → 보조 프로그램 → 텍스트 편집기“를 사용해 입력합니다. (간단히 마우스로 긁어서 복사&붙여넣기를 해도 되겠죠)
첫번째 소스는 hellogtk 디렉토리 안에 hellogtk.c 라고 저장을 하고 두 번째 소스는 Makefile 이라고 저장합니다.
첫번째 소스 - hellogtk.c <syntaxhighlight lang="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; } </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">
- !/usr/bin/make -f
- See debhelper(7) (uncomment to enable)
- output every command that modifies files on the build system.
- export DH_VERBOSE = 1
- see FEATURE AREAS in dpkg-buildflags(1)
- export DEB_BUILD_MAINT_OPTIONS = hardening=+all
- see ENVIRONMENT in dpkg-buildflags(1)
- package maintainers to append CFLAGS
- export DEB_CFLAGS_MAINT_APPEND = -Wall -pedantic
- package maintainers to append LDFLAGS
- export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed
%:
dh $@
- dh_make generated override targets
- This is example for Cmake (See https://bugs.debian.org/641051 )
- override_dh_auto_configure:
- 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