(for Internet Explorer)
← ▼ ▲
↑
MakeRule
サンプル
→ メイクファイル
(src)
.Target
.Command によって作られるファイルのパス。
.Sources
.Command を実行するのに必要となるファイルのパスの配列。
.Command
Target のタイムスタンプが、Sources より新しいときに実行する関数。
.c
定数の集まり (Read Only)
.Delegate
.CurrentDirectory
.Type_
.Priority
.NewestSource
.AllNewSource
委譲先となるユーザー定義オブジェクト。
MakeRule オブジェクトを生成したときのカレント・フォルダ。 (Read Only)
メイクルールの種類。
優先度。 大きいほど優先する。
最もタイムスタンプが新しい Sources のファイルパス。
ターゲットよりタイムスタンプが新しいファイルパスの配列。
.Variables
ユーザー定義変数と、MakeFile の自動変数の集まり。 (Read Only)
新規作成するときは、少なくとも Target、Sources、Command を初期化してください。
<< MakeFileClass （メイクファイル）
← ▼ ▲
Target (MakeRule)
.Command によって作られるファイルのパス。
または、Command が最後まで完了したら更新するファイルのパス。
相対パスを指定するとき、基準フォルダは .CurrentDirectory。
Dim MakeRule::Target as string
(src)
ワイルドカードを指定したとき （暗黙ルール）
MakeRule::Target
MakeRule::Sources(0)
A.obj
A.c
動作
( Target : Sources ) が ( A.obj : A.c ), ( B.obj : B.c ) のルールがあるとき、
MakeRule::Target と MakeRule::Sources(0) にワイルドカードがあるかどうかによって、
動作がどのように違うかを示します。
A.c
*.obj
エラー（未対応）
*.c
*.obj
A.obj
*.c
エラー（未対応）
A.c が更新されたらコマンドを実行
A.c が更新されたら A.c に対するコマンドを実行、
B.c が更新されたら B.c に対するコマンドを実行
Function new_Target_txt_Rule()
Set o = new MakeRule
o.Sources = Array( "Source\*.txt" )
o.Target = "Target\*.txt"
Set o.Command = GetRef("Target_txt_Command")
Set new_Target_txt_Rule = o
End Function
Sub Target_txt_Command( Param, Rule )
copy_ren Rule.Sources(0), Rule.Target
End Sub
サンプル
Source フォルダーにある *.txt ファイルが更新されたら、Target フォルダーにコピーする
← ▼ ▲
Sources (MakeRule)
Dim MakeRule::Sources as Array of string
.Command を実行するのに必要となるファイルのパスの配列。
または、Command を起動するときに更新するファイルのパス。
相対パスをしていするとき、基準フォルダは .CurrentDirectory。
(src)
→ ワイルドカードを指定したとき
参考
← ▼ ▲
Command (MakeRule)
Dim MakeRule::Command as Sub( Delegate as variant, Rule as MakeRule )
Target のタイムスタンプが、Sources より新しいときに実行する関数。
GetRef で代入してください。
Delegate 引数は、MakeFileClass::Delegate
(src)
← ▼ ▲
Variables (MakeRule)
Dim MakeRule::Variables as LazyDictionaryClass
ユーザー定義変数と、MakeFile の自動変数の集まり。
LazyDictionaryClass
MakeFile の自動変数
また、
に相当する下記の変数が定義されます。
MakeRule::Command
に指定した関数がコールバックされている間は、
$@
target （：の左）
a.o : a.c
$(CC) -c -o ${Target} ${Sources}
a.o : a.c
$(CC) -c -o a.o a.c
$<
source （：の右） の１つ目
$?
source （：の右） の全体
a.o : a.c b.h
@echo a.c b.h
a.o : a.c b.h
@echo ${Sources}
$*
target の拡張子を除いたもの
a.o : a.c
$(CC) -c -o ${Target} ${TargetNoExt}.c
a.o : a.c
$(CC) -c -o a.o a.c
a.o : a.c b.h
@echo a.c
a.o : a.c b.h
@echo ${Sources[0]}
${Target}
下記の凡例：
Variables にある変数名
MakeFile の自動変数名
${Sources}
${Sources[0]}
${TargetNoExt}
参照または変更することができます。
MakeFileClass::Variable
と同じオブジェクトを参照しており、そこに設定した変数を
MakeRule::Target
と同じ値です。
を
MakeRule::Sources配列
に渡した出力です。
の１つ目の要素と同じ値です。
MakeRule::Sources 配列
の拡張子を除いたものです。
MakeRule::Target
相対パスのフォルダー部分も含みます。
相対パスのフォルダー部分も含みます。
相対パスのフォルダー部分も含みます。
相対パスのフォルダー部分も含みます。
CmdLineFromStr
ただし、\ は \\ に変換されません。
← ▼ ▲
CurrentDirectory (MakeRule)
Dim MakeRule::CurrentDirectory as string
MakeRule オブジェクトを生成したときのカレント・フォルダ。
(src)
MakeRule::Target や MakeRule::Sources に格納されている相対パスの基準パス。
MakeRule::Command の関数が呼ばれる直前で、カレント・フォルダがこの値になります。
← ▼ ▲
Delegate (MakeRule)
Dim MakeRule::Delegate as variant
委譲先となるユーザー定義オブジェクト。
(src)
MakeRule クラスのオブジェクトを生成するときにユーザー定義オブジェクトを Delegate に格納しておくと、
MakeRule::Command で呼ばれる関数の中で、第2引数である MakeRule オブジェクトの
Delegate からユーザー定義オブジェクトを、参照することができるようになります。
Function new_Target_txt_Rule()
Set new_Target_txt_Rule = new MakeRule : With new_Target_txt_Rule
.Sources = Array( "Source1.txt", "Source2.txt" )
.Target = "Target.txt"
.Delegate = "ABC"
Set .Command = GetRef("Target_txt_Command")
End With
End Function
Sub Target_txt_Command( a_MakeFile, a_MakeRule )
echo a_MakeRule.Delegate
End Sub
Delegate
Delegate
← ▼ ▲
Type_ (MakeRule)
Dim MakeRule::Type_ as integer
メイクルールの種類。
(src)
Empty
c.Splitter
普通のメイクルール
ターゲットが存在しないときでも、コマンドを実行しないメイクルール
c は、MakeRule::c で参照できる MakeFileClassConst オブジェクトです。
→ オーダー調整用更新分離パス
参考
← ▼ ▲
Priority (MakeRule)
Dim MakeRule::Priority as integer
優先度。 大きいほど優先する。
(src)
同じ MakeRule::Target の値を持つ MakeRule が複数あるときは、その複数の中で、
MakeRule::Priority が最も大きい MakeRule::Command の関数だけが呼ばれます。
← ▼ ▲
NewestSource (MakeRule)
Property Get MakeRule::NewestSource() as string
最もタイムスタンプが新しい MakeRule::Sources 配列の要素。ファイルパス。
(src)
タイムスタンプを比較するタイミングは、この NewestSource プロパティを参照したときです。
← ▼ ▲
AllNewSource (MakeRule)
Property Get MakeRule::AllNewSource() as Array of string
(src)
MakeRule::Sources の中で、ターゲットよりタイムスタンプが新しいファイルパスの配列。
タイムスタンプを比較するタイミングは、この AllNewSource プロパティを参照したときです。
← ▼ ▲
MakeRule_compare
(src)
Function MakeRule_compare( TargetPath, SourcePath ) as boolean
タイムスタンプを比較して、メイク・コマンドを実行する状況かどうかを返す。
【引数】
TargetPath
SourcePath
ターゲット・ファイルのパス。 メイクルールの ： より左側
ソース・ファイルのパス。 メイクルールの ： より右側
返り値
メイク・コマンドを実行する状況かどうか
関連
→ File::DateLastModified
→ FileSystemObject::FileExists
→ DateAddStr
サンプル
If MakeRule_compare( "dst.txt", "src.txt" ) Then
copy_ren "src.txt", "dst.txt"
End If
→ タイムスタンプのテストの注意
参考
← ▼ ▲
MakeFileClassConst
.Splitter (=1)
.OutDebugXML (=1)
.BreakBeforeCommand (=2)
.Watch (=4)
取得
get_MakeFileClassConst 関数、MakeFileClass::c、MakeRule::c
メンバー
→ Type_ (MakeRule)
→ DebugMode (MakeFileClass)
メイクファイルに関する定数
← ▼ ▲
データ構造 (MakeFileClass)
MakeFileClass
.RuleGroups
dictionary< target_path, MakeRuleGroup >
.Rules
ArrayClass< MakeRuleSpec >
.UserFiles
ArrayClass< MakeRuleSpec >
(src)
(src)
(src)
.Rule
MakeRule
(src)
string
.Target
.Sources
array< string >
// 辞書のキー、Target と Sources の両方
.TargetPath
string
← ▼ ▲
OpenForMakeRuleOfRevisionFolder
Set maker = OpenForMakeRuleOfRevisionFolder( "C:\Masters\MakeRule.xml" )
echo maker.GetMakeTreeString( "C:\Masters\Module\01" )
Function OpenForMakeRuleOfRevisionFolder( in_RuleFilePath as string )
as MakeRuleSetOfRevisionFolderClass
make コマンドのような実行を、リビジョンのフォルダーに対して行ったことの記録を開きます。
【引数】
in_RuleFilePath
返り値
メイク ルール ファイルのパス、または、Empty
サンプル
テスト
ソース
→ ToolsLib.vbs
→ T_MakeRuleR.vbs
→ MakeRuleSetOfRevisionFolderClass
<?xml version="1.0" encoding="UTF-8"?>
<MakeRuleOfRevisionFolder>
<Variable name="${Files}" value="." type="FullPathType"/>
<MakeRule>
<Output path="${Files}\Step1\*"/>
<Input_ path="${Files}\Step2\*"/>
<Command>Command 1</Command> コマンド プロンプトに渡すコマンド
<Revisions>01</Revisions> Output と Input_ の path の最後の *
</MakeRule>
<MakeRule>
<Output path="${Files}\Step2\*"/>
<Input_ path="${Files}\Step3A\*"/>
<Input_ path="${Files}\Step3B\*"/>
<Command>Command 2</Command>
<RevisionSet>01, 03A, 03B</RevisionSet>
</MakeRule>
</MakeRuleOfRevisionFolder>
メイク ルール ファイル
Step1
Step2
Step3A
Step3B
01
01
03A
03B
Variable
Step1\01 を出力するために、Step3A\03A と Step3B\03B を入力して、Step2\01 を出力
する Command 2 を実行してから、Step2\01 を入力して、Step1\01 を出力する
Command 1 を実行したことの記録は、以下のようになります。
${Files}\Step1\01
${Files}\Step2\01
${Files}\Step3A\03A
${Files}\Step3B\03B
スクリプト：
表示：
MakeRule.xml
GetMakeTreeString
Command 1
Command 2
新しいリビジョンに対して make コマンドのような実行をするときは、記録（メイク ルールの
ファイル）にある <Revisions>（CSV形式）の要素、または、<RevisionSet> を増やします。
Command 2
Command 1
04B_Tmp
04A_Tmp
02_Tmp
02_Tmp
Step3B
Step3A
Step2
Step1
下記の新しいリビジョンを追加したとき、<Revisions> の要素と <RevisionsSet> を追加します。
ただし、ツリーが決定するまで、暫定的にそれぞれのリビジョン名の末尾に _Tmp を入れた
ほうがよいでしょう。
:
<Revisions>02_Tmp, 01</Revisions>
:
<RevisionSet>02_Tmp, 04A_Tmp, 04B_Tmp</RevisionSet>
<RevisionSet>01, 03A, 03B</RevisionSet>
:
メイク ルール ファイルの変更後
02_Tmp,
<RevisionSet>02_Tmp, 04A_Tmp, 04B_Tmp</RevisionSet>
→ MakeFileClass （メイクファイル）
関連
OpenForMakeRuleOfRevisionFolder
${Revision[n]}
Command タグには、以下の変数を記述できます。
対象となるリビジョンの名前。 例："02"
n は、0 から始まる Output タグと Input タグの順番の番号です。
${Output[n]}
メイクしてできるフォルダーのフル パス。 フォルダー名は、Work
固定です。 n は、${Revision[n]} の n と同じです。
１つの n に対して ${Output[n]} か ${Input[n]} のどちらかだけ参照
できます。
${Input[n]}
入力するフォルダーのフル パス。 フォルダー名は、Work 固定です。
n は、${Revision[n]} の n と同じです。
１つの n に対して ${Output[n]} か ${Input[n]} のどちらかだけ参照
できます。
→ ModuleAssort2
MakeRule/Output
複数可能
MakeRule XML リファレンス
コマンドを実行したら出力されるフォルダーのパス。
MakeRule/Input
複数可能
コマンドを実行するときに入力するフォルダーのパス。
Input タグと Input_ タグに違いはありません。、
MakeRule/Command
実行する
コマンドライン
。
MakeRule/Revisions
MakeRule/Input_
複数可能
Input タグや Output タグに指定した * と置き換えるリビジョン名の集合。 CSV形式。
同じ親を持つすべての Input タグや Output タグに共通のリビジョン名に置き換えます。
複数のリビジョン名は、CSV 形式で指定します。 １つのリビジョン名は、１つの
RevisionSet タグに対応します。
複数可能
複数可能
MakeRule/RevisionSet
複数可能
Input タグや Output タグに指定した * と置き換えるリビジョン名の集合。 CSV形式。
CSV の要素の順番は、同じ親を持つ Input タグまたは Output タグの順番に対応
します。
→ サンプル
← ▼ ▲
MakeRuleSetOfRevisionFolderClass
.Variables
.MakeRules
LazyDictionaryClass
ArrayClass of MakeRule_OfRevisionFolder_Class
OpenForMakeRuleOfRevisionFolder
の返り値。
<< OpenForMakeRuleOfRevisionFolder
← ▼ ▲
GetMakeTreeString
Function MakeRuleSetOfRevisionFolderClass::GetMakeTreeString(
in_RootFolderPath as string ) as string
メイク ルールのツリーを文字列で返します。
【引数】
in_RootFolderPath
返り値
最終出力フォルダーのパス
メイク ルールのツリーの文字列
ソース
→ ToolsLib.vbs
<< OpenForMakeRuleOfRevisionFolder
← ▼ ▲
GetMakeRelations
Function MakeRuleSetOfRevisionFolderClass::GetMakeRelations(
in_RootFolderPath as string ) as ArrayClass of MakeRule_OfRevisionFolder_Class
メイク ルールのツリー返します。
【引数】
in_RootFolderPath
返り値
最終出力フォルダーのパス
メイク ルールのツリー
ソース
→ ToolsLib.vbs
<< OpenForMakeRuleOfRevisionFolder
← ▼ ▲
LoadAdditionally
Sub MakeRuleSetOfRevisionFolderClass::LoadAdditionally( in_RootFolderPath as string )
メイク ルールを追加します。
【引数】
ソース
→ ToolsLib.vbs
<< OpenForMakeRuleOfRevisionFolder
in_RuleFilePath
追加するメイク ルール ファイルのパス、または、Empty
← ▼ ▲
子プロセスへの受け渡し (/ChildProcess オプション)
コマンドライン・パラメーター
に、/ChildProcess オプションを付け、XML ファイルによるデータ
メイン・プロセスから、任意のデータ（例：
）を渡し、子プロセスが終了したら
Err2::ErrID
メイン・プロセスに更新された データを返す、といったようなことができます。 このような
データの受け渡しができるようにするのが、/ChildProcess オプションによる子プロセス
の機能です。 OS が定義している子プロセスとは異なります。
cscript sample.vbs /ChildProcess:090401,1
/ChildProcess の右の値は、テンポラリ・フォルダにできるフォルダ名の数値の部分です。
テンポラリ・ファイル名は、下記のとおりです。 %Temp% は、C:\Document 〜 に変わります。
→ 子プロセス側が使う ChildProcess オブジェクト、get_ChildProcess
→ メイン・プロセス側が使う ParentProcess オブジェクト、new_ParentProcess
→ 処理フロー
%Temp%\Report\090401\ChildProcess_1\In.xml
%Temp%\Report\090401\ChildProcess_1\Out.xml
→ テンポラリ・フォルダ
参考
vbslib の RunProg 関数で、vbs ファイルを起動すると、自動的に VBScript を起動するときの
メイン・プロセス vbslib (WSH)
子プロセス vbslib (WSH)
の送受信ができるようになっています。 Shell::Run などで起動すると、/ChildProcess オプション
が自動的に付かないので、明示的に指定しない限り送受信できません。
→ テスト情報 I/F
→ T_ChildProcess1.vbs
テスト
(src)
XMLファイル
XMLファイル
vbslib では、エラー処理やデバッグ用に Err2 オブジェクトの送受信を自動的に必ず行います。
→ [T_ChildProcess]
→ InterProcessData インターフェース（ライブラリ用）
→ 困ったときは (/ChildProcess)
自動的に /ChildProcess オプションを付けないようにするには、/ChildProcess:0 を明示的に
指定します。
r= RunProg( "cscript sample.vbs /ChildProcess:0", "" )
VBScript でエラーを発生させるテストをするときに、/ChildProcess オプションが付くと、
Err2::ErrID （エラーが発生した番号） などの値がメイン・プロセスから継承された値となり、
Err2::ErrID の値が正しいかどうかのチェックができなくなってしまいます。 それを回避するには、
エラーを発生させるテスト・スクリプトでは、/ChildProcess:0 オプションを付けてください。（下記）
/ChildProcess オプションが（自動的にでも）付くと、エラーレベル（プロセスの返り値）の値が 21
でないとエラーとみなし、メイン・プロセス側でもエラーを発生させます。
→ 正常終了時の動作
参考
cscript sample.vbs
→
関連
→ TempParams.txt - C言語のプログラムにデータを渡す
← ▼ ▲
処理フロー (/ChildProcess オプション)
RunProg
new_ParentProcess
ParentChildProcess.m_OutFile.WriteLine
AppData.loadXML
Shell::Exec
new_ChildProcess_ifChildProcess
(VBScript global code)
→ 処理フロー （vbs_inc/setting）
main
get_ChildProcess
new_ObjectFromStream
ParentChildProcess.m_OutFile.WriteLine
:
子プロセスのメイン処理
:
ParentChildProcess.m_OutFile.WriteLine
アプリケーションからの出力
ライブラリからの出力
ライブラリへの入力
アプリケーションへの入力
アプリケーションからの出力
ResumePop or FinalizeInModulesCaller::Class_Terminate
CallFinalizeInModules
ParentChildProcess::Finish
ParentChildProcess.m_OutFile.WriteLine
ライブラリからの出力
ライブラリへの入力
アプリケーションへの入力
参考
If TypeName( ParentProcess ) <> "ParentChildProcess" Then new_ParentProcess
アプリケーションがやり取りするときのみ呼び出す
ParentChildProcess::OnCallInParent
ParentChildProcess::OnReturnInParent
ParentChildProcess::Class_Terminate
受け渡しに使った XML ファイルを削除する
子プロセス起動
子プロセス終了
Out.xml
(src)
(src)
(src)
(src)
InterProcessData::OnReturnInChild
InterProcessData.OnCallInParent
InterProcessData.OnReturnInParent
g_InterProcess.OnCallInParent
(src)
InterProcessData.ProcessCallID + 1
ProcessCallID を＋１する
InterProcess.OnCallInSub
Set g_ChildProcess = m
InitializeModule (vbslib.vbs)
new_ObjectFromStream
InitializeModule (vbslib または 任意の.vbs)
ParentProcess.m_OutFile.WriteLine
g_InterProcessからの出力
g_InterProcessへの入力
AppData, ChildProcess
InterProcess.OnReturnInChild
ParentChildProcess.m_OutFile.WriteLine
(src)
g_InterProcessからの出力
InterProcess::OnReturnInParent
new_ObjectFromStream
InterProcess.loadXML
g_InterProcessへの入力
AppData.xml
ParentProcess
(src)
main
Set g_InterProcess = new InterProcess
InitializeModule (vbslib.vbs)
メイン・プロセス起動
g_InterProcess.InterProcessDataArray.Add
InitializeModule (vbslib.vbs または 任意の.vbs)
LibData
プロセスが変わるときにコールバック
するように登録する
LibData
If WScript.Arguments.Named.Item("ChildProcess") Then
プロセスが変わるときにコールバックするように登録する
LibData
g_InterProcess.m_Data.Add
AppData
(src)
Set m_InXML = LoadXML( "Out.xml" )
Set m_InXML = LoadXML( "In.xml" )
(src)
FinalizeModule [vbslib.vbs]
Err2.OnSuccessFinish
エラー関係の調整
InterProcessData
InterProcessData
InterProcessData
g_InterProcess
cmdline = cmdline +" /ChildProcess:"+ step_path +","+ pr.m_FileID
m.m_TempPath = env( "%TEMP%\Report\" ) +
m.m_DateID +"\ChildProcess_"+ m.m_FileID
(.vbs)
'// サブ・プロセスで発生したエラーを、メイン・プロセスでも投げる
If g_Err2.Num <> 0 Then
g_Err2.Raise
Err2::OnReturnInChild
(src)
(src)
Err2::OnCallInParent
(.vbs)
If m_OutFile_LastLine = "</ToChildProcess>" Then
(src)
ParentChildProcess::Finish
If m_OutFile_LastLine = "</ToParentProcess>"
←
↓