OS400のリリースに依存する新しい命令を使用したいのだが対応していない古いOS400用
にもコンパイルしなければならない。
OS400のリリース別にソースを分けてしまうと維持管理が面倒にもなるし、保守の間違いや
漏れを発生する可能性がある。
このような場合への対応を紹介する。
V3R7M0 からはRPGコンパイル・コマンドには「条件名の定義」というパラメータが追加
されている。
ここにユーザーが指定する任意の文字列を定義すると、コンパイラーは、それに従って
コンパイル時にソースの一部を除去してコンパイルしてくれることが可能となる。
例えば OS400 V4R4M0 からは H仕様書にバインド・ディレクトリーを
H BNDDIR('QC2LE')
のように指定することができる。
BNDDIR を記述しておけばCRTPGM
や CRTBNDRPG
でバインド・ディレクトリーを
指定する必要がないという便利な機能である。
ところが V3R7M0 では BNDDIR
を指定することはできない。
そこで、この記述を
/IF NOT DEFINED(V3R7M0) H BNDDIR('QC2LE') /ENDIF
と記述しておくと、V4R4M0環境でコンパイルすると BNDDIR
はソースの一部として認識されて
コンパイルされる。
一方、この同じRPGソースを V3R7M0 環境でコンパイルするときには
条件名の定義 .................... V3R7M0
と指定してコンパイルすると、BNDDIR
の行は除去されるのでコンパイル・エラーは発生すること無く、
正常にコンパイルは終了する。
この手法は複数台の iSeries400を保有していて、異なるリリース対応へのコンパイルが必要な
ソフトウェア・ハウスには有効な手段である。
弊社のRPGエンジンは、この手法によって異なるリリースに対して、同一のソースでコンパイル
されている。また C言語では、この手法はめずらしいものではない。
卑近な例としてあの「Perl」は数多くのOSプラットフォームに対応するためにこの手法を利用している。
IBM RPG解説書にもこの使用方法の例が無いので紹介した。