# 자동변수 (Automatic Variables)
$@ : 현재 Target 이름
$* : 확장자가 없는 현재의 TARGET
$% : 대상의 이름 (해당 규칙 대상이 archive인 경우)
$< : 현재 Target이 의존하는 대상들 중 첫번째 파일
$? : 현재 Target이 의존하는 대상들 중 변경된 것들의 목록
$^ : 현재 Target이 의존하는 대상들의 전체 목록
$+ : $^와 비슷하지만, 중복된 파일 이름들까지 모두 포함
# Makefile 함수 설명
1. $(subst from, to, text)
-> subst : substitution의 약자
-> 이 함수가 하는 일은 text라는 문자열 중에서 from에 해당하는
문자열을 to에 해당하는 문자열로 대체
-> EX
-> $(subst ame, AmE, game jame)
-> gAmE jAmE
2. $(wildcard pattern)
-> pattern : 일반적 파일 명이나, 경로가 포함된 파일 명칭 패턴
-> 특정 파일 명칭 패턴을 통해 원하는 종류의 파일들을 불러오는데 사용
-> 이때 사용한는 특수문자 : *
-> EX
-> $(wildcard ../target/*.c)
-> ../target/main.c ../target/source.c
3. $(patsubst pattern, replacement, text)
-> subst와 유사
-> subst와 다른점은 from, to와 같이 특정 문자열을 대체하는 것이 아닌,
특정 패턴을 대체한다는 것과 공백 문자로 각 단어를 구분한다는 점
-> 이때 사용되는 특수문자 : % (wildcard의 *와 동일)
-> EX
-> $(patsubst %.c, %.o, x.cc.c bar.c)
-> x.cc.o bar.o
4. $(notdir names... )
-> names에 입력된 파일명들 중에서 경로라고 판단되는 부분 제거
-> EX
-> $(notdir forge/target.c name.c pms/fiya.mp3)
-> target.c name.c pms/fiya.mp3
# 자동 prerequisite 생성
컴파일 시 -MD 옵션을 주면, d 확장자를 가진 파일이 생성된다.
이 파일에는 자동적으로 목적파일과 컴파일한 소스파일을 타켓으로 삼는
의존파일들을 담은 목록을 담고 있다.
# G++ 옵션
1. -MF
-> 오브젝트 파일의 종속성을 검사하여 내용을 .dep 파일에 기록하고
.cpp를 컴파일하여 .o 파일을 생성한다.
2. -MD
-> 오브젝트 파일의 종속성을 검사하여 내용을 .d 파일에 기록하고,
.cpp를 컴파일하여 .o 파일을 생성한다.
# C++ 컴파일러로 설정
CXX = g++
# C++ 컴파일러 옵션
CXXFLAGS = -Wall
# 생성하고자 하는 실행 파일 이름
TARGET = example.exe
# 디렉토리 설정
SRC_DIR = ./src
OBJ_DIR = ./obj
DEP_DIR = ./dep
BIN_DIR = ./bin
HED_DIR = include/
# 디렉토리 안에 파일들 "경로/제목.형식자"들을 불러오기
SRCS = $(wildcard $(SRC_DIR)/*.cpp)
OBJS = $(subst $(SRC_DIR), $(OBJ_DIR), $(SRCS:.cpp=.o))
DEPS = $(OBJS:.o=.d)
# Target 설정
all : $(BIN_DIR)/$(TARGET)
# Object file 생성
$(OBJ_DIR)/%.o : $(SRC_DIR)/%.cpp
$(info Step A : Complie Source file for Object file)
$(info $< Compling...)
$(CXX) $(CXXFLAGS) -I$(HED_DIR) -c $< -o $@ -MD
$(info $< Complied...)
# Linking & Target file 생성
$(BIN_DIR)/$(TARGET) : $(OBJS)
$(info Step B : Link Object files to Targer file)
$(info ----- [$(TARGET)] -----)
$(info ----- Start Linking...-----)
$(CXX) $(CXXFLAGS) $(LDFLAGS) $^ -o $@
$(info ----- Linked... -----)
.PHONY : name
name :
echo SRCS is $(SRCS)
echo OBJS is $(OBJS)
echo DEPS is $(DEPS)
# Dependency files 생성
-include $(DEPS)
$(info Step C : Include Dependency files)