[제8장] 개발 도구들

정보 | 2007/06/25 19:04

=================================================================
  * 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_

Trackback Address :: http://badnom.com/trackback/290 관련글 쓰기
Name
Password
Homepage
Secret
< PREV |  1  |  ...  787  |  788  |  789  |  790  |  791  |  792  |  793  |  794  |  795  |  ...  1016  |  NEXT >