Tatara

第23章
TANRENが
オブジェクト・ファイルを探す場所

SUB.TROのように、ドライブもディレクトリも付けずに指定したオブジェクト・ファイルは、複数の場所にある可能性があります。この章では、TANRENがそれをどこで探すか、環境変数TANRENがどう関わるか、そしてオブジェクト・ファイルがカレント・ディレクトリ以外で見つかったときに出力ファイルがどこに書き出されるかを説明します。

TANRENは、TATARAがインクルード・ファイルを探すのと同じようにオブジェクト・ファイルを探します(13章)。ただし、INCLUDEの行があるファイルの代わりに、リンク・ファイルが使われます。

23.1 3つの場所

TANRENは、オブジェクト・ファイルを次の3つの場所でこの順に探し、最初に見つかったものを使います。

  1. そのオブジェクト・ファイルをリンク・ファイルで指定した場合は、そのリンク・ファイルのディレクトリ(22章)
  2. カレント・ディレクトリ
  3. 環境変数TANRENに書いたそれぞれのディレクトリ(左から順に)

1つのコマンドについての3つの場所を、図23.1に示します。BUILDにあるPROG.LNKはmainとsubを指定しています。TANRENはSUB.TROをリンク・ファイルと同じBUILDから読み、カレント・ディレクトリやTATARA\LIBにあるものまでは探しません。BUILDにはMAIN.TROがないので、カレント・ディレクトリにあるものを使います。

PIC

図 23.1: TANRENがオブジェクト・ファイルを探す3つの場所とその順序。TANRENが使うファイルには網掛けをしています。

リンク・ファイルのディレクトリが最初なのは、プログラム自身のオブジェクト・ファイルをリンク・ファイルと同じ場所に置いておけば、同じ名前のほかのファイルより必ず優先されるようにするためです。リンク・ファイルではなくコマンド・ラインで指定したオブジェクト・ファイルは、2番目の場所から探されます。

この章の例ではSUB.TROを何通りか使っていて、それぞれ自分が置かれていたディレクトリを表示するソースから作られています。そのため、プログラムを実行すると、TANRENがどれを使ったかがわかります。リンク・ファイルPROG.LNKをLNKに置き、その横にSUB.TROがある場合は次のようになります。

A:\>tanren @lnk\prog /o:lnk.com 
... 
2 modules, 16 records, ends at EOF. 
Wrote LNK.COM, 0100-0123 (36 bytes), entry 0100. 
A:\>lnk 
SUB.TRO from LNK
 

23.2 環境変数TANREN

TANRENには、最初の2つの場所にないオブジェクト・ファイルを探すディレクトリ、たとえば複数のプログラムが共有するモジュールのディレクトリを書きます。TATARAと同じように働き(13.3節)、複数のディレクトリはセミコロンで区切って左から順に探されます。それぞれの最後に\を付ける必要はありませんが、付けてもかまいません。AUTOEXEC.BATなどのバッチ・ファイルでは、次のように書きます。

set tanren=a:\tatara\lib;a:\project\mod
 

プロンプトで入力するときは、3章と同じように、値を引用符で囲みます。

TANRENがなければ、最初の2つの場所にないオブジェクト・ファイルは見つかりません。

A:\>tanren main sub 
... 
ERROR: cannot open SUB.TRO
 

TANRENにそのファイルのあるディレクトリを設定すると、同じコマンドでリンクできます。

A:\>tanren main sub 
... 
2 modules, 16 records, ends at EOF. 
Wrote MAIN.COM, 0100-0123 (36 bytes), entry 0100. 
A:\>main 
SUB.TRO from LIB
 

TANRENに書いたディレクトリが存在しないときは、それを飛ばして次のディレクトリが探されます。

TANRENは3つの場所の最後です。カレント・ディレクトリにあるSUB.TROは、TANRENのディレクトリにあるものより先に使われます。

A:\>tanren main sub /o:cur.com 
... 
Wrote CUR.COM, 0100-0135 (54 bytes), entry 0100. 
A:\>cur 
SUB.TRO from the current directory
 

23.3 名前の中のパス

B:SUBのようにドライブで始まる名前や、\PROJECT\SUBのように\で始まる名前は、絶対パス(absolute path)です。TANRENはそれを書かれたとおりに開き、ほかの場所は探しません。TANRENにそのファイルのあるディレクトリが書いてあっても同じです。

A:\>tanren main b:sub /o:drv.com 
... 
ERROR: cannot open B:SUB.TRO
 

それ以外の名前は相対パス(relative path)で、3つの場所で順に探されます。tanren main lib\subは、TANRENがなくても、カレント・ディレクトリの下にあるLIB\SUB.TROを見つけます。

23.4 出力ファイルの書き出し先

/O:を付けないと、出力ファイルには最初のオブジェクト・ファイルの名前に.comを付けた名前が付き(21章)、そのオブジェクト・ファイルが見つかったディレクトリに書き出されます。最初のオブジェクト・ファイルがTANRENのディレクトリやリンク・ファイルのディレクトリから読まれたときは、出力ファイルもそこに書き出されます。

A:\>tanren sub main 
... 
WARNING: LIB\SUB.COM is entered at 0100, not at 0109. 
2 modules, 16 records, ends at EOF. 
Wrote LIB\SUB.COM, 0100-0123 (36 bytes), entry 0109.
 

ここではSUB.TROがTANRENを通してLIBで見つかったので、SUB.COMもカレント・ディレクトリではなくLIBに書き出されました。要約行にはそのパスが表示されます。(警告は、21.1節と同じくモジュールの順番についてのものです。SUB.TROを先に指定しているからです。)出力ファイルの書き出し先を確実にするには、/O:で名前を指定してください。

23.5 メッセージ

オブジェクト・ファイルを探すことについてのメッセージを、表23.1に示します。

メッセージ

意味

ERROR: cannot open NAME.TRO

オブジェクト・ファイルが3つの場所のどこにもないか、絶対パスが示す場所にありません。名前は書いたとおりに、大文字で表示されます。

ERROR: the TANREN variable is too long.

TANRENが127文字より長くなっています。

表 23.1: オブジェクト・ファイルを探すことについてのメッセージ