[ 이전 ] [ 차례 ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 다음 ]


데비안 새로운 관리자 안내서
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에 포함시킬 수 있다. 여기에 관해서는 해당 문서와 매뉴얼을 살펴본다. 해당 프로그램이 제대로 이 기능을 하는 지 확인한다. 이렇게 되면 이미 설치한 다른 것들과 같이 설치 될 것이고 이렇게 되면 패키지 도구가 어떤 파일이 여러분이 패키지에 들어 있는지 아닌지 확인하지 못한다.

따라서 이 일을 할 필요가 있다: 패키징해주는 도구가 .deb을 만드는 임시 서브디렉토리에 프로그램을 설지한다. 이 디렉토리에 있는 모든 것은 패키지를 설치했을 때, 사용자 시스템에 설치될 것이고 단지 다른 점은 dpkg가 루트 디렉토리에 파일들을 설치한다는 점이다.

이 임시파일은 debian 디렉토리 안에 생기고 이는 debian/packagename이다.

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

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

       # Where to put binary on 'make install'?
       BIN     = /usr/bin
     
       # Where to put icons on 'make install'?
       ICONS   = /usr/share/gentoo

그런데 왜 하필이면 다른 디렉토리도 아니고, 이 디렉토리인가? 데비안 패키지는 /usr/local에 설치되지 않고 여기는 단지 시스템 관리자만 쓸 수 있다. 데비안에 있는 이러한 파일들은 모두 /usr에 있다.

바이너리와 아이콘, 문서가 있는 위치는 파일시스템 구조 표준(/usr/share/doc/debian-policy/fhs/)에 지정되어 있다. 이 문서를 잘보고 어디에 여러분 패키지가 있어야할지 확인하기 바란다.

자 이제 여러분은 바이너리를 /usr/local/bin이 아닌 /usr/bin에 설치 해야한다. 그리고 맨페이지는 /usr/local/man/man1가 아닌 /usr/share/man/man1 에 나와야한다. gentoo에 대한 매뉴얼 페이지가 있는지 확인하고 만일 없다면 만들고나서 /usr/share/man/man1에 설치하면 된다.

몇몇 프로그램들은 이런 경로를 정의하는 makefile 변수를 쓰지 않는 경우 가 있다. 결국 C 소스를 수정해서 이를 수정하고 제대로 작동하게 만들어야 한다. 그럼 어떻게 찾아야하나? 다음과 같은 명령을 쓸 수 있다:

       grep -nr -e 'usr/local/lib' --include='*.[c|h]' .

grep 프로그램은 usr/local/lib이 나타난 파일의 이름과 그 파일의 몇번째 줄에서 usr/local/lib이 나타났는지 알려준다.

여기를 편집하고 /usr/local/*를 usr/*로 바꾼다. 코드 나머지 부분에도 이 부분이 헷갈리지 않게 조심한다.

이렇게 한 후에 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이 있다는 것을 확인할 수 있다. 보통 /usr/local/bin과 다른 디렉토리가 이미 있어서 거기에서 `make install' 이 돌아가기 때문에 원래 Makefile에는 이 부분이 없다. 없는 디렉토리에 설 치하려고 하기 때문에 이런 디렉토리를 하나 하나 만들어야한다.

추가 문서에 대한 정보는 여기서 할 수 있다:

                       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

(이 예가 가장 좋은 예가 아니다. libncurses 패키지가 현재는 libncurses.so에 심볼릭 링크가 걸려있지만 저자는 나쁘다고 생각하지 않을 것이다. 좋은 제안 있으면 알려주기 바란다. :-)


[ 이전 ] [ 차례 ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 다음 ]


데비안 새로운 관리자 안내서

version 1.2, 6 April 2002.

Josip Rodin jrodin@jagor.srce.hr
번역: 류창우 cwryu@debian.org/
번역: 양유성 yooseong@debian.org/