<!--
   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
   this work for additional information regarding copyright ownership.
   The ASF licenses this file to You under the Apache License, Version 2.0
   (the "License"); you may not use this file except in compliance with
   the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
-->
<html>

<head>
<meta http-equiv="Content-Language" content="en-us">
<link rel="stylesheet" type="text/css" href="../stylesheets/style.css">
<title>Bindtargets Task</title>
</head>

<body>

<h2><a name="ant">Bindtargets</a></h2>
<h3>Description</h3>

<p>Make some target the extension of some defined
<a href="../targets.html#extension-points">extension point</a>. It will make the
list of targets dependencies of the extension point.</p>

<p>This target is useful when you want to have a target participate to another
build workflow, build workflow which explicitly expose an extension point for
that kind of insertion. But the target to bind and the extension point to
bind to are both declared in some imported build files. Modifying directly the
target dependency graph of these external build files may have a side effect
on some other project which import them. This task helps then to modify the
target dependencies but only in your context.
</p>

<p>Note: this task is quite equivalent to the definition of an intermediate
target which will be the bridge between the target to bind and the extension
point. For instance:
</p>
<blockquote><pre>&lt;bindtargets targets="jar,javadoc" extensionPoint="dist" /&gt;</pre></blockquote>
is quite equivalent to:
<blockquote><pre>&lt;target name="bind-to-dist" depends="jar,javadoc" extensionOf="dist" /&gt;</pre></blockquote>
<p>
This task basically avoid the creation of a target.
</p>

<p>The bindtargets task may only be used as a top-level task. This means that
it may not be used in a target. This is making the target dependency graph static
and predictable as soon as every build file is loaded.</p>

<p><b>Since Apache Ant 1.8.2</b></p>

<h3>Parameters</h3>
<table border="1" cellpadding="2" cellspacing="0">
  <tr>
    <td valign="top"><b>Attribute</b></td>
    <td valign="top"><b>Description</b></td>
    <td align="center" valign="top"><b>Required</b></td>
  </tr>
  <tr>
    <td valign="top">targets</td>
    <td valign="top">a comma separated list of target names to bind.</td>
    <td valign="top" align="center">Yes</td>
  </tr>
  <tr>
    <td valign="top">extensionPoint</td>
    <td valign="top">the name of the extension point to bind the targets to.</td>
    <td valign="top" align="center">Yes</td>
  </tr>
  <tr>
    <td valign="top">onMissingExtensionPoint</td>
    <td valign="top">What to do if this target tries to extend a missing
        <a href="../targets.html#extension-points">extension-point</a>. ("fail",
        "warn", "ignore").</td>
    <td valign="top" align="center">No. Defaults to <code>fail</code></td>
  </tr>
</table>

<h3>Examples</h3>
<blockquote><pre>
&lt;bindtargets targets=&quot;build-jar,build-src-jar&quot; extensionPoint=&quot;dist&quot; /&gt;
</pre></blockquote>

</body>
</html>
