리눅스에서 프로그래밍 하다 보면 꼭 필요한 유틸리티이다. make 유틸은

소스관리를 돕고 컴파일 되어야 하는 소스 파일도 관리한다.

main.c , sub.c , ui.c test.c 라는 파일이 있을 때 보통

gcc –o main main.c sub.c ui.c test.c

이렇게 컴파일 한다. 이걸 일일이 타이핑 하던지 쉘 스크립트로 구성해서

할 수 있지만, 그렇게 편한 방법은 아니다. 그래서 make 유틸을 사용하여

Makefile 을 구성하면 좀더 편안한 구성이 될수 있다.

1. 일반적 사용 예

main: main.o sub.o ui.o test.o

gcc –o main main.o sub.o ui.o test.o

main.o: main.c

gcc –c main.c

sub.o: sub.c

gcc –c sub.c

ui.o: ui.c

gcc –c ui.c

test.o: test.c

gcc –c test.c

위는 Makefile로 구성한 컴파일 예이다.

한 라인씩 간단하게 설명해 보면,

1. main 이 구성되기 위해선 main.o sub.o ui.o test.o 오브젝트 파일이 필요로 한다.

파일이 없다면, 각 파일 구성 규칙으로 이동한다.

2. 각 파일 구성 규칙은 단순하게 gcc 의 c 옵션으로 오브젝트파일만을 생성한다.

3. 모든 오브젝트 파일이 존재하게 되면 main 구성 규칙으로 이동하여

Linking을 하게 된다.

2. 매크로 사용

OBJECT = main.o sub.o ui.o test.o

main: $(OBJECT)

gcc –o main main.o sub.o ui.o test.o

main.o: main.c

gcc –c main.c

sub.o: sub.c

gcc –c sub.c

ui.o: ui.c

gcc –c ui.c

test.o: test.c

gcc –c test.c

매크로를 사용하여 좀더 간단하게 구성할 수 있다. 사용법 또한 일반 변수에

값을 대입 하듯이 사용하면 되고, 사용법은 $(매크로이름) 과 같이 사용한다.

또한 make 유틸에는 내부 매크로가 있다. 이는 좀더 Makefile 구성을

간략하게 생략하게 한다든지 확장을 위해서 있는 매크로로 몇몇개 자주쓰는

매크로 위주로 간략한 설명만 하도록 하겠다.

$* 확장자가 없는 현재의 목표 이름

main.o: main.c
            gcc –c $*.c
$* 는 목표 이름 main.o 에서 main 이 된다.
$@ 현재 목표 이름
main: $(OBJECT)
            gcc –o $@ main.o sub.o ui.o test.o
$@ 는 목표 이름 main 이 된다.
$< 조건 중 첫번째 이름

main.o: main.c test.h
         gcc –c $<
$<는 main.c test.h 중 첫번째 main.c가 선택된다.
$? 현재의 목표 이름 보다 더 최근에 갱신된 이름

main.o: main.c test.h
         gcc –c $?
test.h가 수정되었다면 test.h가 선택
$^ 조건에 있는 내용을 치환

main: main.c test.h 
       gcc –o $^
$^는 main.c test.h 를 뜻한다.

 

+ Recent posts