alem0lars
alem0lars

Reputation: 690

Ant antcall a target that defines a property

In Ant I want to define a target (called A) that define a property and antcall it from another target (called B). I want that the target B, after antcalling the target A, can access the property defined in the target A.

For example:

<target name="B">
    <antcall target="A" inheritAll="true" inheritRefs="true" />
    <echo>${myprop}</echo>
</target>
<target name="A">
    <property name="myprop" value="myvalue" />
</target>

However it doesn't work and <echo>${myprop}</echo> doesn't print myvalue (I think because the property myprop isn't defined in B).

Is there any way to do that?

Upvotes: 20

Views: 33876

Answers (5)

Konstantin Komissarchik
Konstantin Komissarchik

Reputation: 29139

Another approach is to refactor your targets into macros. You are trying to use targets like functions and they are just not intended to be used that way. I typically write the bulk of my logic as macros, so that I can compose it more easily into more complicated macros. Then I write simple wrapper targets for the command-line entry points that I need.

Upvotes: 9

Mads Hansen
Mads Hansen

Reputation: 66714

Rather than using <antcall>, why not just have target B depend on target A?

<target name="B" depends="A">
    <echo>${myprop}</echo>
</target>
<target name="A">
    <property name="myprop" value="myvalue" />
</target>

Upvotes: 5

rajah9
rajah9

Reputation: 12329

@alem0lars, since you said you would like to subdivide a target, let me offer a different solution (that unfortunately doesn't answer your original question).

<project default="mytarg">
<target name="mytarg">
  <property name="tgt" value="build"/>
  <antcall target="deps"/>
</target>
<target name="deps" depends="aTgt,bTgt"/>
<target name="aTgt">
  <echo>"In aTgt doing a ${tgt}"</echo>
</target>
<target name="bTgt">
  <echo>"In bTgt doing a ${tgt}"</echo>
</target>
</project>

This subdivides the build into aTgt and bTgt.

Output will be

aTgt:
     [echo] "In aTgt doing a build"
bTgt:
     [echo] "In bTgt doing a build"
deps:
BUILD SUCCESSFUL

Upvotes: 0

SOUser
SOUser

Reputation: 3852

According to the Apache Ant FAQ:

    <target name="cond" depends="cond-if"/>

    <target name="cond-if" if="prop1">
      <antcall target="cond-if-2"/>
    </target>

    <target name="cond-if-2" if="prop2">
      <antcall target="cond-if-3"/>
    </target>

    <target name="cond-if-3" unless="prop3">
      <echo message="yes"/>
    </target>

Note: <antcall> tasks do not pass property changes back up to the environment they were called from, so you wouldn't be able to, for example, set a result property in the cond-if-3 target, then do <echo message="result is ${result}"/> in the cond target.

In this respect, it is impossible to do what you want using antcall.

========== edit ===========

Try antcallback: AntCallBack is identical to the standard 'antcall' task, except that it allows properties set in the called target to be available in the calling target.
http://antelope.tigris.org/nonav/docs/manual/bk03ch20.html

Sample code pasted from the above page:

    <target name="testCallback" description="Test CallBack">
        <taskdef name="antcallback" classname="ise.antelope.tasks.AntCallBack" classpath="${antelope.home}/build" />
        <antcallback target="-testcb" return="a, b"/>
        <echo>a = ${a}</echo>
        <echo>b = ${b}</echo>
    </target>

    <target name="-testcb">
        <property name="a" value="A"/>
        <property name="b" value="B"/>
    </target>

Upvotes: 11

rajah9
rajah9

Reputation: 12329

I think you want to use a param.

<project default="B">
<target name="B">
    <antcall target="A">
      <param name="myprop" value="myvalue"/>
    </antcall>

</target>
<target name="A">
    <echo>${myprop}</echo>
</target>
</project>

I surrounded this with a project tag and moved the echo statement into "A". My output says

B:
A:
     [echo] myvalue
BUILD SUCCESSFUL

Upvotes: 0

Related Questions