본문 바로가기

임베디드 리눅스

make 는 무엇이며 왜 사용하는 것일까1

728x90
반응형

안녕하세요, WH 입니다.

make 에 대해 알아보는 글입니다.

 

바로 전 글에서 compile 과정에 대해서 설명했었는데요.

compile 과정은 여러개의 소스코드를 목적 파일을 만들고

해당 목적코드들을 링크하여 실행파일을 만든다고 설명했었습니다.

 

그런데 이런 생각을 해볼까요?

기능별로 코드를 짜다보니 소스코드 파일이 100개를 만들었다고 해봅시다.

힘들게 힘들게 하나하나 목적파일을 생성하고 링크해서 실행파일을 만들었어요.

그런데, 해당 파일에 문제가 생겨서 파일을 다시 컴파일을 해야한다고 가정해볼까요?

100개를...다시 ..목적파일 만들고.. 링크하려면.. ㅎㅎ

 

이런 문제를 해결하기 위해 make를 사용합니다.

 

 

make는 무엇일까요?

make

 파일 간의 종속 관계를 파악하여 makefile에 적힌 대로 컴파일러에 명령하여 쉘이 순차적으로 실행

 

 

makefile은 무엇일까요?

makefile

목적파일, 의존성, 명령어, 매크로 등을 활용하여 컴파일을 쉽게하기 위해 사용하는 make파일의 설정 파일

 

makefile의 구성

makefile 매크로 설명 ( make -p 로 확인 가능 )

매크로 명   용도 
 DEFS   Define 추가 시 사용
 CFLAGS  gcc의 옵션 추가 시 사용
 CC  컴파일러는 변경 시 사용
 CPPFLAGS  c++ 의 옵션 추가 시 사용
 CXX   c++ 의 컴파일러 선택 시 사용  
 LDFLAGS   ld 의 옵션 세팅

 

그래, 그럼 이제 make랑 makefile이 뭔지는 알겠는데, 어떻게 사용하는지가 궁금하시죠? 간단하게 만들어보겠습니다.

 

우리가 만드는 프로그램은 입출력으로 이루어졌다고 가정합시다. 즉 3개의 간단한 소스파일이 존재하는데, main.c, input.c, output.c 라는 3 개의 소스코드가 있고 io.h 를 공통으로 사용한다고 하겠습니다.

 

1. make를 활용하지 않은 컴파일 예시

$ gcc -c main.c

$ gcc -c input.c

$ gcc -c output.c

 

$ gcc -o program main.c input.c output.c 를 작성하면 컴파일이 완료됩니다.

 

이제부터는 같은 makefile이지만 다양한 방법의 makefile을 작성해보도록하겠습니다.

 

2-1. make 파일 활용 예시1

파일명 : makefile

내용

-------------------------------------------------------

 

program : main.c input.c output.c

gcc -o program main.o input.o output.o

 

main.o : io.h main.c

gcc -c main.c

input.o : io.h input.c

gcc -c input.c

output.o : io.h input.c

gcc -c ouput.c

 

-------------------------------------------------------

 

2-2 매크로를 활용한 예시2

-------------------------------------------------------

OBJECTS = main.o input.o output.o

CC = gcc

 

TARGET = program

 

$(TARGET) : $(OBJECTS)

    $(CC) -o $(TARGET) $(OBJECTS)

 

clean :

    rm -rf $(OBJECTS $(TARGET) core

 

main.o : io.h main.c

gcc -c main.c

input.o : io.h input.c

gcc -c input.c

output.o : io.h input.c

gcc -c ouput.c

 

-------------------------------------------------------

 

 

참고 내부 매크로

$* <- 확장자가 없는 현재의 목표 파일(Target)
$@ <- 현재의 목표 파일(Target)
$< <- 현재의 목표 파일(Target)보다 더 최근에 갱신된 파일 이름
$? <- 현재의 목표 파일(Target)보다 더 최근에 갱신된 파일이름

728x90
반응형