6. source와 object 분리

Program Lang./Makefile 2013. 5. 13. 14:27

1. 개요

 

3장의 VPATH 설명 부분에서 소스 파일은 소스 디렉토리에 헤더 파일은 헤더 파일로 분리하였다.

Makefile에서 make가 실행되어 소스 파일을 찾는 부분은 현재 make가 실행되는 위치에 모두 있어야 한다.

하지만 VPATH라는 내부 규칙을 사용함으로써 디렉토리를 용도에 맞게 분리할 수 있었다.

 

2. 개선

 

3장의 VPATH 예제에서 문제점은 소스 파일 디렉토리인 src 폴더에 Command가 성공적으로 실행되면

오브젝트 파일이 모두 src 폴더에 존재한다는 것이다. 딱히 문제되지는 않지만 SVN 같은 툴을

써서 소스의 변경사항을 commit할 시 이들이 같이 존재하면 상당히 번거롭다.

 

아래 예제는 오브젝트 파일이 obj 폴더에 별도로 만들어지도록 하였다. 차 후 Dependency 파일 또한 만들어야

하는데 이렇게 분리하여 관리하는 것이 바람직하다.

 

3. 예제

 

exam3.zip

 

Pattern Rule의 Target이 기존 Pattern Rule에 비해 어떻게 바뀌었는지 보자.

또한 object 파일을 만들때 기존에는 소스파일의 확장자를 단순히 오브젝트 파일의 확장자를 변경하는

내부 매크로 함수를 사용하였느나, 디렉토리 또한 Prefix로 붙어야 해서 다른 함수를 사용하였다.

즉 object 변수에는 obj폴더가 앞에 붙어서 오브젝트 이름이 생성되어 pattern rule에 전달되고

pattern rule도 이를 지원하기 위해서 바뀌었다.

 

 

#***********************************************************************#
# ----------------------------------------------------------------------
#  Copyright(c) 2012-2013 by hee-soon kim 
#
# All rights are reserved
# 
# ----------------------------------------------------------------------#
#
#  FILE NAME    : Makefile
#  VERSION      : 1.0
#  AUTHOR       : heesoon,kim(김희순), chipmaker.tistory.com)
#  DATE         : 2012/12/21
#
#***********************************************************************#

obj_dir = obj
include_dir = include

VPATH = src
CFLAGS += -I $(include_dir)

sources = 
sources += bar.c foo.c main.c

objects = $(foreach src,$(sources),$(obj_dir)/$(src:.c=.o))

all : $(objects) exec

exec : $(objects)
	gcc -o exec $^			# Using Automatic Expanded Variable
	
clean :
	rm -rf $(obj_dir) *.exe
	
$(obj_dir)/%.o : %.c
	echo "Starting Pattern Rules ..."
	@test -d $(obj_dir) || mkdir -p $(obj_dir)
#	$(CC) -MMD -MF $*.d $(CFLAGS) -o $@ -c $<
	$(CC) $(CFLAGS) -o $@ -c $<


 

'Program Lang. > Makefile' 카테고리의 다른 글

8. static, shared library makefile  (0) 2013.05.18
5. Makefile Rules  (0) 2013.05.13
1. basic makefile structure syntax  (0) 2013.05.11
3. VPATH(vpath), conditional and include 지시자  (0) 2013.05.09
4. variable and macros  (0) 2013.05.09
: