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解説書にもこの使用方法の例が無いので紹介した。