Tools

26. すべてのコンパイルを *ALL で行う CRTBNDRPG

移行などで、あるソース・ファイルにある、すべてのRPG ソース・メンバーをまとめて
コンパイルしたいと思ったことはないだろうか ?
残念ながら IBM の CRTBNDRPG コマンドには *ALL というオプションは用意されていない。
数千本もある RPG を、ひとつひとつ名前を入れてコンパイルしていたのでは
気の遠くなる話でもあるし、何よりスマートではないし人手の力で気合で行うような
時代ではない。
人手であればミスも出るし、そのためのチェックの時間も莫大なものとなってしまう。
ここではあるユーザーからの依頼で 3000 本のプログラムをまとめてコンパイルする必要が
出てきたので *ALL をサポートする CRTBNDRPG コマンドを作成したものを
紹介する。
この CRTBNDRPG コマンド・ソースは別途にこの Tools で紹介した RTVCMDSRC によって
IBM の CRTBNDRPG コマンドよりコマンド・ソースを抽出したものを使っている。
IBM の CRTBNDRPG コマンドより抽出することによってヘルプも IBM が提供しているものを
利用することができるようになっている。
最初に CRTBNDRPG コマンドの実行の画面は次のとおりである。

【 コマンド 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ステップもある。
コンパイルの方法は、このソースの先頭に記述されているので参考にされたい。

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