2014년 1월 2일 목요일

(Pro*C)MAKE FILE의 구조[재직자무료교육/프로그래머교육/구로디지털IT교육,오라클/자바/닷넷/C#/iOS/안드로이드/아이폰교육]

(Pro*C)MAKE FILE의 구조[재직자무료교육/프로그래머교육/구로디지털IT교육,오라클/자바/닷넷/C#/iOS/안드로이드/아이폰교육]


(Pro*C)MAKE FILE의 구조
 

  BULLETIN CATEGORY
BULLETIN TOPIC : PRO*C   
: MAKE FILE의 구조

--------------------------------------------------------------------------------
make 는 makefile을 읽어 들여 source file을 자동적으로 처리하게 해 주는 unix command이다.   
1.PROC.MK 사용법    

PRO*C V1.6 이하에서의 사용법은 make -f proc.mk <program_name> 이다. 예를 들면 source file name이 my_prog.pc 라면 command는 다음과 같다.   

          $make -f proc.mk my_prog   

PRO*C V2.0이상에서는    

          $make -f proc.mk EXE=my_prog OBJS=my_prog.o    

으로 사용하여야 한다.   

2.PROC.MK 구조   

1)target entry    

make가 실행되면서 가장 먼저 하는 일은 해당되는 target entry를 찾는 것이다.   

<target>: <target1> <target2> ... <targetn>    

<command1>    

<command2>    

...    

<commandm>    

(각 command 앞은 반드시 TAB 으로 띄워져야 한다)   

이것은 <target1>부터 <targetn>까지를 거쳐 <target>을 만드는 방법으로 <command1>부터 <commandm>까지 수행해야 한다. 예를 들면   

my_prog.c: my_prog.pc    

proc iname=my_porg.pc ireclen=132 oreclen=132   

my_prog.c 를 만드는 방법을 가리키는 것으로 my_prog.pc가 current directory에 존재한다면 proc iname=my_prog.c를 수행한다. 즉 unix prompt상에서 make -f <makefile> my_prog.c 를 입력했을 때 적용되는 target rule이다. 게다가 target들은 서로 연결이 되어 있기 때문에    

my_prog.o: my_prog.c    

cc -c my_prog.c   

와 같은 target entry를 가진다면 my_prog.o를 만들기 위해 my_prog.pc로 부터 precompile과 compile작업을 할 것이다. 이 두 entry는 결국 다음과 같이 하나로 묶일 수 있다.   

My_prog.o: my_prog.pc    

proc iname=my_prog.pc ireclen=132 oreclen=132    

cc -c my_prog.c   

2)suffix rule    

suffix rule은 고정된 file name과 관계없이 특정 format에 해당되는 file의 make 방법에 대한 rule이다.    

.SUFFIXES: .pc .c .o    

.pc.o:    

proc iname=$*.pc ireclen=132 oreclen=132    

cc -c $*.c   

.SUFFIXES rule은    

DsTs:    

rule   

로써 Ts는 target의 suffix이고 Ds는 dependency file의 suffix이며 rule은 target을 만들기 위한 rule이다. 하나의 suffix만 있는 경우는 dependency file 을 지칭하는 것이다. 위의 예에서    

$make -f proc.mk my_prog.o   

라고 준다면 $* 는 현재 작업중인 file name으로 대체되므로 my_prog으로 바뀌며 my_prog.o 를 생성한다.    

3)macro 정의    

MACRONAME=macrotext    

이것은 macro MACRONAME이 macrotext로 정의 되어 있다는 의미이다. 따라서 이후에 나오는 $(MACRONAME)이나 ${MACRONAME}은 macrotext로 대체될 것이다. 예를 들면   

PROFLAGS=ireclen=132 oreclen=132    

my_prog.c: my_prog.pc    

proc iname=my_prog.pc $(PROFLAGS)    

는 $(PROFLAGS) 가 ireclen=132 oreclen=132 로 대체 된다. macro는 makefiles 내에서 한번 이상 정의되어 있을 수 있는데 이런 경우에는 마지막에 정의된 것이 사용된다.    

command line, make file 내, 환경 변수등에 중복 정의된 경우에는(priority)   

a)command line    

b)make file내의 macro 정의    

environment variable 
의 우선순위가 적용이 된다.   
4)make file의 수행 순서    

a)target entry를 찾는다 (make command의 마지막에 오는 argument로 지정) 만약 해당되는 target entry가 없다면 가장 윗부분에 정의된 target entry를 찾는다.   

b)suffix rule에 따라 file을 찾는다.   

c)file이 여러개가 있는 경우 가장 최근 것을 우선으로 하여 suffix rule의 command대로 수행한다.    

3.COMPILE, PRECOMPILE OPTION변경과 LIBRARY 추가 방법   

.pc:    

$(PROC) iname=$*.pc $(PROFLAGS)    

@$(ECHO) $(CC) $(CFLAGS) $(LDFLAGS) -o $* $*.c    

$(PROLDLIBS)    

.c:    

@$(ECHO) $(CC) $(CFLAGS) $(LDFLAGS) -o $* $*.c    

$(PROLDLIBS)   

만약 precompile option을 변경하고자 한다면 PROFLAGS를 수정하고 Compile option을 변경하려면 CFLAGS를, link option을 변경하려면 LDFLAGS를 변경한다. 그리고 link에 library를 추가하려면 PROLDLIBS에 추가할 수 있다.   

PROLDLIBS=$(LIBSQL) $(TTLIBS)    

인 경우, LIBSQL과 TTLIBS 는 다른 macro로 이미 정의되어 있으므로 뒷부분에 추가하면 된다.   

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

추가할 library를 oracle library앞이나 뒤에 두면 더 좋은 performance를 가져올 수 있으나 LIBSQL과 TTLIBS사이에 둔다면 undefined symbols error를 발생시킬 수 있다.   

4.여러 개의 SOURCE MODULE을 가진 PROGRAM을 위한 MAKE 방법    

source module : main.c connect.pc print_names.pc    

1)proc2.0이상인 경우    

EXE와 OBJS macro를 사용하면 간단히compile할 수 있다.   

make -f proc.mk EXE=main OBJS="connect.o print_names.o main.o"   

"(double quotation)으로 묶는 것은 space를 포함하여 macro에 전달하기 위해서이다.    

2)proc1.6인 경우    

proc16.mk file 을 아래와 같이 수정한다.    

OBJ=main.o connect.o print_names.o    

SRC=main.c connect.c print_names.c   

main: $(OBJ)    

@$(ECHO) $(CC) $(CFLAGS) $(LDFLAGS) -o main $(OBJ) $(PROLDLIBS)    

.pc.c:    

$(PROC) $(PROFLAGS) iname=$*.pc    

.c: $(SRC)    

@$(ECHO) $(CC) -o $(SRC)   

command line에서 make -f proc16.mk main을 입력하면 된다.   

5.LINK 방법   

1)library의 name을 full path와 함께 기술한다.    

예를 들어 libsql.a 를 link시킨다면    

cc -I. -O -o main main.o /u02/7016/lib/libsql.a ...   

처럼 직접 full path와 name을object line에 붙여 사용한다.    

2)-l 과 -L option을 사용하여 기술한다.    

-l은 object library를 읽어 들이는 option이며 -L은 library search path를 linker에게 넘겨준다. -l 뒤에 나오는 file_name은 lib + file_name으로 인식한다. 예를 들어 libnlsrtl.a 를 link시킨다면-lnlsrtl 을 link 부분에 추가하고 -L부분에 그 library의 path를 추가한다( LDFLAGS macro에는 -L$(ORACLE_HOME)/lib 를 가지고 있으며 이는 linker가 -l로 지정되어 있는 library들을 찾는 directory를 가리킨다. )    

.a file 은 여러 .o file을 archive하여 (unix에서는 'ar' command로) 하나의 file로 만든 것이다.   

6.SHARED LIBRARY 사용법    

ORACLE V7.2이상에서는 shared library를 사용하여 executable size를 줄일 수 있다.   

make -f proc.mk EXE=sample1 OBJS=sample1.o    

ORA_CLIENT_LIB=shared    

로 주면 shared library를 사용한다(V7.3에서는 ORA_CLIENT_LIB option이 없어도 자동적으로 shared library를 쓴다.) 이 library는 $ORACLE_HOME/lib/libclntsh.<shared lib suffix> 이며 platform마다 suffix가 다르다(Solaris: .so HP/UX: .sl IBM RS/6000: .a )   

platform마다 shard library를 사용 할 수 있는가는 $ORACLE_HOME/rdbms/lib/clntsh.mk file이 있는 지의 여부에 따라 결정된다. clntsh.mk가 존재하는데 libclntsh library가 없다면    

make -f clntsh.mk libclntsh   

로 relink하여 만들어 주고 LD_LIBRARY_PATH에 $ORACLE_HOME/lib 를 포함시켜야 한다.  
 


  • JAVA
  • ORACLE
  • iPhone/Android
  • .NET
  • 표준웹/HTML5
  • 채용/취업무료교육
  • 초보자(재학생)코스

  • 댓글 없음:

    댓글 쓰기