Make란?
Unix/Linux 시스템에 포함되어 있는 소프트웨어 빌드 자동화 도구
makefile 파일을 참조하여 컴파일러에 명령을 전달하고, makefile에 기술된 shell명령어들을 조건에 맞게 실행한다.
사용법
make [옵션] [타겟]
Makefile이란?
make 명령어가 수행할 명령들을 기술한 파일
기본 구조
하나의 빌드대상 단위는 아래와같이 작성한다.
<Target> : <Dependencies>
(tab) <Command>
- Target : 어떤 것을 make 할지 전달
- dependencies : 주어진 타겟을 make 할 때(빌드 진행 시) 사용될 파일들의 목록들
- Commend : make 할 때 실행할 명령어들의 나열
시작은 들여쓰기(tab)로 시작한다.
'\' 문자를 이용해서 여러 라인으로 나타낼 수 있다.
*** 가장 많이 쓰이는 Makefile 형태 ***
CC = <컴파일러> - gcc, g++
CFLAGS = <컴파일 옵션>
LDFLAGS = <링크 옵션>
LDLIBS =<링크 라이브러리 목록>
OBJS = <Object 파일 목록> *.o
TARGET = <빌드 대상 이름>
all : $(TARGET)
clean :
rm -f *.o
rm -f $(TARGET)
$(TARGET) : $(OBJS)
$(CC) -o $@ $^
매크로
프로그램을 작성할 때 변수를 지정하는 것처럼 하면 된다. 그리고, 매크로를 사용하기 위해서는 $(..)을 이용하면 된다.
내부 매크로
$* <- 확장자가 없는 현재의 목표 파일(Target)
$@ <- 현재의 목표 파일(Target)
$< <- 현재의 목표 파일(Target)보다 더 최근에 갱신된 파일 이름
$? <- 현재의 목표 파일(Target)보다 더 최근에 갱신된 파일이름
Predefined Macro
ASFLAGS = <- as 명령어의 옵션 세팅
AS = as
CFLAGS = <- gcc 의 옵션 세팅
CC = cc (= gcc)
CPPFLAGS = <- g++ 의 옵션
CXX = g++
LDLFAGS = <- ld 의 옵션 세팅
LD = ld
LFLAGS = <- lex 의 옵션 세팅
LEX = lex
YFLAGS = <- yacc 의 옵션 세팅
YACC = yacc
MAKE_COMMAND = make
확장자 규칙
파일의 확장자를 보고 그에 맞는 연산을 수행하는 규칙
.SUFFIXES 라고 하는 매크로 -> make 파일에게 처리할 파일들의 확장자를 등록
확장자 규칙 예제1
매크로의 사용에서 ${..}, $(..), $..를 모두 사용 가능
OBJS = main.o read.o write.o
test : $(OBJS) <- (1)
gcc -o test $(OBJS)
확장자 규칙 예제2
OBJECT = main.o read.o write.o
SRCS = main.c read.c write.c
CC = gcc
CFLAGS = -g -c
TARGET = test
$(TARGET) : $(OBJECTS)
$(CC) -o $(TARGET) $(OBJECTS)
clean :
rm -rf $(OBJECTS) $(TARGET) core
main.o : main.h
read.o : read.c
write.c : write.c
확장자 규칙 예제3
OBJECT = main.o read.o write.o
SRCS = main.c read.c write.c
CC = gcc
CFLAGS = -g -c
INC = -l/home/raxis/include -> include path
TARGET = test
$(TARGET) : $(OBJECTS)
$(CC) -o $(TARGET) $(OBJECTS)
clean :
rm -rf $(OBJECTS) $(TARGET) core
main.o : main.h
read.o : read.c
write.c : write.c
확장자 규칙 예제4
.SUFFIXES : .c .o
OBJECTS = main.o read.o write.o
SRCS = main.c read.c write.c
CC = gcc
CFLAGS = -g -c
TARGET = test
$(TARGET) : $(OBJECTS)
$(CC) -o $(TARGET) $(OBJECTS)
clean :
rm -rf $(OBJECTS) $(TARGET) core
main.o : main.c
read.o : read.c
write.o: write.c
.SUFFIXES : .c .o라고 했기에 make 내부에서는 미리 정의된 .c를 컴파일해서 .o를 만들어 내는 루틴이 자동으로 동작
확장자 규칙 예제5
.SUFFIXES : .c .o
OBJECTS = main.o read.o write.o
SRCS = main.c read.c write.c
CC = gcc
CFLAGS = -g -c
INC = -I/home/raxis/include <- include 패스 추가
TARGET = test
$(TARGET) : $(OBJECTS)
$(CC) -o $(TARGET) $(OBJECTS)
.c.o : <- 우리가 확장자 규칙을 구현
$(CC) $(INC) $(CFLAGS) $<-
clean :
rm -rf $(OBJECTS) $(TARGET) core
main.o : io.h main.c
read.o : io.h read.c
write.o : io.h write.c
확장자 규칙
- AR = ar (Archive maintaining program)
- AS = as (Assembler)
- CC = cc (= gcc , C compiler)
- CXX = g++ (C++ compiler)
- CO = co (extracting file from RCS)
- CPP = $(CC) -E (C preprocessor)
- FC = f77 (Fortran compiler)
- LEX = lex (LEX processor)
- PC = pc (Pascal compiler)
- YACC = yacc (YACC processor)
- TEX = tex (TEX processor)
- TEXI2DVI = texi2dvi (Texiinfo file processor)
- WEAVE = weave (Web file processor)
- RM = rm -f (remove file)
- ARFLAGS = (ar achiver의 플래그) *
- ASFLAGS = (as 어셈블러의 플래그)
- CFLAGS = (C 컴파일러의 플래그) *
- CXXFLAGS = (C++ 컴파일러의 플래그) *
- COFLAGS = (co 유틸리티의 플래그)
- CPPFLAGS = (C 전처리기의 플래그)
- FFLAGS = (Fortran 컴파일러의 플래그)
- LDFLAGS = (ld 링커의 플래그) *
- LFLAGS = (lex 의 플래그) *
- PFLAGS = (Pascal 컴파일러의 플래그)
- YFLAGS = (yacc 의 플래그) *
참조)
gcc 명령어 사용법
1) gcc 파일명(*.c) : 기본 설정 값으로 .out 파일이 생성
2) gcc -c 파일명(*.c) : 오브젝트 파일을 생성
3) gcc -c 오브젝트_파일명(*.o) 파일명(*.c)
gcc -o 실행파일명(*.out) 오브젝트_파일명(*.o)
4) gcc -o 실행파일 파일명(*.c)
출처 : GNU Make 강좌: 매크로(Macro) 와 확장자(Suffix) 규칙 (kldp.org)
'리눅스 > 기타' 카테고리의 다른 글
ifconfig 명령어 출력 창 (0) | 2024.08.01 |
---|