Makefile은 리눅스 플랫폼에서 제공하는 빌드 자동화 유틸리티입니다. make 유틸리티는 프로그래밍언어처럼 그 안에서 사용되는 작은 규모의 문법이 있습니다. 변수를 정의할 수 있고, 몇 가지 유용한 함수도 제공합니다.

CC = g++
CFLAGS = -lpcap
TARGET = arp_spoof
RM = rm -f

SOURCE_DIR = src
INCLUDE_DIR = include
BINARY_DIR = bin

default: $(TARGET)
all: default

OBJECTS = $(patsubst %.cpp, %.o, $(wildcard $(SOURCE_DIR)/*.cpp))
HEADERS = $(wildcard $(INCLUDE_DIR)/*.h)

$(TARGET): $(OBJECTS)
	@mkdir -p $(BINARY_DIR)
	@echo "[+] Make Binary File"
	$(CC) -g -c -o $(BINARY_DIR)/$@ $< $(CFLAGS)

%.o: %.cpp $(HEADERS)
	@echo "[+] Compile @< File"
	$(CC) -g -c -o $@ $< -I$(INCLUDE_DIR)

clean:
	$(RM) $(SOURCE_DIR)/*.o
	$(RM) $(BINARY_DIR)/$(TARGET)
	@rmdir $(BINARY_DIR) 2>/dev/null

 

  1. 변수 = 값  // 위의 예제에서 'CC = g++'은 CC 변수에 g++ 값을 대입한 것입니다. 변수를 사용할 때는 '$(변수)'로 접근합니다.
  2. 하단에 보시면 %.o: %.cpp 구문이 있는데 여기서 %는 어떠한 문자열이든 상관없다는 뜻입니다. 예를 들어, 입력 파일로 'main.cpp', 'sub.cpp' 2가지 cpp 파일이 필요하다면 입력 구문에 main.cpp sub.cpp라 적을 필요없이 %.cpp라 적으면 간단히 끝납니다.
  3. '$@'은 출력 파일을 지칭하는 일종의 매크로 변수입니다.
    '$<'은 입력 파일을 지칭하는 일종의 매크로 변수입니다.

 


make 유틸리티에서 제공하는 몇 가지 유용한 함수를 살펴보겠습니다.

  • subst
  • wildcard
  • patsubst
  • notdir

 

subst

usage: $(subst from, to, text)

이 함수는 'text'라는 문자열 중에서 'from'에 해당하는 문자열을 'to'로 치환합니다.

 

wildcard

usage: $(wildcard pattern)

이 함수는 패턴과 일치하는 파일들의 경로를 얻는데 사용합니다.

예를 들어, $(wildcard ../target/*.c) 라고 적으면

../target/main.c

../target/source.c

처럼 패턴과 일치하는 모든 파일들을 가리킵니다.

 

patsubst

usage: $(patsubst pattern, replacement, text)

이 함수는 'text'라는 문자열 중에서 'pattern'에 맞는 패턴 문자열을 'replacement' 패턴 문자열로 대체합니다.

예를 들어, $(patsubst %.c, %.o, foo.c.c bar.c) 라고 적으면

'foo.c.c bar.c'  ->  'foo.c.o bar.o' 로 문자열이 바뀝니다.

 

notdir

usage: $(notdir names...)

이 함수는 나열된 문자열 중에서 '파일 경로'를 제거한 '파일명'만 출력합니다.