Makefile
은 컴파일 과정의 열쇠다. 가장 간단한 형태로 보면, Makefile은
패키지의 실행 가능한 부분인 "바이너리 파일"을 컴파일하기 위한 하나의
스크립트다. Makefile은 소스 파일을 모두 다시 컴파일하지 않고 소프트웨어
패키지를 갱신하는 방법을 제공할 수도 있지만, 그것은 또 다른 이야기(혹은
또 다른 글)이다.
어느 시점에 Makefile은 cc
나 gcc
를 실행시킨다.
cc
나 gcc
는 사실은 순서에 따라 호출된 전처리기와 C(혹은 C++)
컴파일러, 링커의 집합이다. 이 과정을 통해 소스는 실제로 실행시킬 수 있는
바이너리로 변환된다.
대개 make 라고 치기만 하면 make를 시작할 수 있다. 이렇게 하면 일반적으로 설치하려고 하는 패키지에 필요한 모든 실행 파일들을 컴파일한다. 하지만 make는 파일들을 적당한 디렉터리에 설치한다거나 (make install), 묵은 object 파일을 삭제하는 등(make clean), 다른 작업들도 할 수 있다. make -n 이라고 하면 make에 의해 수행될 모든 명령들을 실행하지는 않고 보여주기만 하므로 컴파일 과정을 미리 볼 수 있다.
일반적인 Makefile을 쓰는 것은 매우 간단한 소프트웨어 뿐이다. 좀더 복잡한
설치 과정에는 라이브러리와 include 파일들의 위치, 개별 컴퓨터의 자원 등에 따라
Makefile을 맞출 필요가 있다. 특히 컴파일에 X11
라이브러리가 필요할
경우가 이에 해당된다. 이 작업은 Imake와 xmkmf가 처리한다.
man 페이지에서는 Imakefile
은 Makefile의 "템플릿"이라 하고 있다.
imake 유틸리티는 Imakefile로부터 당신의 시스템에 맞는 Makefile을 구성한다.
하지만 대부분의 경우 당신은 imake 유틸리티의 프런트 엔드(front end)로서
imake를 불러내는 쉘 스크립트인 xmkmf를 수행시킬 것이다.
구체적인 지시는 소프트웨어 패키지에 들어있는 README나 INSTALL 파일을
읽어보아라. (혹시 소스 파일들의 압축을 푼 다음에 기본 디렉터리에 Imake
파일이 있다면, xmkmf를 수행하라는 얘기다.)
이 과정에 대한 더 자세한 분석은 Imake
와 xmkmf
의 man 페이지를
읽어보아라.
xmkmf
와 make
는 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
디렉터리로 심볼릭 링크를 만들 수도 있다.
일반적인 설치 순서를 정리하면 다음과 같다.
README
파일 및 그밖의 가능한 문서를 읽는다.INSTALL
, configure
를 실행한다.Makefile
을 확인한다.
주의점:
Makefile
에 gcc
를 위한 최적화 옵션을
추가하고 싶을 수도 있다. 흔한 옵션은 -O2,
-fomit-frame-pointer, -funroll-loops, (펜티엄 cpu라면)
-mpentium 등이다. Makefile을 변경할 때에는 주의해야 한다.
/coll
과 /pack
디렉터리에
설치된다. 이 배포본들을 쓰려면 위의 사이트에서 Pack-Collection 을
다운받아야 한다.