移行などで、あるソース・ファイルにある、すべての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
によってメンバー・リストをユーザー・スペースに出力して
そのユーザー・スペースを読み取ることによってすべてのメンバーのコンパイルを
行うようにしている。
コンパイルの最後にはすべての総コンパイル本数と、そのうちエラーになったものの
本数が完了メッセージとして報告されるようになっている。