RPG

88. 同じRPGソースで複数のOS400対応のコンパイルをするには?

OS400のリリースに依存する新しい命令を使用したいのだが対応していない古いOS400用

にもコンパイルしなければならない。

OS400のリリース別にソースを分けてしまうと維持管理が面倒にもなるし、保守の間違いや

漏れを発生する可能性がある。

このような場合への対応を紹介する。

V3R7M0 からはRPGコンパイル・コマンドには「条件名の定義」というパラメータが追加

されている。

ここにユーザーが指定する任意の文字列を定義すると、コンパイラーは、それに従って

コンパイル時にソースの一部を除去してコンパイルしてくれることが可能となる。

例えば OS400 V4R4M0 からは H仕様書にバインド・ディレクトリーを

H BNDDIR('QC2LE')

のように指定することができる。

BNDDIR を記述しておけばCRTPGMCRTBNDRPG でバインド・ディレクトリーを

指定する必要がないという便利な機能である。

ところが V3R7M0 では BNDDIR を指定することはできない。

そこで、この記述を

 /IF NOT DEFINED(V3R7M0)
H BNDDIR('QC2LE')
 /ENDIF

と記述しておくと、V4R4M0環境でコンパイルすると BNDDIR はソースの一部として認識されて

コンパイルされる。

一方、この同じRPGソースを V3R7M0 環境でコンパイルするときには

    条件名の定義 .................... V3R7M0

と指定してコンパイルすると、BNDDIR の行は除去されるのでコンパイル・エラーは発生すること無く、

正常にコンパイルは終了する。

この手法は複数台の iSeries400を保有していて、異なるリリース対応へのコンパイルが必要な

ソフトウェア・ハウスには有効な手段である。

弊社のRPGエンジンは、この手法によって異なるリリースに対して、同一のソースでコンパイル

されている。また C言語では、この手法はめずらしいものではない。

卑近な例としてあの「Perl」は数多くのOSプラットフォームに対応するためにこの手法を利用している。

IBM RPG解説書にもこの使用方法の例が無いので紹介した。