2013년 11월 4일 월요일

Oracle Pre Compiler의 make파일 이해와 적용

Oracle Pre Compiler의 make파일 이해와 적용


1. 왜 make를 사용하는가?
대규모의 프로그램을 작성하는 경우에는 프로그램의 크기가 커지므로 원시 프로그램
화일을 여러 개로 분할하는 것이 바람직하다.
예를 들어, 어떤 프로그램이 다음과 같이 세 개의 화일로 분할되어 있다고 하자.
Myhead.h main.c main.o
myprog
print.c print.o
(1) myhead.h또는 main.c를 수정하는 경우에는 main.c를 재컴파일하고,
print.o와 링크한다. 물론 print.c의 재컴파일은 필요없다.
(2) print.c를 수정하는 경우에는 print.c의 재컴파일을 하고 main.o와
링크한다.
이 예에는 세개의 화일뿐이므로 수정, 재컴파일 및 링크의 관계가 (1),(2)로
간단하지만 원시 화일의 수가 늘면 포함(include)관계가 복잡해지며, 원시
화일의 수정시 화일과 재컴파일 및 링크가 복잡해진다.

Unix에서는 이 재컴파일 및 링크를 자동화하기 위한 도구로서 make명령어가
준비 되어있다.

2. proc.mk가 어떻게 작용하는가?
make파일을 이해하기 위해서는 우선 make파일이 어떻게 동작하는가를 이해할 필요가 있다.
make파일은 일반적으로 두가지의 entry-target과 macro정의로 이루어 진다.
: ...


...

 각 라인앞은 space가 아니라 TAB으로 구성된다.
 이 entry는 ... 으로부터 을 만든다는 것을 의미하고,
그렇게 하기위해 make가 에서 까지를 수행한다는 것을 의미한다.
Example1>
my_prog.c: my_prog.pc
proc iname=my_prog.pc ireclen=132 oreclen=132
 my_prog.pc로부터 proc iname=my_prog.pc ...을 수행해서, my_prog.c를 생성한다는 뜻
my_prog.o: my_prog.pc
proc iname=my_proc.pc ireclen=132 oreclen=132
cc -c my_prog.c
 my_proc.pc로부터 proc iname=my_proc.pc ...과 cc -c my_prog.c를 수행해서, my_prog.o를
생성한다는 뜻



특정한 file명에 의존하지 않는 몇가지 target format이 있다.
예를 들어 다음의 target은 모든 .pc파일로부터 object file을 생성한다.
.SUFFIXES: .pc .c .o
.pc.o:
proc iname=$*.pc ireclen=132 oreclen=132
cc -c $*.c
 SUFFIXES rule은 make에게 어떠한 접미사(suffixes)들을 찾아야 하는지를 알려준다.
따라서 .pc.o는 .pc파일로부터 .o파일을 어떻게 생성해 내는지를 알려준다.
$*는 make를 실행시 파일명으로 대체된다.
 위의 예를 파일로 만들어(example.mk) 실행시키면, 다음과 같다.
$ make -f example.mk my_prog.o
proc iname=my_prog.pc irclen=132 oreclen=132
Pro*C: Release 1.5.10.1.0 - Production on Mon Sep 19 15:53:22 19997
Copyright © Oracle Corporation 1979, 1992. All rights reserved.

Precompiling my_prog.pc
cc -c my_prog.c
$
 OS명령어 라인상에서 my_prog.o를 input으로 주고 있는것을 주목해라.
이는 우리가 target rule을 .pc.o로 주었기 때문이다.
( my_prog.o를 생성하려고 하기때문.)
만약 우리가 target rule을 .pc로 주었다면 OS명령어 라인상에서 .o를 붙이지
않아도 되었을 것이다.

또 다른 make파일의 entry중 macrotext가 있다.
MACRonAME=macrotext
( macrotext를 MACRONAME으로 선언)
make가 실행시 macrotext로 대체된다. 사용시에는 괄호()를 붙여 사용한다.
PROFLAGS=ireclen=132 oreclen=132
my_prog.c: my_prog.pc
proc iname=my_prog.pc $(PROFLAGS)
 메크로를 여러번 선언할수 있는데, 이경우 최근에 선언된 메크로가 사용된다.3. percompile/compile옵션 변경과 user library추가를 위해
어떻게 proc.mk를 수정해야 하는가?
.pc:
-$(PROC) iname=$*.pc $(PROFLAGS)
@$(ECHO) $(CC) $(CFLAGS) $(LDFLAGS) -o $* $*.c $(PROLDLIBS)
.c:
@$(ECHO) $(CC) $(CFLAGS) $(LDFLAGS) -o $* $*.c $(PROLDLIBS)
위의 두가지 rule은 make로 하여금, 어떻게 pecompile과 compile을 해야 하는지를 알려준다.
(처음 줄은 precompile이고, 두번째 줄은 compile을 지시)

만약 precompile옵션을 변경하기를 원한다면, PROFLAGS메크로를 수정하라.
PROFLAGS의 기본값은 PROFLAGS=ireclen=132 oreclen=132 select_error=no 이다.
Maxopencursors=20을 추가하고 싶다면,
PROFLAGS=ireclen=132 oreclen=132 select_error=no maxopencursors=20
SQLCHECK메크로를 추가하고 싶다면,
PROFLAGS=ireclen=132 oreclen=132 select_error=no maxopencursors=20 $(SQLCHECK)

마찬가지로 compile옵션을 수정하려면, CFLAGS를 link옵션을 수정하려면, LDFLAGS를 수정한다.
추가로 USER의 LIBRARY를 추가하려면 PROLDLIBS를 수정하면 된다.

EXAMPLE>
PROLDLIBS=$(LIBSQL) $(TTLIBS)에 USER LIBRARY를 추가하려면

MYLIBS=my_lib1.o my_lib2.o
PROLDLIBS=$(LIBSQL) $(TTLIBS) $(MYLIBS)

4. 두개 이상의 source파일이 존재하는 경우에 proc.mk를 어떻게 수정해야 하는가?
대부분의 복잡한 프로그램에서는 하나의 모듈로 구성되어 있는 sample프로그램과 달리 여러개의
모듈을 포함하고 있다.
아래의 예에서는 몇개의 C함수만을 가지고 있는 모듈과 .c로된 모듈 그리고, sql을 가지고 있는
확장자 .pc가 있다. 이러한 상황에서 어떻게 compile을 하고, 어떻게 link를 해야하는가를
앞으로 설명할 것이다.
File Functions Contained in the file Functions Called by this file
main.c main db_connect, print_names, db_disconnect
connect.pc db_connect, db_disconnect, sqlerror
print_names.pc print_names
main.h db_connect, db_disconnect, print_names, sqlerror
Pro*C 2.0에서는 이러한 것들을 함께 컴파일하기 위하여 EXE와 OBJS라는 메크로를
사용한다. make파일의 첫번째 실행 target은 다음과 같다.
Build: $(OBJS)
$(CC) $(LDFLAGS) -o $(EXE) $(OBJS) $(PROLDLIBS)

따라서 EXE메크로와 OBJS란 메크로를 선언해주든지, OS명령라인에서 써주어야 한다.

< 명령어 라인에서의 사용예>
Make -f proc.mk EXE=main OBJS=”connect.o print_names.o main.o”
(목록이 2개 이상일때는 반드시 “”를 해주어야 한다.)


OBJS=main.o print_names.o connect.o
main: $(OBJS)
@$(ECHO) $(CC) $(CFLAGS) -o main $(OBJS) $(PROLDLIBS)
main.o: main.c main.h
@$(ECHO) $(CC) $(CFLAGS) -c main.c
connect.o: connect.pc main.h
@$(ECHO) $(PROC) iname=connect.pc $(PROFLAGS)
@$(ECHO) $(CC) $(CFLAGS) -c connect.c
print_names.o: print_names.pc main.h
@$(ECHO) $(PROC) iname=print_names.pc $(PROFLAGS)
@$(ECHO) $(CC) $(CFLAGS) -c print_names.c

make파일 작성후 make -f proc.mk main이라고 입력

댓글 없음:

댓글 쓰기