make 를 사용하여 컴파일 할 때 object파일들을 특정 폴더에 생성하도록 하고 싶은 경우 VPATH를 사용하면 쉽게 makefile를 구현 할 수 있다.
예를 들면 src 폴더에는 소스만 inc 풀더는 헤더 파일이 있고 컴파일 된 오브젝트 파일들을 obj 폴더에 넣고 싶은 경우 다음과 같이 makefile를 만들어 주면 된다.
CC=arm-none-eabi-gcc OUT_DIR = ./obj SRC_DIR=./src INC_DIR=./inc VPATH = $(SRC_DIR) CFLAGS = -I./inc SRCS=$(wildcard $(SRC_DIR)/*.c ) OBJS=$(patsubst %.c, %.o, $(notdir $(SRCS))) OUT_OBJS = $(patsubst %, $(OUT_DIR)/%, $(OBJS)) all: target target : $(OUT_OBJS) Makefile $(CC) -o target $(OUT_OBJS) $(OUT_DIR)/%.o: %.c $(CC) -c $(CFLAGS) $< -o $@ debug : @echo SRCS=$(SRCS) @echo OBJS=$(OBJS) @echo OUT_OBJS=$(OUT_OBJS)
src 폴더에 main.c와 test.c 가 있고 inc 폴더에 test.h 가 있는 경우
make 하면 다음과 같이 컴파일 된다.
D:tempmake_test>make arm-none-eabi-gcc -c -I./inc ./src/main.c -o obj/main.o arm-none-eabi-gcc -c -I./inc ./src/test.c -o obj/test.o arm-none-eabi-gcc -o target ./obj/main.o ./obj/test.o
각 단계에서 Makefile에 정의된 변수의 값은 다음과 같다.
D:tempmake_test>make debug SRCS=./src/main.c ./src/test.c OBJS= main.o test.o OUT_OBJS= ./obj/main.o ./obj/test.o
여기서 VPATH의 역할은 소스 파일들의 위치를 Make에 알려주어 %.c 에 패스를 적어주지
않아도 Make 가 VPATH에 정의된 경로에서 소스를 찾아 준다. 참고로 VPATH에 src 경로를 여러개 적어 주는게 가능하다.