[리눅스] Make 및 Makefile
2022.07.11 - [운영체제/리눅스] - [리눅스] GCC 입문
2022.07.13 - [운영체제/리눅스] - [리눅스] GDB 디버거 _1
2022.07.24 - [운영체제/리눅스] - [리눅스] GDB디버거_2
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