移行などで、あるソース・ファイルにある、すべてのRPG ソース・メンバーをまとめて
コンパイルしたいと思ったことはないだろうか ?
残念ながら IBM の CRTBNDRPG コマンドには *ALL というオプションは用意されていない。
数千本もある RPG を、ひとつひとつ名前を入れてコンパイルしていたのでは
気の遠くなる話でもあるし、何よりスマートではないし人手の力で気合で行うような
時代ではない。
人手であればミスも出るし、そのためのチェックの時間も莫大なものとなってしまう。
ここではあるユーザーからの依頼で 3000 本のプログラムをまとめてコンパイルする必要が
出てきたので *ALL をサポートする CRTBNDRPG コマンドを作成したものを
紹介する。
この CRTBNDRPG コマンド・ソースは別途にこの Tools で紹介した RTVCMDSRC によって
IBM の CRTBNDRPG コマンドよりコマンド・ソースを抽出したものを使っている。
IBM の CRTBNDRPG コマンドより抽出することによってヘルプも IBM が提供しているものを
利用することができるようになっている。
最初に CRTBNDRPG コマンドの実行の画面は次のとおりである。
-----------------------------------------------------------------------------------------
0001.00 /* CRTCMD CMD(CVTS36/CRTBNDRPG) + */
0002.00 /* PGM(QDEVTOOLS/QRN4CPP) + */
0003.00 /* SRCFILE(R510SRC/QCMDSRC) + */
0004.00 /* SRCMBR(CRTBNDRPG) + */
0005.00 /* THDSAFE(*NO) + */
0006.00 /* MLTTHDACN(*SYSVAL) + */
0007.00 /* TEXT(' バインド RPG PGM の作成 ') + */
0008.00 /* VLDCKR(*NONE) + */
0009.00 /* MODE( + */
0010.00 /* *ALL) + */
0011.00 /* ALLOW( + */
0012.00 /* *ALL) + */
0013.00 /* ALWLMTUSR(*NO) + */
0014.00 /* MAXPOS(3) + */
0015.00 /* PMTFILE(QDEVTOOLS/QRPGLEMSG) + */
0016.00 /* MSGF(*LIBL/QRPGLEMSG) + */
0017.00 /* HLPSHELF(*LIST) + */
0018.00 /* HLPPNLGRP(QDEVTOOLS/QHRNCMD) + */
0019.00 /* HLPID(CRTBNDRPG) + */
0020.00 /* HLPSCHIDX(*NONE) + */
0021.00 /* CURLIB(*NOCHG) + */
0022.00 /* PRDLIB(QDEVTOOLS) + */
0023.00 /* PMTOVRPGM(*NONE) + */
0024.00 /* AUT(*USE) + */
0025.00 /* REPLACE(*YES) + */
0026.00 /* ENBGUI(*YES) */
0027.00
0028.00 /* Internal info */
0029.00 /* PGM call state: *USER */
0030.00 /* CCSID: 5026 */
0031.00
0032.00 CMD PROMPT(' バインド RPG PGM の作成 ')
0033.00 PARM KWD(CMDFLAG) +
0034.00 TYPE(*CHAR) +
0035.00 LEN(32) +
0036.00 CONSTANT(0)
0037.00 PARM KWD(PGM) +
0038.00 TYPE(Q08FC) +
0039.00 PGM(*YES) +
0040.00 CHOICE(*NONE) +
0041.00 PROMPT(' プログラム ' 2)
0042.00 PARM KWD(SRCFILE) +
0043.00 TYPE(Q096A) +
0044.00 FILE(*IN) +
0045.00 CHOICE(*NONE) +
0046.00 PROMPT(' ソース・ファイル ' 3)
0047.00 PARM KWD(SRCMBR) +
0048.00 TYPE(*NAME) +
0049.00 LEN(10) +
0050.00 DFT(*PGM) +
0051.00 SPCVAL( +
0052.00 (*PGM )) +
0053.00 EXPR(*YES) +
0054.00 PROMPT(' ソース・メンバー ' 4)
0055.00 PARM KWD(GENLVL) +
0056.00 TYPE(*INT2) +
0057.00 DFT(10) +
0058.00 RANGE( +
0059.00 0 +
0060.00 20) +
0061.00 PROMPT(' 生成重大度レベル ' 5)
:
:
(略)
-----------------------------------------------------------------------------------------
実際のソースは 395ステップもある。
コンパイルの方法は、このソースの先頭に記述されているので参考にされたい。
------------------------------------------------------------------------------------
0001.00 PGM PARM(&CMDFLAG &PGMOBJLIB &SRCFLIB &SRCMBR +
0002.00 &GENLVL &TEXT &OPTIONS &DBGVIEW &OUTPUT +
0003.00 &OPTIMIZE &INDENT &CVTOPT &SRTSEQ &LANGID +
0004.00 &REPLACE &DFTACTGR &ACTGRP &USRPRF &AUT +
0005.00 &TRUNCNBR &FIXNBR &TGTRLS &ALWNULL +
0006.00 &DEFINE &ENBPFRCOL &PRFDTA &BNDDIR &LICOPT)
0007.00 /*---------------------------------------------------------*/
0008.00 /* CRTBNDRPG : RPG コンパイル (*ALL) */
0009.00 /*---------------------------------------------------------*/
0010.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(80)
0011.00 DCL VAR(&TYPE) TYPE(*CHAR) LEN(1)
0012.00 DCL VAR(&CMDFLAG) TYPE(*CHAR) LEN(32)
0013.00 DCL VAR(&PGMOBJLIB) TYPE(*CHAR) LEN(20)
0014.00 DCL VAR(&PGM) TYPE(*CHAR) LEN(10)
0015.00 DCL VAR(&PGM_P) TYPE(*CHAR) LEN(10)
0016.00 DCL VAR(&OBJLIB) TYPE(*CHAR) LEN(10)
0017.00 DCL VAR(&SRCFLIB) TYPE(*CHAR) LEN(20)
0018.00 DCL VAR(&SRCF) TYPE(*CHAR) LEN(10)
0019.00 DCL VAR(&SRCLIB) TYPE(*CHAR) LEN(10)
0020.00 DCL VAR(&SRCMBR) TYPE(*CHAR) LEN(10)
0021.00 DCL VAR(&GENLVL) TYPE(*CHAR) LEN(2)
0022.00 DCL VAR(&GENLVL_P) TYPE(*CHAR) LEN(2)
0023.00 DCL VAR(&TEXT) TYPE(*CHAR) LEN(52)
0024.00 DCL VAR(&TEXT_P) TYPE(*CHAR) LEN(50)
0025.00 DCL VAR(&DFTACTGR) TYPE(*CHAR) LEN(4)
0026.00 DCL VAR(&DFTACTGR_P) TYPE(*CHAR) LEN(4)
0027.00 DCL VAR(&ACTGRP) TYPE(*CHAR) LEN(10)
0028.00 DCL VAR(&ACTGRP_P) TYPE(*CHAR) LEN(10)
0029.00 DCL VAR(&OPTIONS) TYPE(*CHAR) LEN(22)
0030.00 DCL VAR(&OPTIONS_C) TYPE(*CHAR) LEN(220)
0031.00 DCL VAR(&OPTIONS_P) TYPE(*CHAR) LEN(200)
0032.00 DCL VAR(&DBGVIEW) TYPE(*CHAR) LEN(2)
0033.00 DCL VAR(&DBGVIEW_P) TYPE(*CHAR) LEN(7)
0034.00 DCL VAR(&OUTPUT) TYPE(*CHAR) LEN(1)
0035.00 DCL VAR(&OUTPUT_P) TYPE(*CHAR) LEN(6)
0036.00 DCL VAR(&OPTIMIZE) TYPE(*CHAR) LEN(2)
0037.00 DCL VAR(&OPTIMIZE_P) TYPE(*CHAR) LEN(6)
0038.00 DCL VAR(&INDENT) TYPE(*CHAR) LEN(2)
0039.00 DCL VAR(&INDENT_P) TYPE(*CHAR) LEN(5)
0040.00 DCL VAR(&CVTOPT) TYPE(*CHAR) LEN(10)
0041.00 DCL VAR(&CVTOPT_C) TYPE(*CHAR) LEN(51)
0042.00 DCL VAR(&CVTOPT_P) TYPE(*CHAR) LEN(50)
0043.00 DCL VAR(&SRTSEQ) TYPE(*CHAR) LEN(20)
0044.00 DCL VAR(&SEQ) TYPE(*CHAR) LEN(10)
0045.00 DCL VAR(&SEQLIB) TYPE(*CHAR) LEN(10)
0046.00 DCL VAR(&LANGID) TYPE(*CHAR) LEN(7)
0047.00 DCL VAR(&LANGID_P) TYPE(*CHAR) LEN(7)
0048.00 DCL VAR(&REPLACE) TYPE(*CHAR) LEN(4)
0049.00 DCL VAR(&REPLACE_P) TYPE(*CHAR) LEN(4)
0050.00 DCL VAR(&USRPRF) TYPE(*CHAR) LEN(1)
0051.00 DCL VAR(&USRPRF_P) TYPE(*CHAR) LEN(6)
0052.00 DCL VAR(&AUT) TYPE(*CHAR) LEN(10)
0053.00 DCL VAR(&AUT_P) TYPE(*CHAR) LEN(10)
0054.00 DCL VAR(&TRUNCNBR) TYPE(*CHAR) LEN(4)
0055.00 DCL VAR(&TRUNCNBR_P) TYPE(*CHAR) LEN(4)
0056.00 DCL VAR(&FIXNBR) TYPE(*CHAR) LEN(6)
0057.00 DCL VAR(&FIXNBR_C) TYPE(*CHAR) LEN(26)
0058.00 DCL VAR(&FIXNBR_P) TYPE(*CHAR) LEN(25)
0059.00 DCL VAR(&TGTRLS) TYPE(*CHAR) LEN(8)
0060.00 DCL VAR(&TGTRLS_P) TYPE(*CHAR) LEN(8)
0061.00 DCL VAR(&ALWNULL) TYPE(*CHAR) LEN(1)
0062.00 DCL VAR(&ALWNULL_P) TYPE(*CHAR) LEN(10)
0063.00 DCL VAR(&DEFINE) TYPE(*CHAR) LEN(52)
0064.00 DCL VAR(&DEFINE_P) TYPE(*CHAR) LEN(50)
0065.00 DCL VAR(&ENBPFRCOL) TYPE(*CHAR) LEN(1)
0066.00 DCL VAR(&ENBPFRCOLP) TYPE(*CHAR) LEN(10)
0067.00 DCL VAR(&PRFDTA) TYPE(*CHAR) LEN(1)
0068.00 DCL VAR(&PRFDTA_P) TYPE(*CHAR) LEN(6)
0069.00 DCL VAR(&BNDDIR) TYPE(*CHAR) LEN(1002)
0070.00 DCL VAR(&BNDDIR_P) TYPE(*CHAR) LEN(1000)
0071.00 DCL VAR(&LICOPT) TYPE(*CHAR) LEN(502)
0072.00 DCL VAR(&LICOPT_P) TYPE(*CHAR) LEN(500)
0073.00 DCL VAR(&DEC08) TYPE(*DEC) LEN(8 0)
0074.00 DCL VAR(&FLD08) TYPE(*CHAR) LEN(8)
0075.00 DCL VAR(&KOSU) TYPE(*CHAR) LEN(2)
0076.00 DCL VAR(&N) TYPE(*DEC) LEN(4 0)
0077.00 DCL VAR(&POS) TYPE(*DEC) LEN(4 0)
0078.00 DCL VAR(&FLD02) TYPE(*CHAR) LEN(2)
0079.00 DCL VAR(&COUNT) TYPE(*DEC) LEN(8 0)
0080.00 DCL VAR(&OS400) TYPE(*CHAR) LEN(6)
0081.00 DCL VAR(&NULL2) TYPE(*CHAR) LEN(2) VALUE(X'0000')
0082.00 DCL VAR(&NULL) TYPE(*CHAR) LEN(1) VALUE(X'00')
0083.00 DCL VAR(&APIERR) TYPE(*CHAR) LEN(4) +
0084.00 VALUE(X'00000000') /* 2 進数 */
0085.00 DCL VAR(&STRPOS) TYPE(*CHAR) LEN(4) +
0086.00 VALUE(X'0000007D') /* 2 進数開始位置 : +
0087.00 125 */
0088.00 DCL VAR(&LENDTA) TYPE(*CHAR) LEN(4) +
0089.00 VALUE(X'00000010') /* 2 進数受取長さ : 16 */
0090.00 DCL VAR(&RCVVAR) TYPE(*CHAR) LEN(16) +
0091.00 VALUE(X'0000000000000000')
0092.00 DCL VAR(&OFFSET) TYPE(*CHAR) LEN(4) /* +
0093.00 2 進数 オフセット */
0094.00 DCL VAR(&NOENTR) TYPE(*CHAR) LEN(4) /* +
0095.00 2 進数項目数 */
0096.00 DCL VAR(&LSTSIZ) TYPE(*CHAR) LEN(4) /* +
0097.00 2 進数リストサイズ */
0098.00 DCL VAR(&DEC08) TYPE(*DEC) LEN(8 0) /* WORK */
0099.00 DCL VAR(&ADDLEN) TYPE(*DEC) LEN(8 0) /* WORK */
0100.00 DCL VAR(&NOENT) TYPE(*DEC) LEN(8 0) /* WORK */
0101.00 DCL VAR(&RCVDTA) TYPE(*CHAR) LEN(256) /* +
0102.00 受取データ */
0103.00 DCL VAR(&SRCTYPE) TYPE(*CHAR) LEN(10)
0104.00 DCL VAR(&STSMSG) TYPE(*CHAR) LEN(256)
0105.00 DCL VAR(&PGM_SU) TYPE(*DEC) LEN(5 0) VALUE(0)
0106.00 DCL VAR(&PGM_SUC) TYPE(*CHAR) LEN(5)
0107.00 DCL VAR(&OK_SU) TYPE(*DEC) LEN(5 0) VALUE(0)
0108.00 DCL VAR(&OK_SUC) TYPE(*CHAR) LEN(5)
0109.00 DCL VAR(&ERR_SU) TYPE(*DEC) LEN(5 0) VALUE(0)
0110.00 DCL VAR(&ERR_SUC) TYPE(*CHAR) LEN(5)
0111.00 MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))
0112.00
0113.00 RTVJOBA TYPE(&TYPE)
0114.00 RTVDTAARA DTAARA(QGPL/QSS1MRI (1 6)) RTNVAR(&OS400)
0115.00 /*( PGM )*/
0116.00 CHGVAR VAR(&PGM) VALUE(%SST(&PGMOBJLIB 01 10))
0117.00 CHGVAR VAR(&PGM_P) VALUE(&PGM)
0118.00 CHGVAR VAR(&OBJLIB) VALUE(%SST(&PGMOBJLIB 11 10))
0119.00 CHGVAR VAR(&SRCF) VALUE(%SST(&SRCFLIB 01 10))
0120.00 CHGVAR VAR(&SRCLIB) VALUE(%SST(&SRCFLIB 11 10))
0121.00 /*( TEXT )*/
0122.00 CHGVAR VAR(&TEXT_P) VALUE(%SST(&TEXT 3 50))
0123.00 /*( GENLVL )*/
0124.00 CHGVAR VAR(&DEC08) VALUE(%BIN(&GENLVL))
0125.00 CHGVAR VAR(&FLD08) VALUE(&DEC08)
0126.00 CHGVAR VAR(&GENLVL_P) VALUE(%SST(&FLD08 7 2))
0127.00 /*( OPTIONS )*/
0128.00 CHGVAR VAR(&KOSU) VALUE(%SST(&OPTIONS 1 2))
0129.00 CHGVAR VAR(&DEC08) VALUE(%BIN(&KOSU))
0130.00 IF COND(&DEC08 *GT 0) THEN(DO) /* 値あり */
0131.00 CHGVAR VAR(&COUNT) VALUE(&DEC08)
0132.00 CHGVAR VAR(&N) VALUE(1)
0133.00 CHGVAR VAR(&POS) VALUE(3)
0134.00 NXTOPT: CHGVAR VAR(&FLD02) VALUE(%SST(&OPTIONS &POS 2))
0135.00 CHGVAR VAR(&DEC08) VALUE(%BIN(&FLD02))
0136.00 IF COND(&DEC08 *EQ 1) THEN(DO)
0137.00 CHGVAR VAR(&OPTIONS_C) VALUE(&OPTIONS_C *TCAT +
0138.00 ' *XREF ')
0139.00 ENDDO
0140.00 IF COND(&DEC08 *EQ 2) THEN(DO)
0141.00 CHGVAR VAR(&OPTIONS_C) VALUE(&OPTIONS_C *TCAT +
0142.00 ' *NOXREF ')
:
:
(略)
------------------------------------------------------------------------------------
このCLP :CRTBNDRPGC も 529 ステップある。
内容は API: QUSLMBR によってメンバー・リストをユーザー・スペースに出力して
そのユーザー・スペースを読み取ることによってすべてのメンバーのコンパイルを
行うようにしている。
コンパイルの最後にはすべての総コンパイル本数と、そのうちエラーになったものの
本数が完了メッセージとして報告されるようになっている。