VSCodeでFFRPGをシュッと始める　いざ、コンパイル編

# 前置き
- [こちらの記事](https://qiita.com/KOINULIB/items/b7259d93ec772effdef7)の続きです

# 環境前提
- PC環境
    - Windows11
- VSCodeの拡張機能
    - [必須](https://qiita.com/KOINULIB/items/b7259d93ec772effdef7#%E6%8B%A1%E5%BC%B5%E6%A9%9F%E8%83%BD%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)の拡張がインストールされていること
- 接続先IBM i
    - IBM i バージョン：V7.4
    - QCCSID：1399（5035でも恐らく同様で、問題ないと思います）　
    - 導入済ライセンスに`5733SC1`があり、OpenSSHが利用できる状態

# 1. コンパイル準備：ライブラリーリスト
- IBM i 開発者は何を気を付けるのかというと、やはりライブラリーリストですね！
- [Code for IBM i](https://marketplace.visualstudio.com/items?itemName=HalcyonTechLtd.code-for-ibmi) にて区画に接続後、`USER LIBRARY LIST`の設定をします
    - Add to Library Listから、ライブラリーを追加します（ADDLIBLします）
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658740/9c0d0751-21dd-cee0-f44d-c29e6557602f.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658740/884b0b8a-53a8-a55c-d688-d93b7b98a2c9.png)
    - 追加した`KOINULIB`の横に↑↓の矢印が表示されるので、適宜ライブラリーリストの順番を変更します
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658740/9bc2eafc-e115-90b7-046c-9081fe685d58.png)



# 2. コンパイル準備：コンパイルリストの設定（＋＠）
- VSCodeの設定にて、Code for IBM iの拡張について設定変更をします
- ユーザー設定を開きます
    - Windows：Ctrl + ,
    - Mac：Cmd + ,
- 拡張機能　＞　Code for IBM i を選択
    - 以下にチェックを入れる
        - 【必須】Log Compile Output
            - 【簡易説明】その名のごとく、VSCode上でコンパイルリストが表示できる　
        - 【任意】Safe Delete Mode
            - 【簡易説明】接続先のIFSディレクトリーを削除する際に、ディレクトリー名を入れないと削除できないようにする
            ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658740/5dc6aeb4-4200-447d-06c7-3ad159494175.png)
            - **ソース等、ストリームファイルは適用されないので注意**
        - 【任意】Show Connection Buttons
            - 【簡易説明】切断および再接続ボタンがステータスバーに表示される
            ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658740/21a1d404-aa94-63e4-6184-6838bdbd0d49.png)


# 3. コンパイル準備：コンパイルコマンドの微調整
- 前回作成したFFRPGのソースに対して、IFS BROWSERで右クリックし、`Run Action`を押下するとデフォルトで用意されたコンパイルに関するコマンドが表示されます
- デフォルトのコマンドがどういったパラメータを設定しているかを確認したいと思います
- ステータスバーのConnection Name（キャプチャではIBMI74）にカーソルを合わせ、`Actions`を選択します
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658740/1d8cc70f-454c-1ff9-5c3e-4e5fe6ebcfeb.png)
    - ここでTerminalsを選択すると、PASEや5250画面の表示ができます！
- Work with Actionsのタブが開きます
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658740/a54f2797-4efc-7f3d-833d-169c4299ba1f.png)
- MeｍberとStreamfileに分けてデフォルトのアクション（コマンド一覧）が並んでいます。
- 今回はIFS上にPushしたFFRPG（.rpgle)をコンパイルするので、Streamfileの下にある`Create Bound RPG Program (CRTBNDRPG) with inputs`を選択、パラメータを一部変更します。
- もともと用意されたコマンドは以下の通り
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658740/c764a764-bed2-7069-adad-a05885a49ccd.png)
- 今回使っているユーザープロファイル的には`CCSID：*SYSVAL`、SYSVALも` QCCSID：1399`なのでデフォルト値の`*JOB`でも問題ありませんが、明示的にTGTCCSIDを5035へ変更し、Saveボタンを押下して設定を保存します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658740/f20d0237-dff0-63f2-ccf6-b95264ae66ff.png)

    - なお、TGTCCCSIDの設定は必須です
    - IFSにアップロードされたストリームファイルがUTF8（CCSID1208）なので、RPGコンパイラはUnicodeのソースを直接参照できず、コンパイルエラーとなってしまいます。そのためTGTCCCSIDを5035に指定し、変換をした上でコンパイルをできるようにする必要があります！
    - [参考：Code for IBM i その全貌：Part 4 ソースコードの保守｜SEU/PDMの代わりになるか](https://www.imagazine.co.jp/code-for-ibm-i-j-part4/)

# 4. いざ、コンパイル！
- 整ってまいりました。再度、ソースを右クリック→`Run Action`を押下してください
- 修正をした`Create Bound RPG Program (CRTBNDRPG) with inputs`を選択してください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658740/6af47f06-1c36-c396-3c36-0d933f29fb71.png)
- コンパイル先のライブラリーを指定（今回はKOINULIB）し、Executeボタンを押下してください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658740/58cac47b-57e1-ad5b-4552-af7d6b527f4a.png)

# 5. コンパイルリストのチェック
- ポップアップが出てきたので、Open outputボタンを押下し、コンパイルリストを確認します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658740/fdcd0272-8818-1e2c-158b-cdcabedb6e21.png)
- コンパイルリストは以下の通りで、コンパイル時のコマンドも確認できます
    - リスト最下部を確認し、コンパイルが警告はあるものの、無事にPGMの作成に成功しています！
    ```
    Running Action: Create Bound RPG Program (CRTBNDRPG) with inputs (19:35:36)
    Current library: QGPL
    Library list: KOINULIB QGPL QTEMP QMGTOOLS
    Working directory: /home/SAORI
    Commands:
    	CRTBNDRPG PGM(KOINULIB/add10) SRCSTMF('/home/SAORI/ffrpgsrc_for_qiita/add10.rpgle') OPTION(*EVENTF) DBGVIEW(*SOURCE) TGTRLS(*CURRENT) TGTCCSID(5035)
    
    CPD4090:  印刷装置PRT01が見つからない。出力待ち行列がライブラリーQGPLのQPRINTに変更されました。
    RNS9304:  プログラムADD10がライブラリーKOINULIBに入れられました。最高の重大度は10。24/01/24の19:36:25に作成されました。
    CPC0904:  データ域RETURNCODEがライブラリーQTEMPに作成された。
      5770WDS V7R4M0  190419 RN        IBM ILE RPG             KOINULIB/ADD10           IBMI74     24/01/24 19:36:25        PAGE      1
       コマンド . . . . . . . . . . . :   CRTBNDRPG
         投入元 . . . . . . . . . . . :     SAORI
       プログラム . . . . . . . . . . :   ADD10
         ライブラリー . . . . . . . . :     KOINULIB
       テキスト'記述' . . . . . . . :   *SRCMBRTXT
       ソース・ストリーム・ファイル . :   /home/SAORI/ffrpgsrc_for_qiita/add10.rpgle
         CCSID  . . . . . . . . . . . . :     1208
       ターゲットCCSID. . . . . . . . :   5035
       テキスト'記述' . . . . . . . :
       最終変更 . . . . . . . . . . . :   24/01/11  11:54:51
       生成重大度レベル . . . . . . . :   10
       省略時の活動化グループ . . . . :   *YES
       コンパイラー・オプション . . . :   *XREF      *GEN       *NOSECLVL  *SHOWCPY
                                            *EXPDDS    *EXT       *NOSHOWSKP *NOSRCSTMT
                                            *DEBUGIO   *UNREF     *EVENTF
       デバッグ・ビュー . . . . . . . :   *SOURCE
       デバッグ暗号鍵 . . . . . . . . :   *NONE
       出力 . . . . . . . . . . . . . :   *PRINT
       最適化レベル . . . . . . . . . :   *NONE
       ソース・リストの字下げ . . . . :   *NONE
       タイプ変換オプション . . . . . :   *NONE
      ソート順序. . . . . . . . . . . :   *HEX
       言語識別コード . . . . . . . . :   *JOBRUN
       プログラムの置き換え . . . . . :   *YES
       ユーザー・プロファイル . . . . :   *USER
       権限 . . . . . . . . . . . . . :   *LIBCRTAUT
       数値の切り捨て . . . . . . . . :   *YES
       数値の修正 . . . . . . . . . . :   *NONE
      ターゲット・リリース. . . . . . :   *CURRENT
       ヌル値可能 . . . . . . . . . . :   *NO
       条件名の定義 . . . . . . . . . :   *NONE
       パフォーマンス収集使用可能化 . :   *PEP
      プロファイル・データ. . . . . . :   *NOCOL
       ライセンス内部コードOPT. . . . :
       生成PGMインターフェース. . . :   *NO
       組み込みディレクトリー . . . . :
       プリプロセッサー・オプション . :   *NONE
    （略）
                                    最　終　の　要　約
       メッセージ合計:
         通知       (00) . . . . . . . :        0
         警告       (10) . . . . . . . :        1
         エラー     (20) . . . . . . . :        0
         重大エラー (30+)  . . . . . . :        0
         ---------------------------------  -------
         合計  . . . . . . . . . . . . :        1
       ソース合計:
         レコード  . . . . . . . . . . :       36
         仕様  . . . . . . . . . . . . :       17
         データ・レコード. . . . . . . :        0
         注記  . . . . . . . . . . . . :       14
              * * * * * *   最　終　の　要　約　の　終　わ　り    * * * * * * *
     プログラムADD10がライブラリーKOINULIBに入れられました。最高の重大度は10。24/01/24の19:36:25に作成されました。
               * * * * * *  コ　ン　パ　イ　ル　の　終　わ　り   * * * * * *
    
    Fetching errors for KOINULIB/ADD10.
    ```
# 6. コンパイルエラーがあったら？
- うまくいかなかったときの挙動も確認します
- 対象ソースをあえて間違えましょう…今回は以下の通り、宣言していない変数`miss`を使ってIF文を書いてみます
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658740/7b20bd76-0419-9c97-e8f8-e615aae7a1fe.png)


- 同様にコンパイルすると、not successfulのポップアップが出ました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658740/9bb80fde-9897-07b5-7aec-e01310b0c4d3.png)
- コンパイルリスト下部を見ます。重要度30で、す、ね
    ```
                              メ　ッ　セ　ー　ジ　の　要　約
      MSG ID  SV 番号 メッセージ・テキスト
     *RNF7031 00      1 名前または標識が参照されていない。
     *RNF3776 10      1 メイン・プロシージャーのプロトタイプ上の外部プログラムが
                        ，作成するプログラムと同じでない。
     *RNF7030 30      1 名前または標識が定義されていない。
     *RNF7503 30      1 式に定義されていないオペランドが含まれている。
            * * * * *   メ　ッ　セ　ー　ジ　の　要　約　の　終　わ　り    * * * *
      5770WDS V7R4M0  190419 RN        IBM ILE RPG             KOINULIB/ADD10           IBMI74     24/01/24 19:50:58        PAGE      8
                                    最　終　の　要　約
       メッセージ合計:
         通知       (00) . . . . . . . :        1
         警告       (10) . . . . . . . :        1
         エラー     (20) . . . . . . . :        0
         重大エラー (30+)  . . . . . . :        2
         ---------------------------------  -------
         合計  . . . . . . . . . . . . :        4
       ソース合計:
         レコード  . . . . . . . . . . :       35
         仕様  . . . . . . . . . . . . :       17
         データ・レコード. . . . . . . :        0
         注記  . . . . . . . . . . . . :       13
              * * * * * *   最　終　の　要　約　の　終　わ　り    * * * * * * *
     コンパイルは停止しました。重大度30のエラーがプログラムで見つかりました。
               * * * * * *  コ　ン　パ　イ　ル　の　終　わ　り   * * * * * *
    
    Fetching errors for KOINULIB/ADD10.
    ```
- 原因は分かっていますが、とりあえず、`RNF7030`をコンパイルリストの中を検索してみましょう
- `Ctl＋F`でテキスト内文字検索をします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658740/8487d4d3-8ca7-bed7-33ba-ad5dbbf68a64.png)
- そうですよね、宣言していないからですよねー…ということがわかりました！
    - 少し文字のずれは気になるものの、5250画面でコンパイルエラーを探す感覚で原因を見つけることができました
        ```
         *RNF7030 30     15 000015  名前または標識MISSが定義されていない。
         *RNF7503 30     15 000015  式に定義されていないオペランドが含まれている。
          * * * * * * * * * *  追　加　の　診　断　メ　ッ　セ　ー　ジ　の　終　わ　り * * * * * * * * * * *
          5770WDS V7R4M0  190419 RN        IBM ILE RPG             KOINULIB/ADD10           IBMI74     24/01/24 19:50:58        PAGE      5
                                        相　互　参　照　表
              ファイルおよびレコードの参照:
                  ファイル        装置             参照(D=定義済み）
                    レコード
                 ソース中に参照がない。
               グローバル・フィールド参照：
                  フィールド      属性             参照（D=定義 M=変更）
                  MAIN              PROTOTYPE               3       9
         *RNF7030 MISS              **UNDEF**              15
                  SUBPRO            A(52)                  16      23
                                    VARYING(2)
                                    PROTOTYPE
        ```


# おわりに
- コンパイルコマンドの微調整は、ぜひ自社の開発ルールに合わせて変更してください
- 個人的にはコンパイルリストが5250画面で見るのと大きく変わらず、RPGⅢで改修していた時との開発の流れの差がないことがよかったです
- FFRPGとRPGⅢの比較の記事化もしてみたいと思っております。ではでは！