<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE section PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
  "http://www.boost.org/tools/boostbook/dtd/boostbook.dtd">

<section id="bbv2.reference.class.project-target">

  <title>Class project-target</title>
  <indexterm>
    <primary>project-target</primary>
  </indexterm>
  
<programlisting language="jam">
class project-target : <link linkend="bbv2.reference.class.abstract-target">abstract-target</link> {
    rule <link linkend="bbv2.reference.class.project-target.generate">generate</link> ( property-set )
    rule <link linkend="bbv2.reference.class.project-target.build-dir">build-dir</link> ( )
    rule <link linkend="bbv2.reference.class.project-target.main-target">main-target</link> ( name )
    rule <link linkend="bbv2.reference.class.project-target.has-main-target">has-main-target</link> ( name )
    rule <link linkend="bbv2.reference.class.project-target.find">find</link> ( id : no-error ? )

    # Methods inherited from <link linkend="bbv2.reference.class.abstract-target">abstract-target</link>
    rule <link linkend="bbv2.reference.class.abstract-target.name">name</link> ( )
    rule <link linkend="bbv2.reference.class.abstract-target.project">project</link> ( )
    rule <link linkend="bbv2.reference.class.abstract-target.location">location</link> ( )
    rule <link linkend="bbv2.reference.class.abstract-target.full-name">full-name</link> ( )
}
</programlisting>

  <para>
    This class has the following responsibilities:
    <itemizedlist>
      <listitem>
        <para>
          Maintaining a list of main targets in this project and building them.
        </para>
      </listitem>
    </itemizedlist>
  </para>

  <orderedlist>

    <listitem id="bbv2.reference.class.project-target.generate">
      <indexterm zone="bbv2.reference.class.project-target.generate">
        <primary>generate</primary>
        <secondary>Project Target</secondary>
      </indexterm>
      <code language="jam">rule generate ( property-set )</code>
      <para>
        Overrides
        <link linkend="bbv2.reference.class.abstract-target.generate">abstract-target.generate</link>.

        Generates virtual targets for all the targets contained in this project.
      </para>
      
      <para>
        On success, returns:
        <itemizedlist>
          <listitem>a property-set with the usage requirements to be applied to dependents</listitem>
          <listitem>a list of produced virtual targets, which may be empty.</listitem>
        </itemizedlist>
      </para>
    </listitem>

    <listitem id="bbv2.reference.class.project-target.build-dir">
      <indexterm zone="bbv2.reference.class.project-target.build-dir">
        <primary>build-dir</primary>
        <secondary>Project Target Method</secondary>
      </indexterm>
      <code language="jam">rule build-dir ( )</code>
      <para>
        Returns the root build directory of the project.
      </para>
    </listitem>

    <listitem id="bbv2.reference.class.project-target.main-target">
      <indexterm zone="bbv2.reference.class.project-target.main-target">
        <primary>main-target</primary>
        <secondary>Project Target Method</secondary>
      </indexterm>
      <code language="jam">rule main-target ( name )</code>
      <para>
        Returns a <link linkend="bbv2.reference.class.main-target">main-target</link>
        class instance corresponding to <literal>name</literal>.
        Can only be called after the project has been fully loaded.
      </para>
    </listitem>

    <listitem id="bbv2.reference.class.project-target.has-main-target">
      <indexterm zone="bbv2.reference.class.project-target.has-main-target">
        <primary>has-main-target</primary>
        <secondary>Project Target Method</secondary>
      </indexterm>
      <code language="jam">rule has-main-target ( name )</code>
      <para>
        Returns whether a <link linkend="bbv2.reference.class.main-target">main-target</link>
        with the specified name exists.
        Can only be called after the project has been fully loaded.
      </para>
    </listitem>

    <listitem id="bbv2.reference.class.project-target.find">
      <indexterm zone="bbv2.reference.class.project-target.find">
        <primary>find</primary>
        <secondary>Project Target Method</secondary>
      </indexterm>
      <code language="jam">rule find ( id : no-error ? )</code>
      <para>
        Find and return the target with the specified id, treated relative to
        self. Id may specify either a target or a file name with the target taking
        priority. May report an error or return nothing if the target is not found
        depending on the <literal>no-error</literal> parameter.
      </para>
    </listitem>

    <!--
    
    I'm not sure whether these should be considered public interfaces.
    Leave them out for now (SW):
    
    rule project-module ( )
    rule get ( attribute )
    
    -->
    
    <!--
    
    The following are not documented because I consider them implementation details (SW):
    
    rule __init__ ( name : project-module parent-project ?
        : requirements * : default-build * ) - invoked by the build system.
    
    rule targets-to-build ( ) - internal to project-target
    rule mark-target-as-explicit ( target-name * ) - Implementation of explicit
    rule mark-target-as-always ( target-name * ) - Implementation of always
    rule add-alternative ( target-instance ) - Implementation of targets.main-target-alternative
    rule find-really ( id ) - internal to project-target 
    rule build-main-targets ( ) - internal to project-target
    rule inherit ( parent ) - internal to project-target
    rule add-constant ( name : value + : type ? ) - Implementation of constant/path-constant
    
    -->
    
  </orderedlist>
  
</section>
