[Unix Introduction] 5-2. Automatic Compilation with Make

전민수·2023년 4월 18일
0

Unix Introduction

목록 보기
7/7

1. make

  • 소프트웨어 빌드 시스템을 자동화하는 command
    • 프로그래밍에 있어서 building process는 많은 시간을 소요하기 때문에, 이를 자동화함.
  • 빌드 과정이 정의된 Makefile 내의 명령어를 실행함.

Recompilation Management

  • 'Dependency dag(directed, acyclic graph) : 불필요한 recompilation을 피하고자 작업이나 일련의 작업들 간의 종속성을 시각적으로 표현한 그래프.
    • 노드(node)와 엣지(edge)로 이루어져 있으며, 노드는 작업을 나타내고 엣지는 작업 간의 종속성을 나타낸다.
    • 작업들 간의 종속성을 시각적으로 파악할 수 있게 해주므로, 복잡한 작업 흐름에서 오류를 발견하거나 최적화할 부분을 찾는 데 도움이 된다.

Operation

  • Makefile에 명령어와 이들 명령어 간의 종속성을 정의
  • make로 Makefile을 동작
  • 종속성 관계를 기반으로 빌드 과정을 자동화

2. Make Syntax

$ make -f <makefileName> target
  • Default Input (option 생략 시 input)
    • -f 생략 시, = Makefile
    • target 생략 시, target = file 내 첫번째 target
  • target exection
    • source list의 각 source files을 확인함.
      • 각각의 source file이 없으면 error
        - source file이 Makefile의 target이면, 재귀적으로 그것을 실행함. (의존성을 차례로 해결하며 실행한다는 의미)

3. Makefile Rule

target : dependecies
(\t)		command1
(\t)		command2
  • target : 프로그램에 의해 생성되는 파일의 이름
  • dependencies(prerequisite) : target을 생성하기 위해 input으로 사용되는 file
  • command(recipe) : 실행되는 명령어
  • ex)
  linecount : foo.c
  (\t)		wc -l foo.c > linecount

Example1

  • make command 활용
  /* makefile */
  main: main.o sum.o
  		gcc -o main main.o sum.o
  main.o: main.c
  		gcc -c main.c
  sum.o: sum.c
  		gcc -c sum.c
  $ make
  • make command 미활용 동일동작
  $ gcc -o main main.o sum.o
  $ gcc -c main.c
  $ gcc -c sum.c

4. make Variable(=macros)

  • makefile 내부에서 variable(변수)을 정의할 수 있다.
  • 모든 variable은 type이 없는 문자열이다.
  • variable name은 case-sensitive하며, :, #, =, 공백 을 포함할 수 없다.
  • 장점 : 유지보수가 용이함.

Example2

Example1과 같은 기능.

  OBJS = sum.o main.o	//OBJS라는 Variable을 "sum.o", "main.o"라는 문자열 리스트로 정의함
  all : main
  sum.o : sum.c
  		gcc -c sum.c
  main.o: main.c
  		gcc -c main.c
  main: $(OBJS)		//OBJS의 값들을 포맷팅함. ${OBJS}도 가능.
  		gcc -o main $(OBJS)	// 단, $(OBJS)를 추천.

5. Special variables

  • Makefile 내부에 미리 정의된 특수한 변수들이 있음.

    $@ : 현재 target의 파일명을 나타냄.
    $< : 현재 target의 첫번째 dependency 파일명을 나타냄.
    $^ : 현재 target의 모든 dependency 파일명을 나타냄.
    $? : 현재 target보다 최신의 dependency 파일명을 나타냄.
    $* : 현재 target의 파일명에서 확장자를 제외한 부분을 나타냄.
    $% : archive member의 이름을 나타냄. 라이브러리 파일 내부의 특정 오브젝트 파일을 참조할 때 사용됨.

6. Suffix Rules (확장자 규칙)

  • 1) Special variables을 이용함.
  • 2) 파일명들을 %로 대체.
    • main.o: main.c == %.o: %.c

Example3

/* makefile */
       
CFLAGS= -Wall -g 
OBJS = sum.o main.o
       
all : main
%.o: %.c
		gcc -c -o $@ $(CFLAGS) $< 
main: $(OBJS)
		gcc –o main $(OBJS)

7. Phony Targets

  • command script를 나타내기 위해 이름만 있는 target
  • all, clean 등

Example4

CC=gcc
CFLAGS = -Wall –g -c 
INCLUDE = -I.
LIBS = -L. -lm
  
OBJS = sum.o main.o 
all : main		//phony target
%.o: %.c
		$(CC) $(INCLUDE) $(CFLAGS) $<
main: $(OBJS)
		$(CC) –o main $(OBJS) $(LIBS) 
clean:			//phony target
		rm –f main $(OBJS)
  
profile
Learning Mate

0개의 댓글