보통의 경우, 프로그램은 /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를 실행할 때마다 해당 변수의
값으로 바뀐다.
이 문서의 지면상 사람들이 종종 맞닥드리는 문제점들에 대해 어떻게 수정해야 하는지 전부 안내하지는 못한다는 점을 기억해 둔다.
대부분의 프로그램들은 여러분의 시스템 구조에 맞게 설치하는 방법이 있어서, 해당 실행 파일을 $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/* 파일들은 보낼 필요 없고, 그 외의 패치를 보내야 한다. 패치를 보내기 전에 그리고 그 패치가 데비안 혹은 리눅스(심지어는 유닉스!)에만 특별히 관계된 사항이 아니라는 걸 확인하고 상위 관리자에게 보낸다.
또 한가지 흔히 만나는 문제가 있다: 라이브러리는 각 플랫폼마다 다르다. 예를 들어 메이크파일에서 데비안에 없는, 심지어는 리눅스에 없는 라이브러리와 링크하려고 하는 경우도 있다. 이 경우에 데비안에 들어 있는, 같은 기능을 하는 라이브러리로 바꿔야 한다. 가장 좋은 방법은 그 줄을 주석처리하는 것이다. 지우지 않는 건 다른 플랫폼에서 컴파일하는 사람도 있을 것이고, 그 사람에게 문제의 원인을 알려주는 힌트를 남겨주기 위해서이다.
예를 들어, 프로그램의 Makefile(혹은 Makfile.in)에 다음과 같이 쓰여 있으면 (그리고 프로그램이 컴파일되지 않으면):
LIBS = -lcurses -lsomething -lsomethingelse
다음과 같이 바꾼다. 이제 컴파일이 될 것이다:
LIBS = -lncurses -lsomething -lsomethingelse
#LIBS = -lcurses -lsomething -lsomethingelse
jrodin@jagor.srce.hrcwryu@debian.org/