본문 바로가기
Embedded 실습/환경설정

make 명령어와 makefile

by 중동콜링 2013. 4. 22.

* make 명령어

make 명령어란 Unix/Linux 시스템에서 포함되어 있는 명령어로, 

makefile이라는 파일을 참조하여 빌드하는 명령어이다.

(Windows에서도 nmake라고 똑같은 기능을 하는 명령어가 존재한다.)


makefile 은 컴파일 시의 다양한 옵션을 정리해놓은 파일로 script 언어의 문법적 특성을 지닌다.

이렇게 make명령어를 수행하면 makefile의 옵션을 참조하여 컴파일 하므로,

매번 엄청나게 긴 옵션을 주거나 여러 파일을 컴파일 해야할 때 유용하다.


< makefile의 예 >

01 #CC: 변수 $(CC): CC의 값

02 CC = cl 

03 CCFLAGS= -Wall

04 # label: label사이에 반드시 enter

05 # all: 아무 것도 안쳤을때 수행

06 all: main msg

07 # (tab) 다음의 명령어를 수행

08 main:

09 $(CC) $(CCFLAGS) main.c > NULL

10 clean:

11 @rm -rf main.obj

12 @rm -rf main.exe

13 msg:

14 # @ : 명령어가 보이지 않는다. echo: 화면에 출력명령

15  @echo request 

16 # 다지우고 다시 컴파일

17 rebuild: clean all


01, 04, 05, 07, 14, 16 : # 로 시작하는 줄은 모두 주석처리된다.

02, 03 : 이와 같이 대입연산자가 가운데 있으면 좌측은 변수명이 되고 우측은 변수의 값이 된다.

06, 08, 10, 13, 17 : ":" 왼편에 오는 부분은 라벨(label)이라하여 make 명령어 뒤에 따라오는 
부분의 명령어를 정의해놓은 부분이다.
그리고 좌측이 실행되려면 콜론(:)의 우측이(혹은 Enter로 구분된 다음 label까지) 반드시 있어야 하므로, 좌측이 우측에 종속성(dependency)을 가진다고 한다.
06라인의 all:이라고 정의해놓은 부분은 그냥 make만 입력했을 때 자동으로 수행되는 부분이다.
make clean이라고 실행하면 빈 줄로 나눠진 11, 12라인이 수행되는 것이다.

09 : $()의 괄호안에 오는 부분은 02, 03라인에서 정의한 변수의 값이 대입된다는 의미로, 
$(CC)는 cl로 대입되고 $(CCFLAGS)는 -Wall로 대체되게 된다.
곧 09행은 cl -Wall main.c > NULL 이라는 행으로 대체된다.

11, 12, 15 : @로 시작되는 라인은 해당 라벨(label)의 명령어가 수행되었을 때 화면에 프린트 되는 명령어를
숨겨준다.