[ 이전 ] [ 차례 ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 다음 ]
보통의 경우, 프로그램은 /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에 포함시킬 수 있다. 여기에 관해서는 해당 문서와 매뉴얼을 살펴본다. 해당 프로그램이 제대로 이 기능을 하는 지 확인한다. 이렇게 되면 이미 설치한 다른 것들과 같이 설치 될 것이고 이렇게 되면 패키지 도구가 어떤 파일이 여러분이 패키지에 들어 있는지 아닌지 확인하지 못한다.
따라서 이 일을 할 필요가 있다: 패키징해주는 도구가 .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/* 파일들은 보낼 필요 없고, 그 외의 패치를 보내야 한다. 패치를 보내기 전에 그리고 그 패치가 데비안 혹은 리눅스(심지어는 유닉스!)에만 특별히 관계된 사항이 아니라는 걸 확인하고 상위 관리자에게 보낸다.
또 한가지 흔히 만나는 문제가 있다: 라이브러리는 각 플랫폼마다 다르다. 예를 들어 메이크파일에서 데비안에 없는, 심지어는 리눅스에 없는 라이브러리와 링크하려고 하는 경우도 있다. 이 경우에 데비안에 들어 있는, 같은 기능을 하는 라이브러리로 바꿔야 한다. 가장 좋은 방법은 그 줄을 주석처리하는 것이다. 지우지 않는 건 다른 플랫폼에서 컴파일하는 사람도 있을 것이고, 그 사람에게 문제의 원인을 알려주는 힌트를 남겨주기 위해서이다.
예를 들어, 프로그램의 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.jrodin@jagor.srce.hr
cwryu@debian.org/
yooseong@debian.org/