본문 바로가기
리눅스/기타

Makefile & Make 사용법 [1]

by [Akashic Records] 개발의선지자 2024. 7. 23.

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