Make
- 재컴파일을 지휘하는 프로그램
- 컴파일시 반복적으로 입력해야 하는 것을 규칙으로 정의하여 쓸수 있게끔 하는 툴
작동방식
- make를 입력한다.
- make가 Makefile를 읽어 규칙을 분석한다.
- 첫번째 규칙의 조건파일중 수정된것이 있는지 확인한다.
- 이때 파일의 수정 시간을 참조한다.
- 만약 조건파일이 목표파일로 지정된 규칙이 있으면 그 규칙또한 확인한다.
- 지정된 명령을 실행한다.
Makefile
- make의 규칙을 정의하는 파일.
기본규칙
[TARGET]... : [DEPENDENCY]...
[TAB][COMMAND]
[TAB]...
- [TARGET] : 한 규칙안에서 만들 파일
- [DEPENDENCY] : [TARGET]을 만드는데 필요한 파일
- [COMMAND] : [TARGET]을 만들때 실행할 명령
매크로
- 반복되는 것을 줄여준다.
- 거희 변수같은 느낌.
- 형식
- 정의 혹은 대입 할때
[MACRO_NAME] = [VALUE]
- 쓸때
$([MACRO_NAME])
- 정의 혹은 대입 할때
미리 정의된 매크로
CC | C Compiler |
CFLAGS | C Compiler Option |
CXX | C++ Compiler |
CPPFLAGS | C++ Comipler Option |
MAKE_COMMAND | make command |
- 미리 정의된 매크로는 재정의 할수 있으며 이는 make기본 명령에 쓰인다.
SUFFIXES Rule
.SUFFIXES = .o .cpp
- make가 알아서 규칙을 만들어 처리할 확장자를 등록 .cpp.o : [TAB][COMMAND]
- .cpp에서 .o로 바꿀 규칙을 적는다.
- 이렇게 적어두면 make가 알아서 .cpp와 .o사이의 규칙을 만들어 준다.
- 해당 규칙에서 쓸수 있는 매크로가 있다.
$* | 확장자를 제외한 목적파일 |
$@ | 현재의 목적파일 |
$< | 조건 파일중 가장 처음 파일 |
$? | 현재의 목적파일보다 최근에 갱신된 파일 |
- 예제 : cpp 규칙
.SUFFIXES = .o .cpp
.cpp.o :
g++ -c $?
패턴 규칙
- SUFFIXES Rule은 너무 구식이어서 새로운 방식이 있다.
%.cpp : %.o
g++ -c $?
Automatic Variables
https://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html
Dependency
실제로 동작을 정의하지 않고 단지 dependency만 표시하고 싶은경우(위의 SUFFIXES Rule나 패턴 규칙으로 인해 동작이 이미 정의 되는 경우) 동작부분을 작성하지않고 : 으로 dependency만 나타낼수 있다.
최종예제
- cpp프로젝트 예제 Makefile
SOURCES = $(wildcard *.cpp)
OBJECTS = $(SOURCES:.cpp=.o)
TARGET = main
.PHONY : all clean
all : $(OBJECTS)
$(CXX) -o $(TARGET) $(OBJECTS)
%.d : %.cpp
$(CXX) -MM $< > $@
%.o : %.cpp
$(CXX) -c $(CPPFLAGS) $<
clean :
rm -rf $(OBJECTS) $(TARGET) $(OBJECTS:.o=.d)
-include $(SOURCES:.cpp=.d)