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>
<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は、以下のコマンドライン引数も持ちえます。
minmakeには、一連の予め設定されたコマンドがあります。予設定された コマンドは、通常のコマンドと同様に使用されます。予設定されたコマンドは、 オペレーティングシステムへの依存性を消すので有効です。
以下の予設定されたコマンドがあります。
cat以外の全ての内蔵述語では、body内の属性は無視されます。 dir属性は、すべての内蔵コマンドで無視されます。