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>
18년 기준 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