본문 바로가기
{Programing}/Server

(리눅스) - make 관련

by 탱타로케이 2017. 10. 9.

make : 파일 관리 유틸리티

파일간의 종속관계를 파악해 makefile에 적힌 내용대로 컴파일러에 명령하여, shell 명령을 순차적으로 실행한다.



makefile을 통해 make 명령을 사용하는 이유


1. 파일에 대한 반복적 명령을 자동화.

2. 프로그램의 종속구조를 파악하기 쉽게 해주며 관리가 용이해짐.

3. 단순 반복작업의 재작성을 최소화한다.



기본적인 리눅스의 빌드방식.


1. gcc -c -o xxx.o xxx.c 명령어를 통해 컴파일해 object파일로 만든다.

2. gcc -o app.out xxx.o yyy.o 명령어를 통해 묶을 object파일을 링크해 실행파일(.out)으로 만든다.



Makefile이 제공하는 강력한 기능 중 하나인 Incremental build


반복적인 빌드 과정에서 변경된 소스코드에 의존성(Dependency)이 있는 대상들만 추려서 다시 빌드하는 기능입니다. 예를 들어, 위의 빌드 예제에서 main.c의 한 줄만 바꾸고 다시 빌드를 할 때, main.o 컴파일(gcc -c -o main.o main.c)과 app.out링크(gcc -o app.out main.o foo.o bar.o)만 수행하는 경우



Makefile 작성법.


bash shell 스크립트와 문법이 비슷.

빌드대상(target)이름으로 된 label별로 구분된 shell 스크립트.

필요한 target의 명령들만 실행하는 것.


빌드 규칙 블럭


<Target> : <Dependencies>

<Recipe>

Target : 빌드 대상의 이름. 최종 생성 파일명.

Dependencies : 빌드 대상에게 필요한 target이나 파일 목록.(헤더파일,소스파일,오브젝트파일등)

Recipe : 빌드 대상을 생성하는 명령문. 여러줄이 가능하고, 각줄 시작에 필수적으로 Tab의 공백이 필요함.

ex)

//실행파일 에 대한 내용.

app.out : main.o aaa.o bbb.o

gcc -o app.out main.o aaa.o bbb.o


//오브젝트 파일 에 대한 내용.

main.o : aaa.h bbb.h main.c

gcc -c -o main.o main.c



makefile의 디렉토리 위치에서 


make 명령을 치면 해당 makefile의 시작부터 끝까지 전부 실행되며


make main.o 같이 특정 Target에 대한 명령만 실행할수도 있다.



내장 규칙

자주 사용되는 빌드 규칙들은 내장되어 작동됨.

.c 파일을 컴파일해 .o 파일로 만들어주는 것 같은것.


하지만, 무조건 생략하게되면 의존도 파악을 하지 못해 빌드 누락이 발생할수 있으므로

각 Target의 Dependencies 까지는 명시해주도록 하자.

 



변수 사용하기


변수에 대한 사용법은 bash shell과 같다.


ex)


CC=gcc

CFLAGS=-g -Wall

OBJS=main.o foo.o bar.o

TARGET=app.out

 

$(TARGET): $(OBJS)

$(CC) -o $@ $(OBJS)

 

main.o: foo.h bar.h main.c

foo.o: foo.h foo.c

bar.o: bar.h bar.c


  • CC: 컴파일러
  • CFLAGS: 컴파일 옵션
  • OBJS: 중간 산물 Object 파일 목록
  • TARGET: 빌드 대상(실행 파일) 이름

그 외에 자주 사용되는 내장 변수는 다음과 같습니다.

  • LDFLAGS: 링커 옵션
  • LDLIBS: 링크 라이브러리


자동 변수

  • $@: 현재 Target 이름
  • $^: 현재 Target이 의존하는 대상들의 전체 목록
  • $?: 현재 Target이 의존하는 대상들 중 변경된 것들의 목록

자동변수 목록에 대한 문서

http://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html



추가.


clean 명령어.

빌드 결과물과 중간 부산물(.o)들을 모두 삭제하고 재빌드할수 있게 도와주는 명려어.


빌드가 꼬였을때 사용한다.



makefile 기본 형식.


CC=<컴파일러>

CFLAGS=<컴파일 옵션>

LDFLAGS=<링크 옵션>

LDLIBS=<링크 라이브러리 목록>

OBJS=<Object 파일 목록>

TARGET=<빌드 대상 이름>

 

all: $(TARGET)

 

clean:

rm -f *.o

rm -f $(TARGET)

 

$(TARGET): $(OBJS)

$(CC) -o $@ $(OBJS)



참고한 페이지

https://tuwlab.com/ece/27193

http://bowbowbow.tistory.com/12

'{Programing} > Server' 카테고리의 다른 글

mysql 문제 발생.  (0) 2017.11.06
리눅스 쉘 스크립트 예제 분석  (0) 2017.10.23
리눅스 쉘 스크립트  (0) 2017.10.23
1. TCP 기본  (0) 2017.03.02
정리계획  (0) 2017.02.18

댓글