Edit Files
Login Register

Make

  • 재컴파일을 지휘하는 프로그램
  • 컴파일시 반복적으로 입력해야 하는 것을 규칙으로 정의하여 쓸수 있게끔 하는 툴

작동방식

  1. make를 입력한다.
  2. make가 Makefile를 읽어 규칙을 분석한다.
  3. 첫번째 규칙의 조건파일중 수정된것이 있는지 확인한다.
    • 이때 파일의 수정 시간을 참조한다.
    • 만약 조건파일이 목표파일로 지정된 규칙이 있으면 그 규칙또한 확인한다.
  4. 지정된 명령을 실행한다.

Makefile

  • make의 규칙을 정의하는 파일.

기본규칙

[TARGET]... : [DEPENDENCY]...
[TAB][COMMAND]
[TAB]...
  • [TARGET] : 한 규칙안에서 만들 파일
  • [DEPENDENCY] : [TARGET]을 만드는데 필요한 파일
  • [COMMAND] : [TARGET]을 만들때 실행할 명령

매크로

  • 반복되는 것을 줄여준다.
  • 거희 변수같은 느낌.
  • 형식
    • 정의 혹은 대입 할때
      [MACRO_NAME] = [VALUE]
    • 쓸때
      $([MACRO_NAME])

미리 정의된 매크로

CCC Compiler
CFLAGSC Compiler Option
CXXC++ Compiler
CPPFLAGSC++ Comipler Option
MAKE_COMMANDmake 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)
    

활용예

프로젝트용 c++ make file 참조.

참고 문헌