$ZROutines

$ZRO[UTINES] は、オブジェクトファイルを含むディレクトリまたはディレクトリ リストを指定する文字列の値が含まれています。各オブジェクトディレクトリには、対応するソースファイルを含む、関連するディレクトリまたはディレクトリリストも持つことができます。これらのディレクトリリストは、オブジェクトとソースファイルの位置を見つけるために、特定のGT.M関数、auto-ZLINKによって使用されます。ディレクトリが与えられたリストの中で現れる順序は、それらが適切なアイテムを検索する順序を決定します。

$ZROUTINESを使用する検索は、オブジェクトまたはソースファイルのどちらか一方をファイルとして扱います。GT.M は、オブジェクトファイルとして .o 拡張子を持つファイルを扱い、ソースファイルとして .m 拡張子を持つファイルを扱います。

[注意] 注意

ルーチンの場所を見つけるために$ZROUTINESで使用されるパスは、$ZROUTINESが区切り文字としてスペースを使用すると、埋め込んだスペースを含めることはできません。

$gtmroutines からの値を確立

環境変数 gtmroutinesが定義されている時は、GT.Mは gtmroutines の値に$ZROUTINESを初期化します。そうでなければ、GT.Mはヌル値で$ZROUTINESを初期化します。$ZROUTINESがnullの時、GT.Mは、現在の作業ディレクトリにすべてのソースとオブジェクトファイルの場所を検索すること試みます。$ZROUTINES="" と $ZROUTINES="." は等価です。

DO、GOTO、ZGOTO、ZBREAK、ZPRINT、$TEXT などのようなコマンドや関数は、auto-ZLINKするでしょうし、それによって、間接的に$ZROUTINESを使用します。もしそれらの引数がディレクトリを指定しない場合、ZEDITと明示的ZLINKは、$ZROUTINESを使用します。もしGT.Mがオブジェクトファイルによって指し示すソースファイルを見つけることができない場合は、ZPRINTと$TEXTはソースファイルの場所を検索するために $ZROUTINES を使用します。ZLINKとauto-ZLINKの詳細については、開発サイクルコマンド の章を参照してください。

$ZROutinesの値を設定

$ZRO [UTINES] は 、read-write可能な固有の特殊変数ですので、Mもまた値をSETできます。

デフォルトでは、$ZROUTINES内の各ディレクトリエントリは、オブジェクトとソースファイルの両方を含むことが想定されます。ただし、各オブジェクトのディレクトリは、対応するソースファイルを検索するために関連するディレクトリやディレクトリリストを持つ場合があります。これは、オブジェクトディレクトリの指定に続き、括弧内に、ソースディレクトリリストの指定によって行われます。

もしコマンドがオブジェクトのディレクトリに対して1つ以上のソースディレクトリを指定している場合、ソースディレクトリは、スペースで区切る必要がありますし、リスト全体はオブジェクトディレクトリ指定に続くカッコ () で囲む必要があります。もしオブジェクトディレクトリがソースを検索する必要がある場合、そのディレクトリの名前は、(通常はリストの最初の要素として)、括弧内に含まれている必要があります。ディレクトリ仕様は、あたかも特定されたディレクトリ内で位置を検索されたオブジェクトに対して、ソースファイルが存在しないかのように続行するためにGT.Mへの指示に、空の括弧を含めることができます。

Mの外部から$ZROUTINESを設定するには、gtmroutinesを設定して適切なシェルコマンドを使用します。gtmroutinesはリストなので、引用符 (" ") で値を囲みます。

現在の呼び出しのために唯一最後のGT.Mが呼び出しをしている間に、$ZROUTINESの値の変更をしますが、gtmroutinesの値は変更しないでください。

ディレクトリ指定は環境変数に含めることができます。GT.Mが$ZROUTINESをSETする時、それはすべての環境変数を変換し、シンタックスとすべての指定されたディレクトリの存在を検査(verify)します。もし$ZROUTINESに無効な値が設定されている場合は、GT.Mは実行時エラーを生成し、$ZROUTINESの値を変更しません。環境変数は、$ZROUTINESがセットされている時に変換されるので、$ZROUTINESが再びセットされるまで、それらの定義の変更は効果がありません。

$ZROutines の例

例:

GTM>s $zroutines=".(../src) $gtm_dist"

この例では、最初に現在のディレクトリ内で、次にパーセントルーチン(%routine)が含まれているディストリビューションのディレクトリ内で、オブジェクトモジュールを探すためにGTMに指示をします。兄弟である /srv ディレクトリで、カレントディレクトリ内のオブジェクトによって、GT.Mがsourceの位置を検索します。

例:

$ gtmroutines="/usr/jones /usr/smith"
$ export gtmroutines
$ gtm
GTM>write $zroutines
"/usr/jones /usr/smith"
GTM>set $zro="/usr/jones/utl /usr/smith/utl"
GTM>write $zroutines
"/usr/jones/utl /usr/smith/utl"
GTM>halt
$ echo $gtmroutines
/usr/jones /usr/smith

この例では、環境変数 gtmroutinesを定義します。GT.Mダイレクトモードに入ると、$zroutines は、gtmroutinesから提供される値を持ちます。SETコマンドで値を変更します。GT.Mのイメージが終了すると、シェルのechoコマンドは、gtmroutines がMのSETコマンドによって変更されていないことを示しています。

例:

GTM>SET $ZRO=". /usr/smith"

この例は、2つのディレクトリを含むリストに$zroutinesを設定します。

例:

GTM>set $zro="/usr/smith(/usr/smith/tax /usr/smith/fica)"

この例では、GT.Mがオブジェクトファイル用のディレクトリ /usr/smith を検索し、ソースファイルをディレクトリ /usr/smith/tax と /usr/smith/fica を検索することを指定します。この例で注意してください。GT.Mは、ソースファイルを/usr/smith で検索しません。

例:

GTM>set $zro="/usr/smith(/usr/smith /usr/smith/tax /usr/smith/fica)"

この例では、GT.Mがオブジェクトファイル用のディレクトリ /usr/smith を検索し、ソースファイルをディレクトリ /usr/smith/tax と /usr/smith/fica を検索することを指定します。この例と1つ前の例との間の違いは、GT.Mがオブジェクトとソースファイルの両方のために、/usr/smith を検索することに注意してください。

例:

GTM>set $zro="/usr/smith /usr/smith/tax() /usr/smith/fica"

これは、GT.Mが /usr/smith と /usr/smith/fica でオブジェクトとソースファイルを検索するように指定します。しかし、空の括弧はオブジェクトファイルだけを検索するディレクトリを示しているので、GT.Mは、 /usr/smith/tax でソースファイルを検索しません。

括弧を省略すると、GT.Mがソースとオブジェクトファイルの両方のディレクトリを検索できることを示します。$ZROUTINES=/usr/smith と $ZROUTINES=/usr/smith(/usr/smith) は等価です。

$ZROutines のサーチタイプ

GT.Mは、$ZRO[UTINES]を使用して、検索の3つのタイプを実行します:

  • $ZROUTINESを使用しているコマンドや関数は .oファイル拡張子を必要とする時は、オブジェクトのみ

  • $ZROUTINESを使用しているコマンドや関数は .o 以外のファイル拡張子を必要とする時は、ソースのみ

  • $ZROUTINESを使用しているコマンドや関数がファイル拡張子を指定しない時は、オブジェクトとソースにマッチ

.OBJ でない.o 拡張子を指定する明示的なZLINKは、上記の検索の目的のためにファイル拡張子を指定していない関数として考えられています。

すべての検索は、$ZROUTINESを通じて左から右に進みます。デフォルトでは、GT.Mは、ソースファイルとオブジェクトファイルの両方のディレクトリを検索します。GT.Mの検索ディレクトリは、オブジェクトファイルに空のカッコ () が続きます。GT.Mは、ソースファイルを括弧内だけのディレクトリを検索します。

いったん、オブジェクトマッチング検索がオブジェクトファイルの位置を検索すると、ソースの検索が限定されます。オブジェクトファイルを含むディレクトリが、ディレクトリの添付の括弧リストがある場合は、GT.Mはソースファイルをマッチングするための添付リストでディレクトリを検索します。もしオブジェクトファイルを含むディレクトリに以下の括弧がない場合は、GT.Mは同じディレクトリにソースファイルを照合するための検索を制限します。もしオブジェクトモジュールが、空の括弧で修飾ディレクトリにある場合は、GT.Mは、ソースファイルを参照する任意の操作を実行できません。

次の表は、$ZROUTINESとそれらがサポートする検索タイプを使用して、GT.Mのコマンドと関数を示します。

GT.Mコマンドと$ZROUTINESの検索タイプ

検索/
関数

ファイル 
拡張機能
指定

検索タイプ

   

OBJ-ONLY

SRC-ONLY

MATCH

EXPLICIT

ZLINK

.o

X

   
 

Not .o

   

X

 

None

   

X

AUTO-ZLINK

None

   

X

ZEDIT

Not .o

 

X

 

ZPRINT

None

 

X

 

$TEXT

None

 

X

 

もし、ZPRINTや$TEXT() が現在のイメージにないルーチンのソースモジュールを必要とする場合は、GT.Mは一致した検索でauto-ZLINKを最初に実行します。

ZPRINTや$TEXTは、オブジェクトモジュール内に位置するソースファイルのファイル特性を使用してソースモジュールの位置を探します。もしGT.Mがそれがコンパイルされた時にそれがあったディレクトリ内のソースモジュールを見つける場合、ランタイムシステムは$ZROUTINESを使用しません。もしGT.Mが指示された位置にソースファイルを見つけることができない場合、ランタイムシステムは $ZROUTINESを使用します。

$ZROutines のサーチの例

このセクションでは、もし厳密にトピックを検査する場合に役立つことができるならば、$ZROUTINES 操作を理解するためのモデルと説明する事例について、説明をします。

ファイルを探す場所の二次元の行列(マトリックス)の供給として、$ZROUTINES を考えることができます。行列(マトリックス)は、1つ以上の行があります。行列の最初の行はオブジェクトを探し場所を含み、2番目と次の行がソースを探すための場所を含みます。各列は、列の最初の行でオブジェクトモジュールに関連する情報が含まれている場所のセットを表します。

例:

GTM>s $zro=". /usr/smi/utl() /usr/jon/utl
(/usr/jon/utl/so /usr/smi/utl)"

次の表は、この$ZROUTINESのマトリックス図を示します。

$ZROutines の検索マトリックス

SEARCH FOR

Column 1

Column 2

Column 3

オブジェクト

.

/usr/smi/utl

/usr/jon/utl

SOURCE

.

 

/usr/jon/utl/so

     

/usr/smi/utl

オブジェクトのみを検索するには、GT.Mは、カラム1 から始まる各列の上部に "object" の行でディレクトリまたはオブジェクトライブラリだけを検索します。もしGT.Mが、列の "objects" 行でディレクトリまたはオブジェクトライブラリでオブジェクトファイルを見つけられない場合、GT.Mは、次の列で再び検索が開始します。もしGT.Mが、任意の列でファイルを見つけることができない場合、それは実行時エラーを発行します。

上記の表に示すように、GT.Mは、 . ,/usr/smi/utl and /usr/jon/utl ディレクトリ内のオブジェクトファイルのために検索します。

ソースのみの検索を実行するには、object-only ディレクトリ(つまりソースディレクトリの空のリストで構成されている、それらオブジェクトディレクトリ) またはオブジェクトライブラリによって率いられた列を除き、GT.Mは、"source" 列を各列の下部に見下ろします。もしGT.Mが、列の "source" 行にソースファイルを見つけることができない場合、それは次の適格な列を検索します。

オブジェクト-ソースをマッチする検索を実行するには、GT.Mは、カラム1 から始まる各列を探します。GT.Mは、列の "objects" 行でオブジェクトのみ(object-only) の検索を行い、列の "source" 行(s) でソースのみ(source-only) の検索を行います。もしGT.Mが、オブジェクトファイルまたはソースファイルのどちらかの位置を探す場合、検索が完了します。そうで無い場合、GT.Mは、次の列を検索を開始します。もしGT.Mが、任意の列で、オブジェクトファイルまたはソースファイルのいずれかを見つけられない場合、それは実行時エラーを発行します。

上記の表に示すように、GT.Mは、カラム1にある "." ディレクトリ内のソースファイルのために検索します。もしGT.Mが" . " でソースファイルを見つけることができない場合は、オブジェクトのみ(objext-only) のディレクトリがあるので、それはカラム2を省略し、そして、、代わりにカラム3を検索します。カラム3は /usr/jon/utl/so と /usr/smi/utl を指定しているので、GT.Mは、カラム3でこれらのディレクトリ内のソースファイルを検索し、/usr/jon/utl ではしません。もしGT.Mがカラム3 でソースファイルを見つけることができない場合、それは検索を終了し実行時のエラーを発行します。

オブジェクト-ソースのマッチ検索が終了してしまうと、GT.Mは、利用が可能な、オブジェクトファイルかまたはソースファイルのどちらか一方か、または、両方共を保持します。次に、現在のイメージにオブジェクトファイルをリンクする前に、GT.Mは特定の条件に基づいてソースファイルをコンパイルします。それらの条件の詳細は、 “ZLink”を参照してください。

もし auto-ZLINKまたはZLINKがソースファイルの [再]コンパイルを必要と判断した場合、GT.Mは、ソースファイルと同じ列に、上記のオブジェクト ディレクトリにオブジェクトファイルを配置します。例えば、もしGT.Mが カラム3で /usr/smi/utl にソースを位置付ける場合、GT.Mは /usr/jon/utl に結果としてオブジェクトファイルを配置します。

$ZROUTINESの共有ライブラリファイルの指定

$ZROUTINES 特殊変数( Intrinsic Special Variable :ISV)は、検索パスで指定する個々のUNIX共有ライブラリファイル名を可能にします。auto-ZLINKの検索中に、共有ライブラリが検出されると、与えられたルーチンを探索し、見つかった場合、そのルーチンがイメージにリンク/ロードされます。明示的なZLINKの間に、$ZROUTINES内のすべての共有ライブラリは無視され、与えられたルーチンは検索されません。

$ZROUTINESのシンタックスは、ファイル仕様を示す共有ライブラリファイルのパスが含まれています。GT.Mは、$ZROUTINESの共有ライブラリのコンポーネントの任意に名付けられた拡張子を必要としません。ディレクトリが名付けられていない任意のファイル指定は、共有ライブラリとして扱われます。しかし、共有ライブラリファイルに与えられたプラットフォーム上で一般的に使用される拡張子は、任意のGT.M共有ライブラリに与えられることを推奨します。GT.Mの共有イメージをリンク”を参照してください。共有ライブラリのコンポーネントは、ソース・ディレクトリを指定することはできません。GT.Mは、$ZROUTINESの共有ライブラリで任意のソースディレクトリを関連付けることを試む時にエラーを報告します。

$ZROUTINESの以下の特性は、共有ライブラリサポートを支援します:

  • $ZROUTINESの検索は、最初の場所でオブジェクトを検索し、左から右へ処理し、コピーを保持することをし続けます。それは、引き続く場所ですべてのコピーを無視します。しかし、現在auto-ZLINKのために、共有ライブラリは、ディレクトリとしてオブジェクトを提供するために同じ能力を持つオブジェクトのリポジトリとして受け入れられています。

  • 明示的なZLINKは、共有ライブラリをけっして検索はしません。これは、明示的なZLINKが新しく作成されたルーチンまたは再リンクが必要な修正ルーチンをリンクするために使用されているのであり、アクティブな共有ライブラリに新しいオブジェクトをロードするメカニズムではありません。

  • 共有ライブラリ内のルーチンのZPRINTと$TEXT() は、ロードされたルーチンのヘッダからソースファイルのパスを読ます。もしイメージがルーチンを含んでいない場合、auto-ZLINKが開始されます。もし、モジュールがコンパイルされた時に、ルーチンのヘッダーに記録されているソースファイルのパスが見つからない場合は、ZPRINTと$TEXT() は、共有ライブラリファイルの指定を無視し、$ZROUTINESの最初から検索を開始します。もし検索されたソースがイメージの中のコードとマッチしない場合(チェックサムを経由してのチェック)、ZPRINTはオブジェクト-ソースの不一致の状況を作り、$TEXT() はヌル文字列を返します。

  • ZEDITは、$ZROUTINESを検索するときに、同じ理由で明示的なZLINKのような共有されたライブラリを無視します。$ZSOURCE 特殊変数 Intrinsic Special Variable は、暗黙的に適切なソースファイルに設定されています。

たとえば、もし libshare.so が ./shrsrc/foo.m からコンパイルされた foo.o で構築されている場合、do ^foo が検出される時に、GT.Mはシンボル fooによってライブラリ ./libshare.so を検索する必要があることを、次のコマンドで指定します。

GTM>SET $ZROUTINES="./libshare.so ./obj(./shrsrc)"
GTM>DO ^foo;auto-ZLINK foo - shared
GTM>ZEDIT "foo";edit ./shrsrc/foo.m
GTM>W $ZSOURCE,!;prints foo
GTM>ZPRINT +0^foo;issues a source-object mismatch status TXTSRCMAT error message
GTM>ZLINK "foo";re-compile ./shrsrc/foo.m to generate ./obj/foo.o.
GTM>W $TEXT(+0^foo);prints foo

foo.m が既にイメージにリンクされたルーチンにマッチしていないとして、ZPRINTによってエラーが報告することに注意してください。またZEDITされた foo.m を再コンパイルしたり再リンクするには、そのソースディレクトリは、$ZROUTINESでオブジェクトディレクトリ [ ./obj ] に添付する必要があることに注意してください。例では、共有ライブラリ(libshare.so)が、シェルコマンドを使用して構築されていることを前提としています。生成されたオブジェクト ( .o ) ファイルのGT.Mのリストから共有ライブラリをビルドする手順については、 GT.Mの共有イメージをリンクする” を参照してください。

GT.Mの共有イメージをリンク

以下は、$ZROUTINESを持つGT.Mの共有イメージのリンクを使用することを取られるために必要な手順(UNIXシステムのコマンドとGT.Mコマンド)です。

オブジェクト( .o )ファイルへソース( .m )ファイルをコンパイル

Mルーチンを共有するためには、GT.Mは、位置が独立しているコードを持ち、共有ライブラリの主要な要件であって、GT.M V4.4-000以降のリリースでは自動的に行われる、オブジェクト( .o )を生成します。コンパイル手順には変更は必要ありません。しかし、以前のリリースで生成されたオブジェクトは、再コンパイルの必要があります。

オブジェクト(.o) ファイルから共有ライブラリを作成

共有ライブラリを作成するには、次のシンタックスを使用します:

ld -shared -taso -o libshr.so file1.o file2.o -lc (on Tru64 )
[注意] 注意

Tru64で共有ライブラリを作成する時、さまざまな未定義シンボルのワーニング報告から ld を防ぐために、Cライブラリ(リンク行の末尾に- lcオプション)でリンクすることを、FISは提案しています。これらのワーニングは、GT.M共有ライブラリルーチンの使用には関係ありませんが、Cライブラリとのリンク操作では警告を除去します。

ld -brtl -G -bexpfull -bnoentry -b64 -o libshr.so file1.o file2.o (on AIX)
ld -b -o libshr.sl file1.o file2.o (on HP-UX)
ld -shared -o libshr.so file1.o file2.o (on Linux)
ld -G -64 -o libshr.so file1.o file2.o (on Solaris)
xlc -q64 -W c,DLL,XPLINK,EXPORTFULL -W l,DLL,XPLINK -o libshr.so file1.o file2.o (on z/OS)

libshr.so が共有ライブラリの名前に置き換えられるその場所に、1つを作成することを望んでいます。file1.o とfile2.oは、ユーザが共有ライブラリに置くことを望んでいることをGT.Mコンパイラによって作成された1つ以上のオブジェクトファイルに置き換えられます。入力ファイルのリストも、 -input オプション(Tru64) や -fオプション(AIX) や -cオプション(HP-UX) を使ってコマンドライン上で、ファイルに置いてその後に明示できることに注意してください。上記の各オプションの詳細については、特定のプラットフォーム上で、ld の manページを参照してください。

[注意] 注意点
  • GT.Mがアクティブな共有ライブラリへの追加や変更をサポートしていないとして、ソースディレクトリは、$ZROUTINESで共有ライブラリを指定することはできません。

  • 共有ライブラリ内のルーチンを検索は、二段階のプロセスがあります:

    • ライブラリをロード

    • Mの入口参照( entryref )に対応するシンボルをルックアップ

    GT.Mは、最初のステップを(共有バイナリのサポートがまったくないプラットフォーム上で)常に実行するので、プロセスのフットプリントを最小限に保つために注意して$ZROUTINESの中で共有ライブラリを使用してください。すべてのプラットフォームで、$ZROUTINESで使用されていない共有ライブラリを含まないことを、強く推奨します。

  • 共有ライブラリの割り当て問題を軽減することに役立ついくつかのツールが、AIXにはあります。AIXの/usr/bin/genkldコマンドは、現在ロードされている共有ライブラリのすべてが一覧表示されます。このコマンドは、AIX 4.3.3上ではroot権限が必要ですが、AIX 5では一般ユーザのコマンドのようです。/usr/sbin/slibcleanコマンドは、root権限を必要とし、新規にロードされるライブラリのためのルームを作り、使用されていない共有ライブラリの中の共有ライブラリのセグメントを一掃(purge)します。

gtmroutines から$ZROUTINESを確立する

環境変数 gtmroutinesが定義されている時は、GT.Mは gtmroutines の値に$ZROUTINESを初期化します。$ZROUTINES 特殊変数 (Intrinsic Special Variable :ISV ) は、SETコマンドを使用して変更することができます。

例:

$ gtmroutines="./libabc.so ./obj(./src)"
$ export gtmroutines
$ mumps -direct
GTM>w $ZROUTINES,!;writes "./libabc.so ./obj(./src)"
GTM>do ^a;runs ^a from libabc.so
GTM>do ^b;runs ^b from libabc.so
GTM>do ^c;runs ^c from libabc.so
GTM>h
$
自動再リンク用のZROUTINES設定

単一のアスタリスク(*)で $ZROUTINES の1つ以上のディレクトリ名に接尾辞を付けることによって、プロセスはそれらのディレクトリに公開されたオブジェクト・ファイルの更新を購読することができます。DO、GOTO、ZGOTOの呼び出し時に、ルーチン名(ルーチン名のないラベルに対して)を含むエントリ参照(entryref)を指定する外部関数$TEXT() または ZPRINTは、mumpsプロセス(およびトリガ・ロジックを実行するmupipプロセス)が自動的に再リンク("auto-relink")し、発行されたルーチンの新しいバージョンを実行します。

  • ラベル参照(ルーチン名なし)は、直接か間接かに関わらず、常に現在のルーチンを参照し、自動再リンク・ロジックを呼び出さない。

  • gtmroutines環境変数のディレクトリ名にアスタリスクを付加する場合は、シェルの引用符規則を使用します - アスタリスクはGT.Mに渡され、シェルによって展開されません。

  • GT.Mは、自動再リンクを提供しないx86プラットフォーム上の32ビットLinux上のディレクトリ名に対するアスタリスク接尾辞を受け入れますが無視します。

  • $ZROUTINESを変更すると、プロセス内の自動再リンク対応ディレクトリからリンクされたすべてのルーチンが再リンクされます。FISでは、次回のプロダクション・リリースでエラーが発生する予定です。

ZRUPDATEコマンドは、新しいバージョンのルーチンをサブスクライバに発行します。

inserted by FC2 system