운영체제/리눅스

[리눅스] Make 및 Makefile

Cloud_Park 2022. 7. 24. 17:23

2022.07.11 - [운영체제/리눅스] - [리눅스] GCC 입문

2022.07.13 - [운영체제/리눅스] - [리눅스] GDB 디버거 _1

2022.07.24 - [운영체제/리눅스] - [리눅스] GDB디버거_2

 

[리눅스] GDB디버거_2

2022.07.11 - [운영체제/리눅스] - [리눅스] GCC 입문 2022.07.13 - [운영체제/리눅스] - [리눅스] GDB 디버거 _1 [리눅스] GDB 디버거 _1 2022.07.11 - [운영체제/리눅스] - [리눅스] GCC 입문 2022.07.13 - [클..

base-on.tistory.com

 

make는 소프트웨어 개발을 위해 리눅스 운영체제에서 주로 사용되는 프로그램 빌드도구

여러 파일들끼리 의존성과 각 파일에 필요한 명령을 정의함으로써 프로그램을 컴파일할 수 있으며 최종 프로그램을 만들 수 있는 과정을 서술할 수 있는 표준적인 문법을 가지고 있다.]

 

설치

yum install make

make #해당 디렉터리에 make 파일실행
make -f  makefile 이 아닌 다른 파일 명 지정

 

makefile rule

target ... : prerequisites...
     resipe
	  ...
      ...

설명

target(대상)은 일반적으로 프로그램에 의해 생성되는 파일의 이름으로 실행파일 또는 object파일

prerequisites(전제 조건)은 target을 작성하기 위한 입력으로 사용되는 파일입니다.

recipe(레시피)는 수행하는 동작을 나타냅니다.

참고: 모든 recipe 줄의 시작부분은 탭 문자를 넣어야한다.

 

 

예제

edit라는 실행파일 8개의 object파일에 의존하고, 8개의 소스파일과 3개의 헤더파일에 의존하는 방식

clean 대상은 파일이 아니라 행동의 이름 전제 조건 없이 레시피 실행

일반적으로 컴파일 된 결과를 정리할때 사용하는 clean

 

 

makefile 예제

CFLAGS, LDFLAGS, TARGET, DBJS 등과 같은 매크로 지정

test_program : main.o config.o debug.o log.o

구문을 all : $(OBJS) 처럼 간단하게 표현가능

중복된 구문이 많이 없을 경우 편리하게 사용

#make

-target 없이을 경우 암묵적으로 all 실행

#make all

-명시적으로 all타켓 지정, 다른 타켓이 존재할 경우 make [target] 과같이 지정가능

#make clean

-clean 레이블 실행, 바이너리 및 오브젝트 파일 정리

매크로

변수와 같이 이름을 선언하고 내용 서술

$(매크로명)를 이용하여 작성한 매크로 사용

Makefile 내에 매크로를 활용하면 중복적으로 표현되는 구문을 방지하고 특정 파일이름 수정 시 모든 내용을 찾아서 수정할 필요가 없다.

주요 사전 정의 변수

CC : C 컴파일러 기본값 cc

ex)CFLAGS= -g -O2 -l ../includes

LDFLAGS: 컴파일러가 -L 과 같은 링커 ID를 호출 할 때 제공하는 추가 플래그이며,

라이브러리 ( ex. -lfoo)를 LDLIBS변수를 추가해야 한다.

ex) LDFLAGS—L.L(LIB_DIR)

LFLIB: 링커 ID를 호출 할 때 컴파일러에 제공되는 라이브러리 플래그 또는 이름입니다.

-L과 같은 비라이브러리 링커 플래그는 LDFLAGS변수에 있어야합니다.

ex) LDLIBS=-lpthread

 

 

주요 자동 변수

$@

-규칙 대상의 파일 이름

-대상이 여러 개인 패턴 규칙에서 규칙의 레시피가 실행된 대상의 이름

$<

-첫 번째 전제 조건이름

$?

-타켓보다 새로운 (변경된 파일) 모든 전제 조건의 이름

$^

-모든 전제 조건의 이름

$*

-타겟이름이 확장자로 끝나는 경우 , 확장자를 뺀 이름

-ex) 타겟이름이 “foo.c” 인 경우 $*는 foo로 설정

패턴규직

접시사 규칙은 구식방법

패턴 규칙이 더 일반적이고 명확하기 떄문에 접미사 규칙은 더 이상 사용하지 않는다.

이전 makefile과의 호환성을 위하여 GUN make에서 지원 ‘%.c”패턴은 ‘.c’로 끝나는 모든 파일 이름과 일치

‘s.%.c’패턴은 ‘s.’으로 시작하고 .c로 끝나는 파일과 일치

 

 

이전 접미사 규칙 방식

.c.o:
		$(CC) $(CFLAG) -s $<-o $@

패턴 규칙 방식 (예제 .c파일을 .o파일로 컴파일하는 규칙)

%.o:%.c
	$(CC) $(CFLAGS) -c $<-o$@

$

make_test.h

#ifndef__MAKE_TEST_H__
#define __MAKE_TEST_H__

#define MAX_NUM 5

#endif