프로프레임 3.0 에서 티맥스 서버를 일괄 컴파일하는 쉘을 작성하였다. 서버는 두가지 종류로 나눌 수 있는데 표준적인 서버가 있다. 이런 서버는 표준 템플릿서버소스로 동일한 모양의 소스로 생성이 되고 각 서비스는 dlcall 방식으로 호출하게 된다. 서버에 서비스는 하나씩만 구성할 수도 있고 하나의 서버에 여러 서비스를 묶을 수도 있는데 이것은 프로젝트 상황에 맞게 구성하면 된다.
작업하기 전에 쉘들이 존재하는 디렉토리 하위에 src, log, appbin 이 만들어져 있어야 한다.
| 직접 컴파일 서버 목록 파일 작성
직접 컴파일 하는 목록을 먼저 작성한다. 전체 업무별 디렉토리를 뒤지면 직접 컴파일하는 서버 목록은 구할 수 있다. 이 작업은 약간의 수작업이 요구된다.
[compile.svr.list]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | /approot/pfm/fw/src/TPFMAPLOGER /approot/pfm/fw/src/TPFMAPLOGSL /approot/pfm/fw/src/TPFMAPLOGTX /approot/pfm/fw/src/TPFMCCUT /approot/pfm/fw/src/TPFMDFER /approot/pfm/fw/src/TPFMHLTHCHK /approot/pfm/fw/src/TPFMIPPR /approot/pfm/fw/src/TPFMLINK /approot/pfm/fw/src/TPFMOPPR /approot/pfm/fw/src/TPFMTIMER /approot/pfm/fw/src/UPFMAPLOGER /approot/pfm/fw/src/UPFMAPLOGSL /approot/pfm/fw/src/UPFMAPLOGTX /approot/pfm/fw/src/UPFMHLTHCHK /approot/pfm/fw/src/UPFMSELFCHK /approot/app/aa/src/UAA001 /approot/app/aa/src/DAA001 /approot/app/bb/src/DBB001 /approot/app/bb/src/DBB002 /approot/app/cc/src/UCC001 /approot/app/cc/src/UCC002 /approot/app/cc/src/UCC003 /approot/app/cc/src/UCC004 /approot/app/cc/src/UCC005 /approot/app/cc/src/UCC006 | cs |
| 직접 컴파일
목록이 작성되면 이제 일괄 컴파일을 한다. comp_svr.sh 를 실행한다. 입력 아규먼트로 위에서 작성한 목록 파일을 지정한다. 순서대로 소스파일을 복사해 와서 컴파일을 실행하고 정상 컴파일이 완료되면 생성된 바이너리를 상위의 appbin 으로 옮겨 놓는다. 실제 $TMAXDIR/appbin 으로 복사해 넣는 것은 때가 되면 직접 한다.
[comp_svr.sh]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | #!/usr/bin/ksh HOSTNAME=`hostname` USER=`id` LOG_HOME=../log LOG_FILE=comp_svr.log.$DATE_TIME BK_TEAMDIR=$TEAMDIR BK_WORKDIR=$WORKDIR TARGET_DIR=../appbin/ # ******************** execute (sql/program) ***************** usage() { echo "Usage : `basename $0` serverlist_file" echo " (ex) `basename $0` comp_svr.list" exit } echo_log() { DT=`date +%Y%m%d_%H%M%S` echo "$1" echo "$DT|$1" >> $LOG_HOME/$LOG_FILE } # ====================== MAIN ====================== # if [ $# -eq 1 ];then SVR_LIST_FILE=$1 else usage; exit fi SVR_LIST=`grep -v "^#" $SVR_LIST_FILE` cd ./src/ for LIST_ONE in $SVR_LIST do SVR_NM=`echo $LIST_ONE | rev | cut -d/ -f1 | rev` # 서버 소스를 복사해 온다 echo "cp -p ${LIST_ONE}.c . " cp -p ${LIST_ONE}.c . cp -p ${LIST_ONE}.mk . # 컴파일을 한다 make -f ${SVR_NM}.mk clean all # 로그를 기록 if [ $? -eq 0 ];then mv ${SVR_NM} $TARGET_DIR echo_log "${SVR_NM}|OK" else echo_log "${SVR_NM}|FAIL" fi done # ====================== END ====================== # | cs |
| 자동 컴파일 서버목록파일 작성
이제 남은 서버들은 자동 컴파일하면 된다. 프로프레임3.0 에서는 pfmbuildsvr 이라는 명령어가 있는데 이 프로그램은 tmconfig.m 에서 서버에 포함된 서비스목록을 구하여 서버.c를 생성하고 이것을 컴파일하여 서버 바이너리를 생성해 준다. 문제는 이 pfmbuildsvr 대상 서버 목록을 구하는 것이다.
자 그러면 이제 표준 템플릿모양의 서버 목록을 추출하기 위한 쉘을 작성했다. 먼저 준비한 직접 컴파일 대상 목록이 필요하다.
실행 : make_build_svr_list.sh compile.svr.list
그러면 compile.svr.list 목록을 하나씩 읽으면서 전체 서버목록에서 하나씩 제외한다. 전체 서버 목록은 $HOSTNAME.svr.list.all 로 생성이 될 것이며 build 서버의 목록은 $HOSTNAME.build.svr.list 으로 생성될 것이다.
[make_build_svr_list.sh]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | #!/usr/bin/ksh HOSTNAME=`hostname` LOG_HOME=../log LOG_FILE=comp_svr.log.$DATE_TIME LISTFILE=$HOSTNAME.build.svr.list TARGET_DIR=../appbin/ # **************************** execute (sql/program) ************************* usage() { echo "Usage : `basename $0` 컴파일대상서버목록" echo " (ex) `basename $0` comp_svr.list" exit } echo_log() { DT=`date +%Y%m%d_%H%M%S` echo "$1" echo "$DT|$1" >> $LOG_HOME/$LOG_FILE } # ================= MAIN ====================== # if [ $# -eq 1 ];then EXCPT_LIST_FILE=$1 else usage; exit fi # tmconfig.m 에서 서버목록을 구함. # 로 시작하는 것은 제외 grep SVRNAME $TMAXDIR/config/tmconfig.m |grep -v "^#" > buildsvr.list.temp2 cat buildsvr.list.temp2 |cut -d= -f2|awk '{ print $1 }' > buildsvr.list.temp1 # 혹시 붙어 있을 , 제거 cat buildsvr.list.temp1 | sed -e 's/\,//g' > buildsvr.list.temp2 cat buildsvr.list.temp2 | sort | uniq > $HOSTNAME.svr.list.all SVR_LIST=`grep -v "^#" $EXCPT_LIST_FILE` cp $HOSTNAME.svr.list.all buildsvr.list.temp1 # 루프를 돌면서 compile 대상 서버는 제외한다 for LIST_ONE in $SVR_LIST do SVR_NM=`echo $LIST_ONE | rev | cut -d/ -f1 | rev` echo "$SVR_NM 제외" cat buildsvr.list.temp1 | sed -e s/${SVR_NM}/compile/g > buildsvr.list.temp2 mv buildsvr.list.temp2 buildsvr.list.temp1 done # 직접컴파일대상 서버는 목록에서 제외 egrep -v "=|tmaxadm|trace|PFMAGENT|PFMIPPR|DOGW0|compile" buildsvr.list.temp1>buildsvr.list.temp2 egrep -v "fdltest|snd_svr|snd_svr01|svr2|svr4|pTm_svr" buildsvr.list.temp2 > $LISTFILE rm -f compile buildsvr.list.temp1 buildsvr.list.temp2 echo "created $LISTFILE" # ======================= END OF FILE ================== # | cs |
| 빌드서버를 이용한 서버 자동 컴파일
자동컴파일 목록이 생성되었으면 전체 컴파일 하는 방법은 간단하다. 내부적으로 서비스목록이 포함된 서버 소스를 자동 생성하고 컴파일을 실행하게 된다.
실행방법 : build_svr.sh 위에서생성된buildsvr대상목록
[build_svr.sh]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | #!/usr/bin/ksh HOSTNAME=`hostname` LOG_HOME=../log LOG_FILE=build_svr.log.$DATE_TIME TARGET_DIR=appbin # **************** execute (sql/program) ******************* usage() { echo "Usage : `basename $0` serverlist_file" echo " (ex) `basename $0` comp_svr.list" exit } echo_log() { DT=`date +%Y%m%d_%H%M%S` echo "$1" echo "$DT|$1" >> $LOG_HOME/$LOG_FILE } # ====================== MAIN ====================== # if [ $# -eq 1 ];then SVR_LIST_FILE=$1 else usage; exit fi # # 시작되는 주석라인은 제외 SVR_LIST=`grep -v "^#" $SVR_LIST_FILE` cd $TARGET_DIR for SVR_NM in $SVR_LIST do pfmbuildsvr $SVR_NM if [ $? -eq 0 ];then echo_log "${SVR_NM}|OK" else echo_log "${SVR_NM}|FAIL" fi done # ====================== END ====================== # | cs |
모두 수행하게 되는 현재 디렉토리 하위의 appbin 에 컴파일된 바이너리들이 모아져 있을 것이다. 직접 컴파일 해야 하는 서버의 C 프로그램은 src 에 복사되어져 있을 것이다. 컴파일 결과 로그는 log 에 만들어져 있게 된다.
'컴퓨터활용 > 프로프레임' 카테고리의 다른 글
[프로프레임] 거래전문 추출 Pro*C (0) | 2017.06.08 |
---|---|
[프로프레임] tdlinit.sh (0) | 2017.05.24 |
프로프레임 모듈 이관/컴파일 순서 (0) | 2009.02.20 |
프로프레임 리소스권한 관리 (0) | 2009.02.20 |
프로프레임 스튜디오 단축키 (0) | 2009.01.07 |