IFS上のソースコードの保守
それでは次に、IBM iのIFS上のソースコードの保守およびコンパイル方法についてみていこう。
現在、IBM iでサポートされている言語のコンパイラは、ほとんどがIFS上に保存したソースコードを参照するSRCSTMFパラメータをサポートしている。
Code for IBM iは、IFS上のファイルを参照するIFS BROWSER機能を提供しているので、Visual Studio CodeでIFS上のソースコードを直接編集およびコンパイル可能だ。
ただし注意点が1つある。VSCodeからIFSにソースコードを新規作成すると、ファイルのCCSIDが1208(Unicode)になる。しかし、RPGなどのコンパイラはUnicodeのファイルを直接参照することができない。
この問題を解決するには、コンパイル前にソースコードの CCSID をコンパイラが読み込めるもの(5035や1399など)に変換する必要がある。前項の実行環境にも書いたが、ターゲットのCCSIDを指定するためのパラメータTGTCCSIDを各コンパイラ・コマンドに追加し、内部で変換する機能を追加するPTFがあるので、Code for IBM iを使用する場合は導入しておく必要がある。
このPTFは、IBM i 7.3用5770WDS-SI62605だ。詳細は、Compile RPG from Unicode source – new TGTCCSID parameter in 7.1, 7.2, 7.3(https://www.ibm.com/support/pages/compile-rpg-unicode-source-new-tgtccsid-parameter-71-72-73) を参照してほしい。7.4以降はTGTCCSIDパラメータはデフォルトでサポートされているのでPTFの適用は必要ない。
■ ソースコードの作成
では、実際に先ほど解説したtry01r.rpgleのコードをIFS上に配置して修正およびコンパイルしてみる。
まず、IFS BROWSER で新しいストリーム・ファイルを作成する(図表31)。
ストリーム・ファイルの名称は、先ほどのメンバー名と同じ「try01r.rpgle」とする(図表32)。
作成されたファイルに、先ほどのメンバーのコードをコピー&ペーストで貼り付ける。
コンパイル時のコマンドのパラーメータはIFSのストリーム・ファイルを指定するので、先ほどのコマンドとは異なるアクションとして登録する必要がある点に注意したい。
Code for IBM iは、メンバーとストリーム・ファイルそれぞれにアクションが定義されているので(下記リスト)、細かなパラメータを修正する場合は注意が必要だ。
◎置換変数:説明
・&FULLPATH:IBM i上のファイルのフルパス
・&RELATIVEPATH:ホーム・ディレクトリあるいはワークスペースからのストリーム・ファイルの相対パス
・&PARENT:親ディレクトリあるいはソース・ファイルの名前
・&BASENAME:拡張子を含むファイル名
・&NAME:ファイル名
・&EXT:ファイルの拡張子
・&CURLIB:USER LIBRARY LIST にセットしている現行ライブラリ
・&USERNAME:接続しているユーザー名
・&HOME:作業ディレクトリ名(IFS BROWSER で変更可能)
・&BUILDLIB:&CURLIBと同じ
・&LIBLC:カンマで区切ったライブラリ・リスト
・&LIBLS:スペースで区切ったライブラリ・リスト
タスクバーのアクションをクリックすると表示されるStreamfile以下のコマンドが、IFS 上のソースコードをコンパイルする時に選択されるものだ。Create Bound RPG Program (CRTBNDRPG) および Crea
te Bound RPG Program (CRTBNDRPG) をクリックしてコマンドを確認してみる。TGTCCSID(*JOB) パラメータの指定がなければ、これを追加して保存しておく。
保存したら Ctrl+E をクリックし、Create Bound RPG Program (CRTBNDRPG) を選択するとコンパイルコマンドがIBM i上で実行され、問題なければコンパイルが正常に完了したことを伝えるメッセージが画面右下に表示される(図表33)。
もちろんタスクバーの Output をクリックしてコンパイルリストを参照することも可能だ。
対象となるソースがIFS上に存在していることと、アクションで選択するコマンドがメンバーとは異なる点を除けば、それ以外のできることはソース・メンバーの場合と同じである。
ローカルのソースコードの保守
ここまで、Code for IBM iでIBM iに接続した状態で、ソースファイルのメンバーもしくはIFS上のソースコードを直接追加および修正し、コンパイルする手順をみてきた。
ここからは、開発PCのディスク上にソースコードを作成し、それをIBM i上でコンパイルするまでの流れを見ていこう。
まず、Code for IBM iで接続が作成されていることを前提として、以下の設定をしておく必要がある。
・ソースコードをDeploy(プッシュ)するIFSディレクトリを指定する
・コンパイルコマンドを記述するjsonファイル(.vscode/actions.json)を作成する
ローカルにソースコードを保管した場合、IBM iでコンパイルする時は、それをコンパイル前にIBM iのディスクにDeploy(プッシュ)しなければならない。そのプッシュする場所は、VSCodeでローカルのフォルダーを開いた後、Code for IBM iでIBM iに接続する際に設定を指示されるので、Yesをクリックすることで設定できる(図表34)。
Yesを指定した場合は、IBM iに接続しているユーザーのホームディレクトリ内のbuildsディレクトリに、ローカルのフォルダ名でプッシュする先が設定される。
指示画面でYesをクリックしなかった場合やbuildsディレクトリ以外に保存したい場合は、DeployしたいディレクトリをIFS BROWSERで右クリックし、Set Deploy Workspace Locationをクリックする(図表35)。
Deploy先が正しく設定できているかどうかは、タスクバーに表示されている Deploy をクリックすることで上部に表示される内容で確認できる(図表36、図表37)。
正しく設定がされていない場合は、図表38のメッセージが右下に表示されるので、再度IFSのディレクトリをDeploy先に設定してほしい。
続いてコンパイルコマンドの設定だが、ローカルのソースコードのコンパイルには、先ほど解説したアクションは使用されないので注意したい。代わりに、.vscode/actions.jsonをローカルの開いているフォルダに作成する必要がある。
作成する方法は、IBM i に接続したときに表示されるメッセージのRun Setupをクリックするか、あるいはコマンドパレットで、Launch Actions Setupを実行すると表示される画面(図表39、図表40)で、必要なコマンドを選択して右上のOKボタンをクリックする。
すると、VSCodeで開いているフォルダーに .vscode/actions.jsonファイルが作成される(図表41)。
■ コーディングおよびコンパイル
では、ローカルにソースコードを作成し、それを Deploy/コンパイルする手順を見ていこう。
まず前項で作成したtry01r.rpgleのソースコードをOBJECT BROWSERで開き、ソースをCtrl + A/Ctrl + Cで選択およびコピーする(図表42)。
続いて、VSCodeの エクスプローラー・アイコンをクリックしてフォルダーを開き、ファイル作成アイコンをクリックして、try01r.rpgle という名称でファイルを作成し、コピーしたソースコードを Ctrl + v で貼り付けて保存する(図表43)。
続けてコンパイル。Ctrl + E で上部に表示される Create RPGLE Program を選択すると、図表44の情報が画面に表示される。
今回は、.vscode/actions.jsonとtry01r.rpgleの2つのファイルがまだアップロードされていないので、「2 changes detected since last upload.」と表示されている。これをクリックすると、先に指定したDeploy先のIFSディレクトリにソース・ファイルがプッシュされ、続いてコンパイルが実行される。
今回の例では、正しいコードをコピーしているので、問題なくコンパイルできるはずだ。もちろん、ステータス・バーのOutputをクリックしてコンパイルリストを参照することもできる。
SEU/PDMの代わりになるのか?
「Code for IBM iについて」でも触れたが、RPG ⅢのコンパイラはIFS上に存在するソースコードを直接参照することができない(CRTRPGPGM コマンドにSRCSTMFパラメータがない)。そして、Code for IBM iは、ローカルのコードをIBM i上のソースファイルのメンバーに直接プッシュすることができない。つまり、このままだとRPG Ⅲのソースコードを開発PCのフォルダに保存してコーディングできないことになり、そうなるとGitでのバージョン管理もできないということになる。
これに関しては、
1. RPG Ⅲコードは従来のSEU/PDMで開発および保守する
2. RDiを使用する
3. それ以外の方法を考える
の3通りで対応することになる。
まず、1番目については、そもそもGitでのバージョン管理ができないのでこの選択肢は避けたい。2番目のRDiについては、iプロジェクトを使えばGitで管理できることはi Magazine 2021年秋号「IBM iユーザーに捧げるGit入門」で解説したので、RDiユーザーはそちらを参照いただきたい。
今回はVSCode+Code for IBM iの記事なので、できれば3番目の解決策として何とかこの環境でできないかを考えてみよう。
最終的にコンパイラCRTRPGPGMコマンドが参照できるソース・ファイルのメンバーにプッシュできればよいので、以下の手順で作業すればよい。
① VSCodeでローカルのフォルダにソースコードを保管する
② Code for IBM iの機能を使って事前に設定したIFSディレクトリにソースコードをDeploy(プッシュ)する
③ IFSのストリーム・ファイルを CPY コマンドを使ってソース・メンバーにコピーする
④ CRTRPGPGM コマンドを実行する
①と②はここまでの説明で可能なことは確認できたので、③と④をどう実現するかだが、実はこれを実行するためのオープンソースのコマンド(CRTFRMSTMF)が存在する。
https://GitHub.com/BrianGarland/CRTFRMSTMF
上記GitHubのREADME.mdには、次のようにある。
「CRTFRMSTMFは、ストリーム・ファイルをサポートしていないCRTxxxコンパイルコマンドのWrapperです(CRTFRMSTMF is a wrapper over theIBM i
CRTxxx compile commands that do not allow a stream file.)」
wrapperとは「包む」とか「包装紙」の意味で、このコマンドは上記③および④を実行する機能を提供してくれる。
さらにREADME.mdのインストール手順を見ると、
1. リポジトリをクローンする
2. gmake を実行する
とある。gmakeもyumでインストールするコマンドだが、今回はこれを使用せずにIBM iでオブジェクトを作成するまでの手順を紹介しよう。
まず、リポジトリのクローンは、上記GitHubのサイトでCodeボタンをクリックし、httpsのURLをコピーボタンでコピーする(図表45)。
次に、クローン先のフォルダを開発PCに作成し、VSCodeを起動する。前回のフォルダが表示された場合は、「ファイル」- 「新しいウインドウ」をクリックする。
作業の開始タブの「Gitリポジトリのクローン…」リンクをクリックし、コピーしたリポジトリURLをペーストしてエンターキーを押す。フォルダの選択ウインドウが表示されるので、先ほど作成したフォルダを選択すると、クローンが実行された後、リポジトリを開くかと聞かれるので「開く」をクリックする(フォルダーの作成者は信頼)。
クローンが完了するとフォルダ内にQSOURCEフォルダが作成され、それを展開すると、以下の4つのソース・ファイルがダウンロードされていることが確認できる。これをCode for IBM iの機能を使用してIBM iのIFSディレクトリにプッシュしてみよう。
cl_dltf.clle
crtfrmstmf.cmd
crtfrmstmf.pnlgrp
crtfrmstmf.rpgle
まずCode for IBM iでIBM iに接続し、Deploy(プッシュ)先を/home/IMAG23WINT に設定したうえで、ステータス・バーのDeployをクリック、上部に表示された選択肢の一番下の「All Every file in the local workspace」をクリックして全ファイルを Deploy(プッシュ)する(図表46)。
今回は *MODULE オブジェクトを作成して、複数モジュールから *PGM オブジェクトを作成するという流れが必要である。このコマンドは .vscode/actions.
json に登録されていないので、PASE ターミナルで system コマンドを使って以下のコマンドを実行した(もちろん5250エミュレータで実行してもよい)。
モジュール
CRTCLMOD MODULE(IMAG2023/CL_DLTF) SRCSTMF(‘/home/IMAG23WINT/QSOURCE/cl_dltf.clle’)
CRTRPGMOD MODULE(IMAG2023/CRTFRMSTMF) SRCSTMF(‘/home/IMAG23WINT/QSOURCE/crtfrmstmf.rpgle’) TGTCCSID(*JOB)
プログラム
CRTPGM PGM(IMAG2023/CRTFRMSTMF) MODULE(IMAG2023/CRTFRMSTMF IMAG2023/CL_DLTF)
コマンド
CRTCMD CMD(IMAG2023/CRTFRMSTMF) PGM(IMAG2023/CRTFRMSTMF) SRCSTMF(‘/home/IMAG23WINT/QSOURCE/crtfrmstmf.cmd’) HLPPNLGRP(IMAG2023/CRTFRMSTMF) HLPID(*CMD)
各オブジェクトの関連は図表47を参考にしてほしい。
CRTFRMSTMF コマンドのパラメータは以下の通り。
◎キーワード:記述:選択項目
・OBJ:プログラム・オブジェクト名およびライブラリ名:修飾オブジェクト名
・CMD:コンパイル・コマンド:CRTCMD、CRTDSPF、CRTPRTF、CRTRPGPGM、CRTPNLGRP、CRTPF、CRTPF など
・SRCSTMF:ソース・ストリーム・ファイル:パス名
■ .vscode/actions.json へ追加
次に、CRTFRMSTMFコマンドを使用して、ローカルのRPG Ⅲのソースコードをコンパイルできるように、上記コマンドを .vscode/actions.jsonに追加しておく(図表48)。
コマンドのヘルプ情報は、パネル・グループ・オブジェクトが提供している。これも作成コマンド CRTPNLGRP があるが、このコマンドも SRCSTMF パラメータは提供されていない。これもRPG Ⅲ同様VSCode+Code for IBM i環境でコンパイルできるようにアクションを追加しておいた。
では、パネル・グループを作成してみよう。
VSCodeで、QSOURCEフォルダ内のcrtfrmstmf.pnlgrpをオープンし、Ctrl + Eで先ほど登録したCreate Panel Groupを選択する。アクションが成功した旨のメッセージが表示されるはずなので、ステータス・バーのOutputをクリックして、コンパイルリストも念のため確認しておこう。
■ RPG ⅢもGitで管理可能
これで、ローカルのフォルダにRPG Ⅲのコードを保存しつつ、Ctrl + EでDeploy +コンパイルすることが可能になった。繰り返し記しているようにRPG Ⅲのプロンプト機能は提供されていないので、一からのコーディングは難しいかもしれないが、ほとんどの場合、似たようなプログラムのコードをコピーして作成するケースが多いはずなので、Gitでバージョン管理できるようになることを考えると、このコマンドを使う意味はとても大きいと思う。
Code for IBM i |目次
Part1 Code for IBM iについて
Part2 開発環境俯瞰図
Part3 基本的な使い方
Part4 ソースコードの保守
Part5 Code for IBM i以外の便利な拡張機能
Part6 DeepL API を使った翻訳プログラムの作成と実行
著者|
小川 誠氏
ティアンドトラスト株式会社
代表取締役社長 CIO CTO
1989年、エス・イー・ラボ入社。その後、1993年にティアンドトラストに入社。システム/38 から IBM i まで、さまざまな開発プロジェクトに参加。またAS/400 、IBM i の機能拡張に伴い、他プラットフォームとの連携機能開発も手掛ける。IBM i 関連の多彩な教育コンテンツの作成や研修、セミナーなども担当。2021年6月から現職。
[i Magazine 2023 Winter掲載]