2011-01-26 3 views
2

J'ai un compilateur (et la langue) Je suis la construction qui est normalement appelé ainsi:compilation Ant macrodef tâche

java -jar nc.jar \ 
    -p some/referenced/package.nc \ 
    -p framework.nc \ 
    source1.ns source2.ns sourceN.ns \ 
    -o output/package.nc 

J'aimerais inclure une tâche dans mon dossier de construction ANT qui appelle le compilateur pour compiler la bibliothèque standard et tous les tests, mais spécifiant chaque appel du compilateur séparé comme une tâche <java> est douloureuse:

<target name="framework" depends="compiler" description="Build the n framework"> 
    <!-- More compile steps --> 
    <java jar="nc.jar" fork="true"> 
     <arg value="-p"/> 
     <arg path="../nframework/build/n.core.nc"/> 
     <arg path="../nframework/n/debug/DebugPrint.ns"/> 
     <arg path="../nframework/n/debug/Trace.ns"/> 
     <arg value="-o"/> 
     <arg path="../nframework/build/n.debug.nc"/> 
    </java> 
    <!-- More compile steps --> 
</target> 

Je voudrais créer une tâche ANT d'une sorte qui peut simplifier en quelque chose comme:

<target name="framework" depends="compiler" description="Build the n framework"> 
    <!-- More compile steps --> 
    <nc output="../nframework/build/n.debug.nc"> 
     <link-package path="../nframework/build/n.core.nc"/> 
     <src> 
      <fileset dir="../nframework/n/debug" includes="**/*.ns"/> 
     </src> 
    </nc> 
    <!-- More compile steps --> 
</target> 

À cette fin, j'ai essayé macrodef:

<macrodef name="nc"> 
    <attribute name="output"/> 
    <element name="link-package"/> 
    <element name="src"/> 
    <sequential> 
     <java jar="nc.jar" fork="true"> 
      <arg value="-p"/> 
      <!-- This doesn't do what I want --> 
      <link-package/> 
      <!-- Neither does this --> 
      <src/> 
      <arg value="-o"/> 
      <arg path="@{output}"/> 
     </java> 
    </sequential> 
</macrodef> 

J'ai essayé plusieurs variations sur ce qui précède, mais chaque erreur avec quelque chose comme: /home/jwarner/code/nlang/nc/build.xml: 55: java ne supporte pas l'élément "fileset" imbriqué.

Existe-t-il un moyen de le faire sans étendre ANT lui-même? Sinon, serait-il assez facile d'ajouter une tâche de fourmi à mon compilateur? Je ne suis pas très pointilleux sur la syntaxe de la tâche finale <nc>.

+1

Vous avez dit que vous ne vouliez pas étendre Ant lui-même, mais si vous ne recevez pas une réponse simple à votre problème, je pensais que je vous signale que la création de votre propre tâche Ant est très facile. Jetez un coup d'oeil à http://ant.apache.org/manual/develop.html#writingowntask –

+0

Est-ce que cela pourrait signifier exactement ce qu'il dit? ne peut pas prendre un ensemble de fichiers. Vous devez passer vos chemins en tant que chaîne, comme ../nframework/n/debug. Je copierais la tâche javac moi-même. –

+0

@Kevin: Vous avez raison - je viens de regarder à cela, et il semble beaucoup plus facile que je pensais. D'autant plus que cette approche "", que si vous avez posté "Extend Ant" comme une réponse (peut-être avec un exemple de ce que les méthodes devraient être définies dans la classe de la tâche), je l'accepterais. –

Répondre

1

J'ai eu un problème similaire dans le passé où les tâches Ant prêtes à l'emploi ne faisaient pas exactement ce que je voulais qu'elles fassent. J'ai trouvé qu'il était très facile d'écrire ma propre tâche Ant.

La documentation est concise mais explique bien ce que vous devez faire.

http://ant.apache.org/manual/develop.html#writingowntask