예제 http://blog.naver.com/delusion1224/50175392681 

[출처] Makefile 예제|작성자 착각쟁이

 

makefile 예제

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

CC = gcc

CFLAGS = -D_DEBUG

TARGET = test

SRCS = $(wildcard *.c)

OBJECTS = $(SRCS:.c=.o)

 

.SUFFIXES : .o .c

%.o : %.c

$(CC) $(CFLAGS) -c -o $@ $<

 

all : $(TARGET)

 

$(TARGET) : $(OBJECTS)

$(CC)  $(CFLAGS) -o $@ $^

 

clean :

rm -rf *.o $(TARGET)

 

4~5 line은 다음과 같이 한 줄로 축약될 수도 있다

OBJECTS = $(patsubst %c, %o, $(wildcard *.c))

 

7~9 line은 현재 Makefile에 정의된 CC와 CFLAGS를 사용하기 위해 추가된 내용이다.

해당 내용이 없더라도 각 object들은 자동으로 compile이 되지만, make 내부에 정의된 매크로가 사용된다.

 

make 내부에 정의된 매크로에 대한 자세한 내용은 make -p를 해보면 알 수 있다.

다음은 make -p의 일부분

...

#기본값

COMPILE.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c 

...

%.o: %.c
#  실행할 명령어 (내장):
 $(COMPILE.c) $(OUTPUT_OPTION) $<

...

 

추가로, Makefile 작성 시 주의해야 할 점은,

각 명령어들은 다른 shell에서 실행된다.

즉, 다음과 같이 Makefile을 작성하면,

 ...

del :

cd ./backup

rm -rf *

두 명령이 각자 다른 shell에서 실행되기 때문에 현재 folder의 모든 내용이 삭제가 된다.

올바른 방법은 다음과 같이 한 line에 적는것이다.

cd ./backup && rm -rf *

&& 대신 ;를 사용해도 되지만 backup folder가 없을 경우에는 역시 현재 folder의 내용들이 삭제 되므로 좋지 않다.

[출처] Makefile 예제|작성자 착각쟁이

+ Recent posts