[ 이전 ] [ 저작권 ] [ 차례 ] [ 다음 ]

데비안 새로운 관리자 안내서
3 소스 코드 수정하기


보통의 경우, 프로그램은 /usr/local 디렉토리 밑에 프로그램을 설치하게 된다. 하지만, 데비안 패키지는 이 디렉토리를 사용하면 안 된다. /usr/local 디렉토리은 시스템 관리자의 (혹은 사용자의) 개인적인 용도로 쓰이기 때문이다. 즉, 메이크파일부터 시작해서 프로그램의 빌드 시스템 내부를 살펴봐야 한다. 메이크파일은 make(1)가 프로그램을 빌드하는 과정을 자동화할 때 쓰이는 스크립트이다. 메이크파일에 관해 자세한 사항은 `rules' 파일, 4.4를 참고한다. 메이크파일에 대한 자세한 정보는 `rules' 파일, 4.4 참고.

여러분의 프로그램이 GNU automake(1)autoconf(1)를 쓰는지 확인한다. automake의 경우 소스 안에 Makefile.am 파일이 들어 있고, autoconf의 경우 Makefile.in 파일이 들어 있다. 이 경우에 이들 Makefile.am 혹은 Makefile.in 파일을 수정해야 할 수도 있다. automake는 Makefile.am 파일의 정보를 이용해 Makefile.in 파일을 만들고, 마찬가지로 ./configure를 실행할 때마다 Makefile.in의 정보를 읽어서 Makefile을 만들어 내기 때문이다. Makefile.am 파일을 수정하려면 automake에 관한 지식이 필요한데, 여기에 관해서는 automake info 매뉴얼에서 읽을 수 있다. 반면, Makefile.in 파일 수정은 Makefile 수정과 거의 동일하다. 단지 변수에만 유의한다. @CFLAGS@나 @LN_S@와 같이 `@'로 둘러쌓인 문자열이 변수이고, 이 부분은 ./configure를 실행할 때마다 해당 변수의 값으로 바뀐다.

이 문서의 지면상 사람들이 종종 맞닥드리는 문제점들에 대해 어떻게 수정해야 하는지 전부 안내하지는 못한다는 점을 기억해 둔다.


3.1 서브 디렉토리에 설치

대부분의 프로그램들은 여러분의 시스템 구조에 맞게 설치하는 방법이 있어서, 해당 실행 파일을 $PATH에 포함시킬 수 있다. 여기에 관해서는 해당 문서와 매뉴얼을 살펴본다. 해당 프로그램이 제대로 이 기능을 하는 지 확인한다. 하지만, 일단 프로그램 파일들을 debian/ 디렉토리 밑에 만들 임시 디렉토리에 설치해야 한다. 보통 이 디렉토리는 debian/tmp이다. 관리자 도구는 이 디렉토리에서부터 제대로 동작하는 .deb 패키지를 만들어 낼 것이다. 이 디렉토리에 들어 있는 모든 것은 여러분의 패키지를 설치할 때 사용자의 시스템에 설치된다. 유일한 차이점은 dpkg가 그 파일들을 임시 디렉토리가 아닌 루트 디렉토리에 설치한다는 점이다.

기본적으로, 프로그램이 debian/tmp에 설치되긴 하지만, 루트 디렉토리에 설치되었을 때 제대로 동작하도록 설치해야 한다. 즉, .deb 패키지로 설치했을 때 제대로 동작해야 한다. GNU autoconf를 이용하는 프로그램의 경우에는 dh_make가 자동으로 여기에 필요한 해당 명령어들을 만들어 주기 때문에 매우 쉽다. 그러므로 이 `gentoo' 예제의 경우에는 이 부분을 읽지 않고 넘어가도 좋다. 그러나 그 외의 프로그램은 경우에 따라 Makefile을 수정해야 한다.

다음은 gentoo의 Makefile에서 관련된 부분이다.

       # Where to put binary on 'make install'?
       BIN     = /usr/local/bin
       # Where to put icons on 'make install'? Note: if you change this,
       # gentoo will not find the icons as it starts up. You're going to
       # have to alter gentoo's icon path (in the config window, "Paths"
       # tab) to get it work.
       ICONS   = /usr/local/lib/gentoo/

맨 처음에, 다음과 같은 두 줄을 넣어야 한다:

       # Edited for Debian GNU/Linux.
       DESTDIR =

빌드 과정에서 위 변수가 필요하다 (뒤의 `rules' 파일, 4.4에서 설명).

이제 다시 메이크파일을 보면 최종 실행 파일의 위치를 지정하고 있다. 다음과 같이 바꾼다:

       # Where to put binary on 'make install'?
       BIN     = $(DESTDIR)/usr/X11R6/bin

그런데 왜 하필이면 다른 디렉토리도 아니고, 이 디렉토리인가? 데비안은 프로그램이 설치될 위치에 관한 몇가지 규칙을 지정하고 있기 때문이다. 그 규칙은 파일시스템 구조 표준(/usr/share/doc/debian-policy/fhs/)에 지정되어 있다. 다시 말해서, 우리는 실행 파일을 /usr/local/bin이 아니라 /usr/X11R6/bin 디렉토리에 설치해야만 하고, 맨 페이지를 /usr/local/man/man1이 아니라 /usr/share/man/man1에 설치해야만 한다 (맨 페이지는 아직 없지만, 대부분의 프로그램에는 맨 페이지가 있다. 나중에 맨 페이지를 직접 하나 만들게 될 것이다).

그 다음에 좀 어려운 상황에 처했다. 메이크파일에서 규칙에 맞도록 다음과 같이 바꾼 경우:

       ICONS   = $(DESTDIR)/usr/share/gentoo/

이 경우에, 직접 C 소스 코드를 바꿔야 할 것이다. 하지만, 그 소스코드가 어디에 있단 말인가? 다음과 같이 실행해서 찾아볼 수 있다:

       grep -n usr/local/lib *.[ch]

(.c와 .h 파일이 들어 있는 모든 디렉토리에서 이렇게 실행한다). grep 프로그램은 usr/local/lib이 나타난 파일의 이름과 그 파일의 몇번째 줄에서 usr/local/lib이 나타났는지 알려준다. 이제 그 파일의 해당하는 줄을 편집해서 usr/local/lib를 usr/share로 바꾼다 - 그러면 됐다. usr/local/lib을 알맞은 위치로 바꾸면 그만이다. 그 외의 소스는 망가뜨리지 않도록 주의한다 (C 프로그래밍에 대해서 잘 아는 사람이 아니라면.. :-).

이렇게 한 후에 install 타겟을 찾고 (`install:'으로 시작하는 줄을 찾는다), 위에서 수정한 변수 이외에 /usr/local/... 디렉토리의 이름을 직접 언급하는 부분이 있으면 바꾼다. gentoo의 경우에는 그런 경우가 있었고, 좀 보기 좋게 고쳐줘야 했다. 고치기 전의 gentoo의 install 타겟은 다음과 같았다:

       # ----------------------------------------- Installation
     
       # You're going to have to be root to do this!
       install:        gentoo
                       install ./gentoo $(BIN)
                       install icons $(ICONS)
                       install gentoorc-example $(HOME)/.gentoorc

고친 후에는 다음과 같다:

       # ----------------------------------------- Installation
     
       # You're going to have to be root to do this!
       install:        gentoo-target
                       install -d $(BIN) $(ICONS) $(DESTDIR)/etc
                       install ./gentoo $(BIN)
                       install -m644 icons/* $(ICONS)
                       install -m644 gentoorc-example $(DESTDIR)/etc/gentoorc
                       install -d $(DESTDIR)/usr/share/doc/gentoo/html
                       cp -a docs/* $(DESTDIR)/usr/share/doc/gentoo/html

주의 깊게 보면 `install:'줄에서 `gentoo'를 `gentoo-target'으로 바꾸었다는 사실을 알아 챌 것이다. 이런 걸 버그 수정이라고 한다 :-)

이렇게 데비안과는 특별히 관계없는 문제점을 고쳤을 경우에는, 다음 프로그램 버전에 포함될 수 있도록 상위 관리자에게 꼭 알려주도록 한다. debian/* 파일들은 보낼 필요 없고, 그 외의 패치를 보내야 한다. 패치를 보내기 전에 그리고 그 패치가 데비안 혹은 리눅스(심지어는 유닉스!)에만 특별히 관계된 사항이 아니라는 걸 확인하고 상위 관리자에게 보낸다.


3.2 라이브러리의 차이

또 한가지 흔히 만나는 문제가 있다: 라이브러리는 각 플랫폼마다 다르다. 예를 들어 메이크파일에서 데비안에 없는, 심지어는 리눅스에 없는 라이브러리와 링크하려고 하는 경우도 있다. 이 경우에 데비안에 들어 있는, 같은 기능을 하는 라이브러리로 바꿔야 한다. 가장 좋은 방법은 그 줄을 주석처리하는 것이다. 지우지 않는 건 다른 플랫폼에서 컴파일하는 사람도 있을 것이고, 그 사람에게 문제의 원인을 알려주는 힌트를 남겨주기 위해서이다.

예를 들어, 프로그램의 Makefile(혹은 Makfile.in)에 다음과 같이 쓰여 있으면 (그리고 프로그램이 컴파일되지 않으면):

       LIBS = -lcurses -lsomething -lsomethingelse

다음과 같이 바꾼다. 이제 컴파일이 될 것이다:

       LIBS = -lncurses -lsomething -lsomethingelse
       #LIBS = -lcurses -lsomething -lsomethingelse


[ 이전 ] [ 저작권 ] [ 차례 ] [ 다음 ]
데비안 새로운 관리자 안내서
version 1.0, 25 January 2000.
Josip Rodin jrodin@jagor.srce.hr
번역: 류창우 cwryu@debian.org/