| minmakeは、Java/XMLベースのプラットフォーム依存しないmakeツールです。
minmakeは、UNIXのmakeやWindowsのnmakeと同様の目的で使用されます。
そのタスクの内容は、デフォルトでは、minmakeを走らせるディレクトリの中にあるmake.xmlファイルの中で記述されます。
以下は、minmakeで行うプロジェクトの完結した例です。
make.xml
- 4つのモジュールのアプリケーションのためのファイル
mdefs.xml
- MINERVAプロジェクトのための一般的なルール
usagi.xml
- ホスト環境の宣言
make.xmlの記述はXML形式で行い、次のような構文にします。
make.xml
<make [default="DefaultRule"]>
(Include)*
(Var)*
(Rule|GenRule)*
</make>
Include
<include>Filename</include>
Var
<var>
<name>VariableName</name>
(Value)*
</var>
Value
<value>SomeText</value>
Rule
<rule>
Target
(Dep)*
(Body|Comment)*
</rule>
GenRule
<genrule>
Target
(Dep)*
(Body|Comment)*
</genrule>
Target
<target>TargetName</target>
Dep
<dep>Dependency</dep>
Comment
<comment>SomeText</comment>
Body
<body
[dir="WorkingDirectory"]
[input="Filename"]
[output="Filename"]
[append="Filename"]
>SomeCommand</body>
パス、コマンド、コメントはすべて変数を持つことができます。
変数は、$(VariablenName) という形で参照されます。
変数を使用するために予めVar部分で定義せねばなりません。
変数HOSTNAMEは、予め定義され、minmakeが呼ばれるマシンの
ホストネームを出力します。 これにより、例えば、特別なマシンに対して
特別に付け加えられるルールや変数(例えば、システム関連ディレクトリの
ある場所などについて)を定義することができます。
<include>$(HOSTNAME).xml</include>
の中で定義します。)
また、変数を参照する際に、変数の中身の一部を修正することも可能です。
例えば、
$(Variable:.old-suffix=.new-suffix)
という形で使います。
$(V:.min=.mbc)
で、変数Vの拡張子を.minから.mbcに置換えることなどが可能です。
パスの指定やコマンド、コメントは、GenRuleの中でワイルドカードを
持つこともできます。ここでは、従属部分で、*マークは、ワイルドカード
として使われます。
*が右から左へと現れるたびに、*の付けられた部分はカウントされ、コメント
あるいはボディ部分で、$i (i in 1-9) という形式で参照されます。
例:MINERVAファイルのコンパイルのルール
<genrule>
<target>mbc</target>
<dep>1.min</dep>
<comment>compile $1.min</comment>
<body>$(MINERVAC) $1.min</body>
</genrule>
- このルールでは以下のことが定義されています。
-
-
*.mbcの拡張子を持つファイルは、*.minを持つ同じ前の名前を持つファイルに
依存します。コンパイルの前に、minmakeは、"compile <Datei>min"という
コメントを出力します。コンパイル自体は、"$(MINERVAC) <Filename>min"
というコマンドで行われ、$(MINERVAC)は、その前に定義されていた変数です。
-
個々の説明
Var(変数)部分で、変数は定義されます。例えば、
<var>
<name>JAVA</name>
<value>jview d:/nologo=true /cp:a</value>
</var>
<var>
<name>MINERVA_HOME</name>
<value>c:\minerva</value>
</var>
<var>
<name>MINERVAC</name>
<value>$(JAVA) $(MINERVA_HOME) com.ifcomputer.minerva.Application -c $(MINERVA_HOME)/minerva.mca</value>
</var>
変数は一つ以上の値を持つことができます。
<var>
<name>SOURCE</name>
<value>data-1.min</value>
<value>data-2.min</value>
<value>data-3.min</value>
</var>
ここで、個々の値域の内包する変数の値は、間にスペースを一つづつはさんで出力
されます。
上の例では、
SOURCE="data-1.min data-2.min data-3.min"
として出力されます。
Ruleの部分では、ルールが定義されます。これらのルールは必要に応じて、
minmakeによって処理されます。(これは、makeで知られているのと類似の働きです。)
Ruleは、特別なファイルのためのみのルールを出力します。(それゆえに、ターゲット
部分で*のワイルドカードを使用することはできません。)
ルールは、body部分を持ちません。この場合、これに従属するルールを定義せねばなり
ません。
GenRuleとRuleが存在する場合、特別なルールであるRuleのみが処理されます。
しかし、body部分を持たないdep部分においては、常に、すべてのrule/genruleのルールが処理されます。
ルールは、いくつかの属性のオプションを持ちます。
"input"属性は、与えられたファイルが、コマンドのための標準インプットとして
使われることを意味します。
"output"属性は、コマンドの標準出力が、指定されたファイルに回される
ことを意味します。
"append"属性は、コマンドの標準出力が、与えられたファイルに追加される
ことを意味します。
"dir"属性は、コマンドが与えられたディレクトリで行われることを意味します。
(これは、再帰的なmakeファイルの場合、特に重要です。)
例えば、
<rule>
<target>all</target>
<body dir="lib">$(MAKE) all</body>
<body dir="kernel">$(MAKE) all</body>
<body dir="bips">$(MAKE) all</body>
</rule>
このコマンドは、bin, kernel, libのディレクトリへ行き、そこで、再びmakeを実施
します。
minmakeは、以下のコマンドライン引数も持ちえます。
- -f <Filename>
- 指定されたminmakeファイルを呼び出します。 (デフォルトはmake.xml)
- Name=Value
- 変数Nameを値Valueに置換えます。
- Target
- 活性化されるべきルール。(デフォルトは、"default"属性によって、makeから決められます。) minmakeは、一つ以上のターゲットによって呼ばれることができます。ターゲットがない場合、"default"属性で出力されるターゲットが処理されます。この属性が定義されていない場合であって明確にターゲットが与えられていない場合h、ターゲット"all"が処理されます。
minmakeには、一連の予め設定されたコマンドがあります。予設定された
コマンドは、通常のコマンドと同様に使用されます。予設定されたコマンドは、
オペレーティングシステムへの依存性を消すので有効です。
以下の予設定されたコマンドがあります。
- del <File> ...
- 指定されたファイルはすべて、(ディレクトリの場合は再帰的に)消去されます。
- copy <File> ... <Directory>
-
- 複数のファイルを(ディレクトリの場合は再帰的に)Directoryディレクトリにコピーします。
- copy <File1> <File2>
-
- File1はFile2にコピーされます。
- move <File1> <File2>
-
- File1はFile2に名前が変わります。
- mkdir <Directory> ...
- Directoryを作ります。(まだない場合)
ここで、全ての必要な中間ディレクトリが作られます。
(例えば、"mkdir a/b/c"とだけ書けば十分です。
"mkdir a a/b a/b/c"と各必要はありません。)
- echo Text
- Textを出力します。
- cat <File> ...
- すべての指定されたファイルが、連続して標準出力に出力されます。ファイルを転送するために、"output"あるいは"append"の属性が使用されねばなりません。例えば、
<body output="res.txt">cat file1.txt file2.txt file3.txt</body>のように
使われます。
cat以外の全ての内蔵述語では、body内の属性は無視されます。
dir属性は、すべての内蔵コマンドで無視されます。
|