hhamalai
hhamalai

Reputation: 288

passing properties defined inside antcall target back to calling target

I'm rather new to Ant but I have experienced it's quite good pattern to create generic ant targets which are to be called with antcall task with varying parameters.

My example is compile target, which compiles multiple systems using complex build command which is a bit different for each system. By using pattern described above it's possible not to create copy paste code for that compile command.

My problem here is, that I'm not aware of any way to pass return value (for example the return value of compiler) back to target which called the antcall task. So is my approach pathological and it's simply not possible to return value from antcall task or do you know any workaround?

Thanks,

Upvotes: 17

Views: 23615

Answers (5)

Torsten Metzger
Torsten Metzger

Reputation: 1

You can get a similar behaviour with the keyword "depends".

<?xml version="1.0" encoding="UTF-8"?>
<project name="test" default="main">
    <target name="main">
        <antcall target="build-system-with-depends" />
        <!-- wait for different results -->
        <waitfor checkevery="1000" checkeveryunit="millisecond" maxwaitunit="millisecond" maxwait="2000">
            <available file="dummy.not.present.file" classname="" property=""></available>
        </waitfor>
        <antcall target="build-system-with-depends" />
    </target>

    <target name="build-system-with-depends" depends="do-compiler-stuff">
        <echo>$${compiler.result}=${compiler.result}</echo>
    </target>

    <target name="do-compiler-stuff">
        <!-- simulate different return states -->
        <tstamp>
            <format pattern="yyyyMMddHHmmss" property="compiler.result" />
        </tstamp>
    </target>
</project>

Upvotes: 0

JoseK
JoseK

Reputation: 31371

Use antcallback from the ant-contrib jar instead of antcall

<target name="testCallback">
    <antcallback target="capitalize2" return="myKey">
    </antcallback>
    <echo>a = ${myKey}</echo>
</target>

<target name="capitalize2">
    <property name="myKey" value="it works"/> 
</target>

Output:

testCallback:

capitalize2:
     [echo] a = it works

BUILD SUCCESSFUL

Upvotes: 18

SteveScm
SteveScm

Reputation: 575

Antcall can be used from the ant-contrib jar task.

Upvotes: 0

JosefB
JosefB

Reputation: 99

One approach is to write out a property to a temp file using "echo file= ...." or PropertyFile task. Then read the property back in where required. Kludge but works.

Upvotes: 5

user268396
user268396

Reputation: 12006

Ant tasks are all about stuff goes in, side effect happens. So trying to program in terms of functions (stuff goes in, stuff comes out) is going to be messy.

That said what you can do is generate a property name per invocation and store the result value in that property. You would need to pass in a indentifier so you do not end up trying to create copies of the same property. Something like this:

<target name="default">
  <property name="key" value="world"/>
  <antcall target="doSomethingElse">
     <param name="param1" value="${key}"/>
  </antcall>
  <echo>${result-${key}}</echo>
</target>
<target name="doSomethingElse">
   <property name="hello-${param1}" value="it works?"/>
</target>

But I believe the more typical approach -instead of antcalls- is to use macros. http://ant.apache.org/manual/Tasks/macrodef.html

Upvotes: 3

Related Questions