다음 이전 차례

3. make 쓰기

Makefile은 컴파일 과정의 열쇠다. 가장 간단한 형태로 보면, Makefile은 패키지의 실행 가능한 부분인 "바이너리 파일"을 컴파일하기 위한 하나의 스크립트다. Makefile은 소스 파일을 모두 다시 컴파일하지 않고 소프트웨어 패키지를 갱신하는 방법을 제공할 수도 있지만, 그것은 또 다른 이야기(혹은 또 다른 글)이다.

어느 시점에 Makefile은 ccgcc를 실행시킨다. ccgcc는 사실은 순서에 따라 호출된 전처리기와 C(혹은 C++) 컴파일러, 링커의 집합이다. 이 과정을 통해 소스는 실제로 실행시킬 수 있는 바이너리로 변환된다.

대개 make 라고 치기만 하면 make를 시작할 수 있다. 이렇게 하면 일반적으로 설치하려고 하는 패키지에 필요한 모든 실행 파일들을 컴파일한다. 하지만 make는 파일들을 적당한 디렉터리에 설치한다거나 (make install), 묵은 object 파일을 삭제하는 등(make clean), 다른 작업들도 할 수 있다. make -n 이라고 하면 make에 의해 수행될 모든 명령들을 실행하지는 않고 보여주기만 하므로 컴파일 과정을 미리 볼 수 있다.

일반적인 Makefile을 쓰는 것은 매우 간단한 소프트웨어 뿐이다. 좀더 복잡한 설치 과정에는 라이브러리와 include 파일들의 위치, 개별 컴퓨터의 자원 등에 따라 Makefile을 맞출 필요가 있다. 특히 컴파일에 X11 라이브러리가 필요할 경우가 이에 해당된다. 이 작업은 Imakexmkmf가 처리한다.

man 페이지에서는 Imakefile은 Makefile의 "템플릿"이라 하고 있다. imake 유틸리티는 Imakefile로부터 당신의 시스템에 맞는 Makefile을 구성한다. 하지만 대부분의 경우 당신은 imake 유틸리티의 프런트 엔드(front end)로서 imake를 불러내는 쉘 스크립트인 xmkmf를 수행시킬 것이다. 구체적인 지시는 소프트웨어 패키지에 들어있는 README나 INSTALL 파일을 읽어보아라. (혹시 소스 파일들의 압축을 푼 다음에 기본 디렉터리에 Imake 파일이 있다면, xmkmf를 수행하라는 얘기다.) 이 과정에 대한 더 자세한 분석은 Imakexmkmf의 man 페이지를 읽어보아라.

xmkmfmake는 root가 실행시켜야 할 수도 있다는 점에 유의하라. 특히 바이너리 파일들을 /usr/bin이나 /usr/local/bin 디렉터리로 옮기기 위해서 make install을 실행시킬 때 그렇다. root의 권한이 없는 일반 사용자로서 make를 사용하면 write access denied 라는 에러 메시지를 보게 되기 쉽다. 시스템 디렉터리에 쓰기 허가권을 갖고 있지 않기 때문이다. 만들어진 바이너리 파일들이 당신과 다른 적절한 사용자들에게 적합한 실행 허가권을 갖고 있는지도 확인해야 한다.

xmkmf는 당신의 시스템에 맞는 새로운 Makefile을 만들기 위해서 Imake 파일을 사용한다. 보통 xmkmf-a 옵션과 함께 사용한다. make Makefiles, make includes, make depend 를 자동적으로 실행하기 위해서다. 이렇게 하면 컴파일러와 링커를 위해 변수들을 설정하고 라이브러리의 위치를 정의한다. 때로는 Imake 파일이 없고 대신 같은 역할을 하는 INSTALL 이나 configure 라는 쉘 스크립트가 있을 수도 있다. configure를 실행시키려면 ./configure 라고 해야 한다는 점에 주의해야 한다. 현재 디렉터리의 정확한 configure 스크립트를 호출하기 위해서다. 대부분의 경우 배포본의 README 파일에 설치 과정에 대한 설명이 들어 있다.

보통 xmkmf나 설치 스크립트가 만들어낸 Makefile 속을 직접 살펴보는 것이 좋다. 대개 Makefile은 당신의 시스템에 적합하지만, 경우에 따라서는 Makefile을 변경하거나, 에러를 손으로 수정할 필요가 있을 수도 있다.

대개 루트로서 make install을 하면, 새로 만든 바이너리 파일들을 적절한 시스템 디렉터리에 설치하게 된다. 요즘의 리눅스 배포본의 경우, 시스템 전체용의 바이너리 파일들은 보통 /usr/bin, /usr/X11R6/bin, /usr/local/bin에 설치된다. 원래 설치했던 리눅스의 일부가 아니기 때문에 별도의 바이너리 파일로 남겨두기 위해서 새로운 패키지는 /usr/local/bin에 설치하는 것이 좋다.

원래 상업용 UNIX를 위해 만들어진 패키지는 /opt나 기타 낯선 디렉터리에 설치되도록 되어 있을 수도 있다. 이 경우, 지정된 디렉터리가 없다면, 당연히 설치 에러 메시지가 나오게 된다. 이 문제를 해결하는 가장 간단한 방법은 root 로서 /opt 디렉터리를 만들어서 패키지를 설치하고, 해당 디렉터리를 PATH 환경변수에 넣는 것이다. 또는 /usr/local/bin 디렉터리로 심볼릭 링크를 만들 수도 있다.

일반적인 설치 순서를 정리하면 다음과 같다.

주의점:


다음 이전 차례