[제8장] 개발 도구들
=================================================================
* Subject : [제8장] 개발 도구들
* Writer: w0rm9 (research.hackerschool.org)
* Date: 2004/02/04
=================================================================
/* 스터디 시간에 했던 부분만 정리했습니다.
* make 밖에 안했군요.-_-;
*/
0x01. make 명령과 메이크파일
■ 메이크 파일의 형식
의존성은 생성되는 파일인 대상과 이것이 의존하는 소스 파일을 포함한다.
규칙은 의존하는 파일로부터 대상 파일을 생성하는 방법을 설명한다. 대상은 일반적으로 실행파일이다.
□ make의 옵션과 파라미터
-k 에러가 처음 발생할 때 즉시 중단하지 않고 make가 계속진행
-n make에게 실제로 동작을 수행하지 않고 가상적으로 동작 결과를 출력하도록 지시
-f make에게 메이크파일로 사용할 파일을 알려준다.
테스트)
[w0rm9@work TOOL]$ ls -al
합계 24
drwxrwxr-x 2 w0rm9 w0rm9 4096 2월 4 12:40 .
drwxrwxr-x 13 w0rm9 w0rm9 4096 2월 4 12:23 ..
-rw-rw-r-- 1 w0rm9 w0rm9 65 12월 11 17:20 2.c
-rw-rw-r-- 1 w0rm9 w0rm9 67 12월 11 17:20 3.c
-rw-rw-r-- 1 w0rm9 w0rm9 193 12월 11 17:20 main.c
-rw-rw-r-- 1 w0rm9 w0rm9 146 12월 11 17:20 mkfile1
[w0rm9@work TOOL]$ cat mkfile1
myapp: main.o 2.o 3.o
gcc -o myapp main.o 2.o 3.o
main.o: main.c a.h
gcc -c main.c
2.o: 2.c a.h b.h
gcc -c 2.c
3.o: 3.c b.h c.h
gcc -c 3.c
[w0rm9@work TOOL]$ make -f mkfile1
make: *** No rule to make target `a.h', needed by `main.o'. 멈춤. // a.h에 의존
[w0rm9@work TOOL]$ touch a.h b.h c.h
[w0rm9@work TOOL]$ make -f mkfile1
gcc -c main.c
gcc -c 2.c
gcc -c 3.c
gcc -o myapp main.o 2.o 3.o
[w0rm9@work TOOL]$ ls -al
합계 48
drwxrwxr-x 2 w0rm9 w0rm9 4096 2월 4 12:40 .
drwxrwxr-x 13 w0rm9 w0rm9 4096 2월 4 12:23 ..
-rw-rw-r-- 1 w0rm9 w0rm9 65 12월 11 17:20 2.c
-rw-rw-r-- 1 w0rm9 w0rm9 614 2월 4 12:40 2.o
-rw-rw-r-- 1 w0rm9 w0rm9 67 12월 11 17:20 3.c
-rw-rw-r-- 1 w0rm9 w0rm9 616 2월 4 12:40 3.o
-rw-rw-r-- 1 w0rm9 w0rm9 0 2월 4 12:40 a.h
-rw-rw-r-- 1 w0rm9 w0rm9 0 2월 4 12:40 b.h
-rw-rw-r-- 1 w0rm9 w0rm9 0 2월 4 12:40 c.h
-rw-rw-r-- 1 w0rm9 w0rm9 193 12월 11 17:20 main.c
-rw-rw-r-- 1 w0rm9 w0rm9 788 2월 4 12:40 main.o
-rw-rw-r-- 1 w0rm9 w0rm9 146 12월 11 17:20 mkfile1
-rwxrwxr-x 1 w0rm9 w0rm9 11735 2월 4 12:40 myapp
[w0rm9@work TOOL]$ rm 2.o
[w0rm9@work TOOL]$ make -f mkfile1 // 변경된 파일이 2.o 뿐이므로
gcc -c 2.c
gcc -o myapp main.o 2.o 3.o
[w0rm9@work TOOL]$
■ 메이크파일의 주석문
사용법)
주석문은 #로 시작하고, 한 줄의 끝까지 계속한다.
테스트)
[w0rm9@work TOOL]$ cat mkfile1
myapp: main.o 2.o 3.o
gcc -o myapp main.o 2.o 3.o
main.o: main.c a.h
gcc -c main.c
# 이것은 주석문이닷...!!
2.o: 2.c a.h b.h
gcc -c 2.c
3.o: 3.c b.h c.h
gcc -c 3.c
[w0rm9@work TOOL]$ make -f mkfile1
gcc -c main.c
gcc -c 2.c
gcc -c 3.c
gcc -o myapp main.o 2.o 3.o
■ 메이크파일의 매크로
사용법)
C 컴파일러가 #define을 통해서 수행하는 것과 비슷하다.
□ 내부 매크로
$? 현재 대상보다 최근에 변경된 필수 조건의 목록
$@ 현재 대상의 이름
$< 현재 필수 조건의 이름
$* 확장자를 제외하고 현재 필수 조건의 이름
테스트)
[w0rm9@work TOOL]$ cat mkfile3
all: myapp
# 컴파일러 이름
CC = gcc
# 설치 위치
INSTDIR = /tmp
# 헤더 파일의 위치
INCLUDE = .
# 개발용 옵션
CFLAGS = -g -Wall -ansi
# 출시용 옵션
# CFLAGS = -O -Wall -ansi
myapp: main.o 2.o 3.o
$(CC) -o myapp main.o 2.o 3.o
main.o: main.c a.h
$(CC) -I$(INCLUDE) $(CFLAGS) -c main.c
2.o: 2.c a.h b.h
$(CC) -I$(INCLUDE) $(CFLAGS) -c 2.c
3.o: 3.c b.h c.h
$(CC) -I$(INCLUDE) $(CFLAGS) -c 3.c
clean:
-rm main.o 2.o 3.o
install: myapp
@if [ -d $(INSTDIR) ]; \
then \
cp myapp $(INSTDIR);\
chmod a+x $(INSTDIR)/myapp;\
chmod og-w $(INSTDIR)/myapp;\
echo "Installed in $(INSTDIR)";\
else \
echo "Sorry, $(INSTDIR) does not exist";\
fi
[w0rm9@work TOOL]$ make -f mkfile3
gcc -I. -g -Wall -ansi -c main.c
gcc -I. -g -Wall -ansi -c 2.c
gcc -I. -g -Wall -ansi -c 3.c
gcc -o myapp main.o 2.o 3.o
[w0rm9@work TOOL]$ make -f mkfile3
make: Nothing to be done for `all'.
[w0rm9@work TOOL]$ rm myapp
[w0rm9@work TOOL]$ make -f mkfile3 install
gcc -o myapp main.o 2.o 3.o
Installed in /tmp
[w0rm9@work TOOL]$ make -f mkfile3 clean
rm main.o 2.o 3.o
■ 내장규칙
make -p 옵션을 통해 내장 규칙을 알 수 있다.
테스트)
[w0rm9@work TOOL]$ make foo
cc foo.c -o foo // 내장규칙에 의해 cc 컴파일러를 사용
[w0rm9@work TOOL]$ make CC=gcc CFLAGS="-Wall -g" foo
gcc -Wall -g foo.c -o foo // 내장규칙 대신 명령행에 옵션을 주고 컴파일
■ make로 라이브러리 관리하기
make 명령은 라이브러리를 관리하기 위한 내장 규칙을 가진다.
.c.a:
$(CC) -c $(CFLAGS) $<
$(AR) $(ARFLAGS) $@ $*.o
테스트)
[w0rm9@work TOOL]$ cat mkfile6
all: myapp
# 컴파일러 이름
CC = gcc
# 설치 위치
INSTDIR = /tmp
# 헤더 파일의 위치
INCLUDE = .
# 개발용 옵션
CFLAGS = -g -Wall -ansi
# 출시용 옵션
# CFLAGS = -O -Wall -ansi
# 지역 라이브러리
MYLIB = mylib.a
myapp: main.o $(MYLIB)
$(CC) -o myapp main.o $(MYLIB)
$(MYLIB): $(MYLIB)(2.o) $(MYLIB)(3.o)
main.o: main.c a.h
2.o: 2.c a.h b.h
3.o: 3.c b.h c.h
clean:
-rm main.o 2.o 3.o $(MYLIB)
install: myapp
@if [ -d $(INSTDIR) ]; \
then \
cp myapp $(INSTDIR);\
chmod a+x $(INSTDIR)/myapp;\
chmod og-w $(INSTDIR)/myapp;\
echo "Installed in $(INSTDIR)";\
else \
echo "Sorry, $(INSTDIR) does not exist";\
fi
[w0rm9@work TOOL]$ make -f mkfile6
gcc -g -Wall -ansi -c -o main.o main.c
gcc -g -Wall -ansi -c -o 2.o 2.c
ar rv mylib.a 2.o
a - 2.o
gcc -g -Wall -ansi -c -o 3.o 3.c
ar rv mylib.a 3.o
a - 3.o
gcc -o myapp main.o mylib.a
[w0rm9@work TOOL]$ touch c.h
[w0rm9@work TOOL]$ make -f mkfile6
gcc -g -Wall -ansi -c -o 3.o 3.c
ar rv mylib.a 3.o
r - 3.o
gcc -o myapp main.o mylib.a
[w0rm9@work TOOL]$
CVS, 등등 생략~
_eof_
