노무현 대통령 배너


2006. 3. 31. 15:32

Make utility

1. Make utility란?
2. Makefile 만들기
3. Makefile의 internal rule
4. Make의 macro
5. Make의 실행

1. Make utility란?


프로그램을 작성하고 컴파일을 할 때 컴파일의 일련의 과정을 하나의 파일로 만들 수 있다. 특히 수많은 object file과 실행 프로그램을 가지고 있는 시스템이 있다고 하면 header, source code file, object, 실행파일의 모든 관계를 기억하고 명령어 프롬프트 상에서 입력하는 것은 쉬운 일이 아닐 것이다. 이러한 문제의 해결에 도움을 주는 것이 make utility이다. make 명령은 "makefile"이라는 특수한 형식에 저장되어 있는 일련의 규칙들에 근거하여 파일을 최신 버전으로 개정하는 유틸리티이다.

2. Makefile 만들기

Makefile의 작성법을 간단한 예를 통하여 설명한다.
-------------------------------------------------------------
hello: hello.c
[TAB] gcc -o hello hello.c
-------------------------------------------------------------
위의 makefile에서 첫째줄은 이 makefile의 최종 목표를 나타낸다. 그리고 뒤에 있는 콜론(:)은 이 목표가 어떠한 파일에 종속적인가를 나타낸다. 위의 예에서는 hello라는 프로그램이 hello.c라는 파일에 의해 만들어지는 것을 의미한다. 두번째 줄은 그 목표를 완성하기 위해 수행해야 할 명령을 나타낸다. 주의할 점은 이 줄이 반드시 탭문자로 시작해야 한다는 점이다.
위의 makefile을 사람의 말로 풀어 쓴다면 다음과 같이 나타낼 수 있다.

"우리의 최종 목표는 hello이며 이 hello는 hello.c가 바뀌면 다시 'gcc -o hello hello.c'를 실행시켜 새로 컴파일해야 한다."

실제로 makefile은 목표파일과 목표가 종속되는 파일의 생성시간을 비교하여 종속되는 파일들의 생성시간이 목표파일의 생성시간보다 늦을때, 바로 다음줄부터 지정한 명령어들을 실행한다.
위의 예는 간단한 것이고 실제로 makefile의 장점을 살린 것이라고는 할 수 없다. 그러면 어떤 경우에 makefile을 이용하는 것이 유리한가? 다음의 예를 보자.
-------------------------------------------------------------
hello: a.o b.o c.o
gcc -o hello a.o b.o c.o
a.o: a.c
gcc -c a.c
b.o: b.c
gcc -c b.c
c.o: c.c
gcc -c c.c
-------------------------------------------------------------
위의 예를 살펴보면 hello라는 목표는 a.o, b.o, c.o라는 파일에 종속되어 있고, a.o, b.o, c.o라는 목표는 각각 a.c, b.c, c.c라는 파일에 종속되어 있다. 그러므로 프로그램을 만드는 도중 a.c, b.c, c.c 중에서 어느 하나만 수정했다고 할 때 모두를 다시 컴파일해야 할 필요가 없는 것이다. 약간 구체적으로 살펴보자.
1. hello와 a.o의 작성 시간을 비교한다.
2. a.o가 최신이기 위해서는 a.c 와 작성시간을 비교한다.
3. 같은 방식으로 b, c 역시 실행한다.
4. 이중 하나가 변경사항이 있을 경우 그것만 실행하고, 처음 hello를 다시 컴파일 한다.
약간 응용된 다음의 예를 보자.
-------------------------------------------------------------
hello: a.o b.o c.o
gcc -o hello a.o b.o c.o
a.o: a.c hello.h
gcc -c a.c b.o: b.c hello.h
gcc -c b.c c.o: c.c hello.h hello2.h
gcc -c c.c
-------------------------------------------------------------
위의 예에서는 각각의 object file에 포함된 헤더파일을 명시하고 있다.
text processing을 하는 다음의 makefile을 보자.
-------------------------------------------------------------
paper.ps: all.dvi
dvips -o paper.ps all.dvi
all.dvi: all.tex i1.tex i2.tex f1.eps
latex all.tex
f1.eps: f1.fig
fig2eps -o f1.eps f1.fig
-------------------------------------------------------------
all.tex는 i1.tex, i2.tex, f1.eps를 포함하고 있다. 그리고 f1.eps는 f1.fig를 fig2eps라는 프로그램을 통해 만든 것이다. 그러므로 paper.ps는 위의 텍스트 프로세싱을 한꺼번에 실행하는 makefile에 의해서 만들어진다.
Makefile은 컴파일을 하는 경우 외에도 간단한 batch file로 사용될 수 있다.
-------------------------------------------------------------
clean:
/bin/rm -f a.o b.o c.o core
-------------------------------------------------------------
위의 예는 프로그램을 컴파일한 후 필요없는 파일들을 지워주는 명령을 수행한다.

3. Makefile의 internal rule

-----------------------------------------
$* <- 확장자가 없는 현재의 목표 파일(Target)
$@ <- 현재의 목표 파일(Target)
$< <- 현재의 목표 파일(Target)보다 더 최근에 갱신된 파일 이름
$? <- 현재의 목표 파일(Target)보다 더 최근에 갱신된 파일이름
-----------------------------------------
앞의 예제를 다시 한번 보면
-------------------------------------------------------------
hello: a.o b.o c.o
gcc -o hello a.o b.o c.o
a.o: a.c hello.h
gcc -c a.c b.o: b.c hello.h
gcc -c b.c c.o: c.c hello.h hello2.h
gcc -c c.c
-------------------------------------------------------------
지금의 예제는 사실 너무 겹치는 내용이 많이 있다. 예를 들면 a.c를 컴파일하는 것이나 b.c, c.c를 컴파일하는 것은 방법이 거의 비슷하기 때문에 위와 같은 내용을 힘들여 입력할 필요가 없이 다음과 같이 만들어도 같은 효과를 낸다.
-------------------------------------------------------------
hello: a.o b.o c.o
gcc -o hello a.o b.o c.o
a.o: a.c hello.h
b.o: b.c hello.h
c.o: c.c hello.h hello2.h
-------------------------------------------------------------
위의 파일에서 a.o는 a.c에 종속적이라는 사실이 make에 알려진다. 그런데 a.c 에서 a.o를 어떻게 만들어낼까? Make는 내부적으로 여기에 대한 규칙을 가지고 있다. 실제로 이 makefile로 make를 하면 a.c를 컴파일하는데 'gcc -c target sun4 a.c'라는 명령어가 실행된다. Make의 내부규칙은 이 외에도 많지만 지금 소개한 내용이 가장 많이 사용되는 내부규칙이므로 반드시 기억을 해 두도록 한다.

4. Make의 Macro 기능

Makefile에서 macro라고 하면 간단한 문자열 치환에 지나지 않는다. 그러나 make의 행동방식을 바꾸고 마음대로 움직이게 하는 것이 바로 이 매크로이다. 우선 예제를 보고 하나씩 설명을 하기로 한다.
-------------------------------------------------------------
hello: a.o b.o c.o
gcc -o hello a.o b.o c.o
a.o: a.c hello.h
gcc -c a.c
b.o: b.c hello.h
gcc -c b.c
c.o: c.c hello.h hello2.h
gcc -c c.c
-------------------------------------------------------------
위의 예를 보면 a.o, b.o, c.o라는 문자들이 여러군데 나와있는 것을 알 수 있다. 이러한 중복을 피하기 위해 매크로가 사용될 수 있으며 아래의 예는 위의 예와 동일한 기능을 수행한다.
-------------------------------------------------------------
OBJ = a.o b.o c.o
hello: $(OBJ)
gcc -o hello $(OBJ)
a.o: a.c hello.h
gcc -c a.c
b.o: b.c hello.h
gcc -c b.c
c.o: c.c hello.h hello2.h
gcc -c c.c
-------------------------------------------------------------
이렇게 하면 object 파일을 하나 추가할 경우 맨 위에 있는 OBJ라는 매크로 변수에 파일 이름만 추가해 주면 된다. 주의할 점은 다음과 같다.
  1. 매크로는 보통 대문자로 정의된다. 반드시 그런 것은 아니지만 관례라고 할 수 있다.
  2. 매크로를 정의할 때는 대입표시(=), 그리고 대입되는 문자열 순으로 한 라인에 적는다. 한 라인을 넘을 경우 '₩'를 맨 뒤에 넣어주면 하나의 라인으로 인식된다.
  3. 매크로를 사용할 때는 반드시 '$'와 괄호로 묶어주어야 한다.
  4. pre-defined macro: make 안에 미리 정의된 매크로가 있다. 이것들은 상당히 많은 종류가 있으며 모두 사용하는 것은 드물기 때문에 중요한 것만 소개한다.
CC = cc
CFLAGS = -c 컴파일러에 주는 flag (-g : debug option
) 또는 symbol define
-------------------------------------------------------------
CC = gcc
CFLAGS = -g -DSymbol
OBJ = a.o b.o c.o
hello: $(OBJ)
$(CC) -o hello $(OBJ)
a.o: a.c hello.h
b.o: b.c hello.h
c.o: c.c hello.h hello2.h
clean:
/bin/rm -f $(OBJ) core
-------------------------------------------------------------

5. Make의 실행

일단 makefile이 생성되면 다음과 같이 make utility를 사용함으로써 make 프로세서는 실행된다.

make [-f makefile_name]
이 명령은 make 시스템이 실행하는 파일을 재생성하게 하는데, 이 실행파일의 의존 정보는 makefile_name에 저장되어 있다. 만일 -f 옵션을 생략하면 default로 makefile_name 대신 'makefile' 이 먼저 사용되고, 'Makefile'이 그 다음으로 사용된다.

'Utilities' 카테고리의 다른 글

GDB manual  (0) 2006.03.31
vi 120% 활용  (0) 2006.03.31
GCC 컴파일 옵션 - 대충 정리  (0) 2006.03.31
[본문스크랩] GNU Make 설명 문서  (0) 2006.03.28
[본문스크랩] [VIM] 실버의 필수 플러그인 모음  (0) 2006.03.28