2012. 7. 13. 16:39

- Make 개요

-목적
프로그램의 관리
스크립트 형태의 유틸리티로서 프로그램 개발에 이용
명령어를 이용하여 작업하는 환경에 이용 가능
자체적으로 컴파일이 필요한 파일을 자동으로 판단 / 컴파일 실행

- 필요성
많은 파일들의 컴파일시 매번 동일한 작업을 수행하지 않아도 된다.
문서화를 통해 작업을 잊어 버리는 경우가 없다.

- Make 내부 구조

variable = ...........

target : dependency

--tab----- commmand ....

variable : Make 운용에 필요한 변수 선언
target : 라벨과 같은 역할
dependency : 필요 target들의 의존관계
command : 명령어들의 집합
주의 사항
탭 키를 이용하여 기입

- Make 실행

파일명이 Makefile인 경우
make
파일명이 tempmake인 경우
make –f tempmake
특정 라벨 실행
make label
옵션
h: 도움말
v: 버전
p: 내부적으로 세팅된 값을 화면에 출력
k: 에러 무시
d: 작업한 내용과 정보를 모두 출력
t: 파일 생성 날짜를 현재 시간으로 변경

- 첫 번째 예제

컴파일할 프로그램
common.h
main.c  subA.c  subB.c  subAa.c

Makefile 생성
all :
                gcc –o testmain main subA.c subB.c subAa.c

실행
Make

- Makefile 확장

all : main.o subA.o subB.o
                cc –o testmain main.o subA.o subB.o
main.o : common.h main.c
                gcc -c main.c
subA.o : common.h subA.c
                gcc -c subA.c subAa.c
subB.o : common.h subB.c
                gcc -c subB.c
clean :
                rm main.o subA.o subB.o
                rm testmain

- 매크로 사용

OBJS = main.o subA.o subB.o
CFLAGE = -c –O –g
TARGET = testmain
all : $(OBJS)
                gcc -o $(TARGET) $(OBJS)
.c.o :
                gcc $(CFLAGE) $<
clean :
                rm –f $(OBJS)
                rm –f $(TARGET)


참고
${ } $( ) $... 모두 같은 표현
내부 매크로 make –p 를 이용하여 확인 가능
$< : TRAGET보다 이후에 변경된 파일 컴파일
$@ : 확장자를 포함한 현재 target 파일 이름
$* : 확장자를 제거한 target 파일 이름


- 매크로 사용
all : main.o subA.o subB.o
                cc –o testmain main.o subD.o subB.o
main.o : common.h main.c
                gcc -c $*.c
subD.o : common.h subA.c
                gcc –o $@ -c subA.c subAa.c
subB.o : common.h subB.c
                gcc -c subB.c
clean :
                rm main.o subA.o subB.o
                rm testmain
Clean을 맨 앞에 두면
make 만 실행 시 clean이 실행된다

- 매크로 치환
문자열 치환
SRCS=main.c subA.c subB.c subAa.c
OBJS= $ (SRCS:.c=.o)
OBJS = main.o subA.o subB.o subAa.o 로 변형된다.

파일들의 의존관계 자동 작성
gccmakedep로 생성

- 매크로 치환
Makefile 변경
OBJS = main.o subA.o subAa.o subB.o
SRCS = $(OBJS:.o=.c)
……
dep :
                gccmakedep $(SRCS)

검사
make dep
vi Makefile


- 다중 타겟
목적
여래개의 실행 파일을 만들어야 하는 경우 사용
예제
OBJSA = main.o subA.o
OBJSB = main.o subB.o
all : test1 test2
test1 : $(OBJSA)
                   gcc –o $@ $(OBJSA)
test2 : $(OBJSB)
                   gcc –o $@ $(OBJSB)


- Make 순환
목적
여러 디렉토리 내의 Makefile을 실행
형식        
형식 1) cd subdir; $(MAKE)
형식 2) $(MAKE) –C subdir
예제
all : Database Test
Database:
                   @echo database compile
                   cd db; $(MAKE)
Test :
        cd test; $(MAKE)  

@은 해당 라인이 화면에
출력되는 것을 방지한다.
Database compile만 출력된다.
@이 없다면
Echo database compile
Database compile
이 출력된다.
다른 명령에도 사용 가능

Posted by 몰라욧