Makefile이란?
Linux상에서 반복적으로 발생하는 컴파일을 쉽게하기위해서 사용하는 make프로그램의 설정 파일.
Makefile을 통해 라이브러리 및 컴파일러 환경을 관리할 수 있다.
Incremental build를 사용하기 위함.
Incremental build란?
반복적인 빌드 과정에서 변경된 소스코드에 의존성(Dependency)이 있는 대상들만 추려서 다시 빌드하는 기능이다.
예를 들어, 위의 빌드 예제에서 main.c의 한 줄만 바꾸고 다시 빌드할 때, 컴파일과 링크만 수행하는 경우가 이에 해당한다.
Makefile의 기본 구조
파일명 : Makefile
Makefile은 Target(대상), 의존 관계(Dependency), 명령(Recipe/Command)의 세가지로 아루어진다.
- Target : 빌드 대상 이름, 명령에 의해 생성되는 결과 파일, 오브젝트 파일이나 실행 파일
- Dependency : 대상을 만들 때 의존되는 파일들, 이곳에 나열된 대상들을 먼저 만들고 빌드 대상을 생성한다. 의존 파일이 변경됐다면 대상을 만들도록 명령을 내릴 것이다.
- Command : 빌드 대상을 생성하는 명령, 여러줄로 작성할수 있으며, 의존 관계에 있는 파일들이 변경됐거나 대상 파일이 없을 때 명령이 실행된다. 쉘에서 쓸 수 있는 명령을 사용할 수 있다.

Makefile 매크로
Makefile에서 미리 정의된 매크로 확인 방법 : make -p
매크로 이름 | 설명 | 기본값 |
AR | 아카이브 관리 프로그램 | ar |
AS | 어셈블러 | as |
CC | C Compiler | cc |
CXX | C++ Compiler | g++ |
CPP | C 전처리기 | cc -E |
LD | 링크 | ld |
MAKEINFO | Texinfo 파일을 Info 파일로 변환 | makeinfo |
TEX | TeX문서로부터 TeX DVI 생성 | tex |
TEXI2DVI | Texinfo 파일을 dvi파일로 변환 | texi2dvi |
ARFLAGS | ar플래그 | |
ASFLAGS | 어셈블러 플래그 | |
CFLAGS | C 컴파일러 플래그 | |
CXXFLAGS | C++ 컴파일러 플래그 | |
CPPFLAGS | C 전처리기 플래그 | |
make 내부적으로는 정의되어있지만, make -p로 확인할 수 없는 자동 매크로 | ||
$? | 현재 타겟보다 최근에 변경된 종속 항목 리스트(확장자 규칙에서 사용 불가) | |
$^ | 현재 타겟의 종속 항목 리스트(확장자 규칙에서 사용 불가) | |
$@ | 현재 타겟의 이름 | |
$< | 현재 타겟보다 최근에 변경된 종속 항목 리스트(확장자 규칙에서만 사용 가능) | |
$* | 현재 타겟보다 최근에 변경된 종속 항목의 이름(확장자 제외/ 확장자 규칙에서만 사용 가능) | |
$% | 현재 타깃이 라이브러리 모듈일 때 .o 파일에 대응되는 이름 |
아카이브를 생성할 경우 :: ar rcus [라이브러리 이름] [오브젝트 파일들]
r 옵션 :: 새로운 오브젝트 파일이면 추가, 기존 파일이면 치환함.
c 옵션 :: 아카이브 파일이 존재하지 않아도 경고 메시지를 출력하지 않음.
u 옵션 :: 오브젝트 파일의 타임스탬프를 비교해 새로운 파일일 경우에만 치환함.
s 옵션 :: ranlib(1)과 마찬가지로 아카이브 인덱스를 생성.
→ 아카이브 인덱스를 생성하지 않으면 링크 속도가 느려지고, 시스템 환경에 따라서는 에러가 발생.
(※ 아카이브 인덱스는 nm -s로 조회할 수 있다.)
출처: https://devanix.tistory.com/195 [┗System∑Sec†ion┛]
참조
- https://doitnow-man.tistory.com/100
- https://velog.io/@hidaehyunlee/Makefile-%EB%A7%8C%EB%93%A4%EA%B8%B0
- https://m.blog.naver.com/muri1004/220025207766
Makefile이란?
Linux상에서 반복적으로 발생하는 컴파일을 쉽게하기위해서 사용하는 make프로그램의 설정 파일.
Makefile을 통해 라이브러리 및 컴파일러 환경을 관리할 수 있다.
Incremental build를 사용하기 위함.
Incremental build란?
반복적인 빌드 과정에서 변경된 소스코드에 의존성(Dependency)이 있는 대상들만 추려서 다시 빌드하는 기능이다.
예를 들어, 위의 빌드 예제에서 main.c의 한 줄만 바꾸고 다시 빌드할 때, 컴파일과 링크만 수행하는 경우가 이에 해당한다.
Makefile의 기본 구조
파일명 : Makefile
Makefile은 Target(대상), 의존 관계(Dependency), 명령(Recipe/Command)의 세가지로 아루어진다.
- Target : 빌드 대상 이름, 명령에 의해 생성되는 결과 파일, 오브젝트 파일이나 실행 파일
- Dependency : 대상을 만들 때 의존되는 파일들, 이곳에 나열된 대상들을 먼저 만들고 빌드 대상을 생성한다. 의존 파일이 변경됐다면 대상을 만들도록 명령을 내릴 것이다.
- Command : 빌드 대상을 생성하는 명령, 여러줄로 작성할수 있으며, 의존 관계에 있는 파일들이 변경됐거나 대상 파일이 없을 때 명령이 실행된다. 쉘에서 쓸 수 있는 명령을 사용할 수 있다.

Makefile 매크로
Makefile에서 미리 정의된 매크로 확인 방법 : make -p
매크로 이름 | 설명 | 기본값 |
AR | 아카이브 관리 프로그램 | ar |
AS | 어셈블러 | as |
CC | C Compiler | cc |
CXX | C++ Compiler | g++ |
CPP | C 전처리기 | cc -E |
LD | 링크 | ld |
MAKEINFO | Texinfo 파일을 Info 파일로 변환 | makeinfo |
TEX | TeX문서로부터 TeX DVI 생성 | tex |
TEXI2DVI | Texinfo 파일을 dvi파일로 변환 | texi2dvi |
ARFLAGS | ar플래그 | |
ASFLAGS | 어셈블러 플래그 | |
CFLAGS | C 컴파일러 플래그 | |
CXXFLAGS | C++ 컴파일러 플래그 | |
CPPFLAGS | C 전처리기 플래그 | |
make 내부적으로는 정의되어있지만, make -p로 확인할 수 없는 자동 매크로 | ||
$? | 현재 타겟보다 최근에 변경된 종속 항목 리스트(확장자 규칙에서 사용 불가) | |
$^ | 현재 타겟의 종속 항목 리스트(확장자 규칙에서 사용 불가) | |
$@ | 현재 타겟의 이름 | |
$< | 현재 타겟보다 최근에 변경된 종속 항목 리스트(확장자 규칙에서만 사용 가능) | |
$* | 현재 타겟보다 최근에 변경된 종속 항목의 이름(확장자 제외/ 확장자 규칙에서만 사용 가능) | |
$% | 현재 타깃이 라이브러리 모듈일 때 .o 파일에 대응되는 이름 |
아카이브를 생성할 경우 :: ar rcus [라이브러리 이름] [오브젝트 파일들]
r 옵션 :: 새로운 오브젝트 파일이면 추가, 기존 파일이면 치환함.
c 옵션 :: 아카이브 파일이 존재하지 않아도 경고 메시지를 출력하지 않음.
u 옵션 :: 오브젝트 파일의 타임스탬프를 비교해 새로운 파일일 경우에만 치환함.
s 옵션 :: ranlib(1)과 마찬가지로 아카이브 인덱스를 생성.
→ 아카이브 인덱스를 생성하지 않으면 링크 속도가 느려지고, 시스템 환경에 따라서는 에러가 발생.
(※ 아카이브 인덱스는 nm -s로 조회할 수 있다.)
출처: https://devanix.tistory.com/195 [┗System∑Sec†ion┛]
참조
- https://doitnow-man.tistory.com/100
- https://velog.io/@hidaehyunlee/Makefile-%EB%A7%8C%EB%93%A4%EA%B8%B0
- https://m.blog.naver.com/muri1004/220025207766