言語の仕様 1
Note
このトピックでは、SrcSrv の内部操作について説明します。 ソース パスの動作に関する一般的な情報については、「 ソース パス」を参照してください。 SrcSrv の使用方法については、「 SrcSrv の使用」を参照してください。 環境内でのソース読み込みの現在の操作を確認するには、「 .srcnoisy (ノイズ ソースの読み込み)」の説明に 従って、ノイズの多いソースの読み込みを有効にします。
SrcSrv の最初のバージョンは次のように動作します。 (この動作は将来のバージョンで変更される可能性があります。)
まず、クライアントは、すべてのソース ファイル抽出のベースとして使用されるターゲット パスを指定して SrcSrvInit を呼び出します。 このパスは、特殊変数 TARG に格納されます。
DbgHelp は、モジュールの .pdb ファイルを読み込むとき、.pdb ファイルから SrcSrv ストリームを抽出し、 SrcSrvLoadModule を呼び出してこのデータ ブロックを SrcSrv に渡します。
次に、DbgHelp がソース ファイルを取得する必要がある場合は、 SrcSrvGetFile を呼び出して、バージョン管理から指定されたソース ファイルを取得します。
SrcSrv は、要求されたソース仕様と正確に一致するエントリについて、データ ブロック内のすべてのソース ファイル エントリを確認します。 この一致は VAR1 にあります。
SrcSrv は、エントリを見つけた後、特別な変数 (VAR1、VAR2 など) にこのソース ファイル エントリの内容を入力します。 次に、SRCSRVTRG 変数は、これらの特別な変数を使用して解決されます。
次に、特別な変数を使用して SRCSRVTRG 変数を解決する方法を示します。 ソース パスは引き続き次のようになります。
c:\proj\src\file.cpp*TOOLS_PRJ*tools/mytool/src/file.cpp*3
各行には、1 つの特別な変数の解像度が表示されます。 解決された変数は太字です。
SRCSRVTRG=%sdtrg%
SDTRG=%targ%\%var2%\%fnbksl%(%var3%)\%var4%\%fnfile%(%var1%)
c:\src\%var2%\%fnbksl%(%var3%)\%var4%\%fnfile%(%var1%)
c:\src\WIN_SDKTOOLS\%fnbksl%(%var3%)\%var4%\%fnfile%(%var1%)
c:\src\WIN_SDKTOOLS\%fnbksl%( sdktools/debuggers/srcsrv/shell.cpp )\%var4%\%fnfile%(%var1%)
c:\src\WIN_SDKTOOLS\ sdktools\debuggers\srcsrv\shell.cpp\%var4%\%fnfile%(%var1%)
c:\src\WIN_SDKTOOLS\sdktools\debuggers\srcsrv\shell.cpp\3\%fnfile%(%var1%)
c:\src\WIN_SDKTOOLS\sdktools\debuggers\srcsrv\shell.cpp\3\%fnfile%( c:\db\srcsrv\shell.cpp)
c:\src\WIN_SDKTOOLS\sdktools\debuggers\srcsrv\shell.cpp\3\shell.cpp
この生成されたターゲット パスが一意であり、同じファイルの 2 つのバージョンを同じ場所に抽出できないことに注意してください。
SrcSrv は、ファイルが既に存在するかどうかを確認するようになりました。 その場合、SrcSrv は呼び出し元に場所を返します。 それ以外の場合、SrcSrv は SRCSRVCMD を解決してファイルを抽出する実行コマンドをビルドします。
次の例では、各行に 1 つ以上の特殊な変数の解像度が示されています。 解決された変数は太字です。
DEPOT=//depot
WIN_SDKTOOLS= sserver.microsoft.com:4444
SRCSRVCMD=%sdcmd%
SDCMD=sd.exe -p %fnvar%(%var2%) print -o %srcsrvtrg% -q %depot%/%var3%#%var4%
sd.exe -p %fnvar%(WIN_SDKTOOLS) print -o %srcsrvtrg% -q %depot%/%var3%#%var4%
sd.exe -p sserver.microsoft.com:4444 print -o %srcsrvtrg% -q %depot%/%var3%#%var4%
sd.exe -p sserver.microsoft.com:4444 print -o c:\src\WIN_SDKTOOLS\sdktools\debuggers\srcsrv\shell.cpp\3\shell.cpp -q %depot%/%var3%#%var4%
sd.exe -p sserver.microsoft.com:4444 print -o c:\src\WIN_SDKTOOLS\sdktools\debuggers\srcsrv\shell.cpp\3\shell.cpp -q //depot/%var3%#%var4%
sd.exe -p sserver.microsoft.com:4444 print -o c:\src\WIN_SDKTOOLS\sdktools\debuggers\srcsrv\shell.cpp\3\shell.cpp -q //depot/ sdktools/debuggers/srcsrv/shell.cpp#%var4%
sd.exe -p sserver.microsoft.com:4444 print -o c:\src\WIN_SDKTOOLS\sdktools\debuggers\srcsrv\shell.cpp\3\shell.cpp -q //depot/ sdktools/debuggers/srcsrv/shell.cpp#3
次に、SrcSrv がこのコマンドを実行します。 このコマンドの結果が想定される場所にあるファイルである場合、このパスは呼び出し元に返されます。
変数を解決できない場合は、OS 環境変数として検索が試行されることに注意してください。 失敗した場合、変数名は処理中のテキストから削除されます。
2 つの連続するパーセント記号文字は、1 つのパーセント記号として解釈されます。
ソース サーバー データ ブロック
SrcSrv は、.pdb ファイル内の 2 つのデータ ブロック(ソース ファイル リストとデータ ブロック)に依存します。
ソース ファイルの一覧は、モジュールのビルド時に自動的に作成されます。 この一覧には、モジュールのビルドに使用されるソース ファイルへの完全修飾パスが含まれています。
データ ブロックは、ソース インデックス作成中に作成されます。 現時点では、"srcsrv" という名前の代替ストリームが .pdb ファイルに追加されます。 このデータを挿入するスクリプトは、使用中の特定のビルド プロセスとソース管理システムに依存します。
データ ブロックは、ini、変数、ソース ファイルの 3 つのセクションに分かれています。 データブロックの構文は次のとおりです。
SRCSRV: ini ------------------------------------------------
VERSION=1
VERCTRL=<source_control_str>
DATETIME=<date_time_str>
SRCSRV: variables ------------------------------------------
SRCSRVTRG=%sdtrg%
SRCSRVCMD=%sdcmd%
SRCSRVENV=var1=string1\bvar2=string2
DEPOT=//depot
SDCMD=sd.exe -p %fnvar%(%var2%) print -o %srcsrvtrg% -q %depot%/%var3%#%var4%
SDTRG=%targ%\%var2%\%fnbksl%(%var3%)\%var4%\%fnfile%(%var1%)
WIN_SDKTOOLS= sserver.microsoft.com:4444
SRCSRV: source files ---------------------------------------
<path1>*<var2>*<var3>*<var4>
<path2>*<var2>*<var3>*<var4>
<path3>*<var2>*<var3>*<var4>
<path4>*<var2>*<var3>*<var4>
SRCSRV: end ------------------------------------------------
パーセント記号 (%) で囲まれたテキストを除き、すべてのテキストはリテラルで解釈されます。 パーセント記号で囲まれたテキストは、次のいずれかの関数でない限り、再帰的に解決される変数名として扱われます。
%fnvar%()
パラメータのテキストはパーセント記号で囲み、解決される変数として扱う必要があります。
%fnbksl%()
パラメータテキスト内のすべてのスラッシュ (/) は、バックスラッシュ () に置き換える必要があります。
%fnfile%()
パラメーター テキスト内のすべてのパス情報を削除し、ファイル名のみを残す必要があります。
データ ブロックの [ini] セクションには、要件を記述する変数が含まれています。 インデックス作成スクリプトは、このセクションに任意の数の変数を追加できます。 エントリにはたとえば次のような種類があります。
VERSION
言語仕様のバージョン。 この変数は必須です。 現在の言語仕様に基づいてスクリプトを開発する場合は、この値を 1 に設定します。 SrcSrv クライアント コードは、独自の値より大きい値を持つスクリプトの実行を試みません。 SrcSrv の現在のバージョンでは、値 2 が使用されます。
VERCTRL
ソース バージョン管理システムを記述する文字列。 この変数は省略可能です。
DATETIME
.pdb ファイルが処理された日時を示す文字列。 この変数は省略可能です。
データ ブロックの [変数] セクションには、ソース管理からファイルを抽出する方法を記述する変数が含まれています。 また、一般的に使用されるテキストを変数として定義して、データ ブロックのサイズを小さくすることもできます。
SRCSRVTRG
抽出されたファイルのターゲット パスを作成する方法について説明します。 これは必須の変数です。
SRCSRVCMD
ソース管理からファイルを抽出するコマンドをビルドする方法について説明します。 これには、実行可能ファイルの名前とそのコマンド ライン パラメーターが含まれます。 これは、抽出コマンドを実行する必要がある場合に必要です。
SRCSRVENV
ファイルの抽出中に作成される環境変数をリストします。 これは文字列です 複数のエントリをバックスペース文字 (\b) で区切ります。 これは省略可能な変数です。
SRCSRVVERCTRL
使用中のバージョン管理システムを指定します。 Perforce の場合、これは perforce です。 Team Foundation Server の場合、これは tfs です。 この変数は、サーバー エラーを保持するために使用されます。 これは省略可能な変数です。
SRCSRVVERRDESC
バージョン 管理クライアントが、抽出するソース ファイルを含むサーバーに接続できない場合に表示するテキストを指定します。 SrcSrv では、この値を使用して接続の問題をチェックします。 これは省略可能な変数です。
SRCSRVERRVAR
バージョン管理サーバーに対応するファイル エントリ内の変数を示します。 SrcSrv は、以前のエラーに基づいて、動作しないコマンドを識別するために使用されます。 テキストの形式は varXで 、 X は示されている変数の番号です。 これは省略可能な変数です。
データ ブロックの [ソースファイル] セクションには、インデックスが付けられた各ソース ファイルのエントリが含まれています。 各行の内容は、VAR10 まで VAR1、VAR2、VAR3 などの名前の変数として解釈されます。 変数はアスタリスクで区切られます。 VAR1 では、.pdb ファイル内の別の場所にリストされているソース ファイルへの完全修飾パスを指定する必要があります。 次に例を示します。
c:\proj\src\file.cpp*TOOLS_PRJ*tools/mytool/src/file.cpp*3
次のように解釈されます。
VAR1=c:\proj\src\file.cpp
VAR2=TOOLS_PRJ
VAR3=tools/mytool/src/file.cpp
VAR4=3
この例では、VAR4 はリビジョン番号です。 ただし、ほとんどのソース管理システムは、特定のビルドのソース状態を復元できるようにファイルのラベル付けをサポートしています。 したがって、代わりにビルドのラベルを使用することもできます。 サンプル データ ブロックは、次のような変数を含むよう変更できます。
LABEL=BUILD47
次に、ソース管理システムがアットマーク (@) を使用してラベルを示していると仮定して、SRCSRVCMD 変数を次のように変更できます。
sd.exe -p %fnvar%(%var2%) print -o %srcsrvtrg% -q %depot%/%var3%@%label%
サーバー エラーの処理
クライアントが 1 つのバージョン管理サーバーからファイルをまったく抽出できない場合があります。 これは、サーバーがネットワークのダウンとオフになっているか、ユーザーがソースにアクセスするための適切な特権を持っていない可能性があります。 ただし、このソースの取得に時間がかかると、処理速度が大幅に低下する可能性があります。 このような状況では、使用できないことが証明されているソースから抽出しようとする試みを無効にすることをお勧めします。
SrcSrv は、ファイルの抽出に失敗するたびに、コマンドによって生成された出力テキストを調べます。 このコマンドの一部に SRCSRVERRDESC の内容と完全に一致するものが含まれている場合、同じバージョン管理サーバーに対するすべての今後のコマンドはスキップされます。 SRCSRVERRDESC 変数名の末尾に数値または任意のテキストを追加することで、複数のエラー文字列を定義できることに注意してください。 例を次に示します。
SRCSRVERRDESC=lime: server not found
SRCSRVERRDESC_2=pineapple: network error
サーバーの ID は SRCSRVERRVAR から取得されます。 したがって、SRCSRVERRVAR に "var2" が含まれており、.pdb ファイル内のファイル エントリが次のようになります。
c:\proj\src\file.cpp*TOOLS_PRJ*tools/mytool/src/file.cpp*3
今後、変数 2 に "TOOLS_PRJ" を含むファイル エントリを使用してソースを取得しようとすると、すべてバイパスされます。
Srcsrv.ini を編集して、デバッガー クライアントにエラー インジケーターを追加することもできます。 詳細については、srcsrv.iniのサンプル バージョンを参照してください。