{namespace buck}

/**
 * @param title
 * @param? subtitle
 * @param content
 * @param? ishome
 * @param? prettify true if https://code.google.com/p/google-code-prettify/
 *     should be used.
 * @param description the content of the og:description meta tag
 */
{template .page}
  {call .header}
    {param ishome: $ishome /}
    {param title: $title /}
    {param subtitle: $subtitle /}
    {param prettify: $prettify /}
    {param description: $description /}
  {/call}

  <div class="{css overview}">
    {$content|noAutoescape}
  </div>

  {call .footer}
    {param prettify: $prettify /}
  {/call}
{/template}

/**
 * @param title
 * @param? subtitle
 * @param? ishome
 * @param? prettify true if https://code.google.com/p/google-code-prettify/
 *     should be used.
 * @param description the content of the og:description meta tag
 */
{template .header}
{let $fullTitle}
  Buck: {$title}
{/let}
<!doctype html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns#">
  <title>{$fullTitle}</title>
  <link type="image/png" rel="shortcut icon" href="{ROOT}static/favicon.png" />
  <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no" />
  <meta http-equiv="content-type" content="text/html;charset=utf-8">
  {if $prettify}
    <link type="text/css"
          rel="stylesheet"
          href="{ROOT}google-code-prettify/prettify.css"
          >
  {/if}
  // List buck.css second to override prettify.
  <link type="text/css" rel="stylesheet" href="{ROOT}static/buck.css">

// Google Analytics.
<script>
(function(i,s,o,g,r,a,m){lb}i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){lb}
(i[r].q=i[r].q||[]).push(arguments){rb},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
{rb})(window,document,'script','//www.google-analytics.com/analytics.js','ga');

ga('create', 'UA-40185670-1', 'github.io');
ga('send', 'pageview');
</script>

  // TODO(mbolin): Pass $og_type in as a parameter.
  {let $og_type}
    {if $ishome}
      website
    {else}
      article
    {/if}
  {/let}

  <meta property="og:locale" content="en_US">
  <meta property="og:title" content="{$title}">
  <meta property="og:site_name" content="Buck: a build tool">
  <meta property="og:image" content="http://facebook.github.io/buck/static/og.png">
  <meta property="og:type" content="{$og_type}">
  <meta property="og:description" content="{$description}">
  <meta property="fb:admins" content="{FB_APP_ID}">

</head>
<body>

<div id="fb-root"></div>
<script>(function(d, s, id) {lb}
  var js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) return;
  js = d.createElement(s); js.id = id;
  js.src = "//connect.facebook.net/en_US/all.js#xfbml=1&appId={FB_APP_ID}";
  fjs.parentNode.insertBefore(js, fjs);
{rb}(document, 'script', 'facebook-jssdk'));</script>

	<header class='topbar'><nav class='width'>
			<a href='http://facebook.github.io/buck/'><h1>Buck</h1></a>
      <ul class='menu'>
        <li><a href='/buck/setup/quick_start.html'>Get Started</a>
        <li><a href='https://groups.google.com/forum/#!forum/buck-build'>Group</a>
        <li><a href='/buck/javadoc/'>API</a>
        <li><a href='https://github.com/facebook/buck'>GitHub</a>
      </ul>
	</nav></header>

{if $ishome}
  <header class='hero'><div class='width'>
    <hgroup>
      <h1>
        A high-performance build tool
      </h1>
      <a class='button' href='setup/quick_start.html'>Quick Start</a>&nbsp;
      <a class='button' href='https://github.com/facebook/buck'>GitHub</a>
    </hgroup>
    <aside>
      <img id="super_console_sample"
     src="{ROOT}static/buck-build-15fps.gif"
     alt="Chrome Tracing Sample">
    </aside>
  </div></header>
{/if}


	<section class='content'><div class='width'>

  <article>

  {if not $ishome}
    <h1>{$title}{if $subtitle}:<div class="subtitle">{$subtitle}</div>{/if}</h1>
  {/if}

{/template}

/**
 * Consider passing in the path to the URL of the page that the user
 * is currently on and not hyperlinking that item in the table of contents.
 */
{template .tableOfContents}
  <h3>Getting Started</h3>
  <ul>
    <li><a href="{ROOT}">Overview</a>
    <li><a href="{ROOT}setup/quick_start.html">Quick Start</a>
    <li><a href="{ROOT}setup/install.html">Downloading and Installing Buck</a>
    <li><a href="{ROOT}article/exopackage.html">Exopackage</a>
  </ul>
  <h3>About</h3>
  <ul>
    <li><a href="{ROOT}concept/what_makes_buck_so_fast.html">What Makes Buck so Fast?</a>
    <li><a href="{ROOT}concept/troubleshooting.html">Troubleshooting</a>
    <li><a href="{ROOT}about/performance_tuning.html">Performance Tuning</a>
    <li><a href="{ROOT}concept/faq.html">FAQ</a>
    <li><a href="{ROOT}presentations/">Learn More (Buck Presentations)</a>
  </ul>
  <h3>Concepts</h3>
  <ul>
    <li><a href="{ROOT}concept/build_rule.html">Build Rule</a>
    <li><a href="{ROOT}concept/build_target.html">Build Target</a>
    <li><a href="{ROOT}concept/build_file.html">Build File</a>
    <li><a href="{ROOT}concept/buckversion.html">.buckversion</a>
    <li><a href="{ROOT}concept/nobuckcheck.html">.nobuckcheck</a>
    <li><a href="{ROOT}concept/buckconfig.html">.buckconfig</a>
    <li><a href="{ROOT}concept/build_target_pattern.html">Build Target Pattern</a>
    <li><a href="{ROOT}concept/visibility.html">Visibility</a>
    <li><a href="{ROOT}concept/http_cache_api.html">HTTP Cache API</a>
  </ul>
  <h3>Build Rules</h3>
  <ul>
    // TODO(mbolin): document android_instrumentation_apk
    // TODO(mbolin): document robolectric_test
    {foreach $rule in [
        'android_aar',
        'android_binary',
        'android_build_config',
        'android_library',
        'android_prebuilt_aar',
        'android_resource',
        'apk_genrule',
        'cxx_binary',
        'cxx_library',
        'cxx_test',
        'gen_aidl',
        'genrule',
        'java_binary',
        'java_library',
        'java_test',
        'keystore',
        'ndk_library',
        'prebuilt_jar',
        'prebuilt_native_library',
        'project_config',
        'python_binary',
        'python_library',
        'python_test',
        ]}
      <li><a href="{ROOT}rule/{$rule}.html">{$rule}()</a>
    {/foreach}
  </ul>
  <h3>Functions</h3>
  <ul>
    {foreach $function in [
        'glob',
        'include_defs',
        ]}
      <li><a href="{ROOT}function/{$function}.html">{$function}()</a>
    {/foreach}
    <li><a href="{ROOT}function/string_parameter_macros.html">String Parameter Macros</a>
  </ul>
  <h3>Commands</h3>
  <ul>
    {foreach $command in [
        'audit',
        'build',
        'clean',
        'install',
        'project',
        'quickstart',
        'targets',
        'test',
        'uninstall',
        ]}
      <li><a href="{ROOT}command/{$command}.html">buck {$command}</a>
    {/foreach}
    <li><a href="{ROOT}command/buckd.html">buckd</a>
  </ul>
  <h3>Extending Buck</h3>
  <ul>
    <li><a href="{ROOT}extending/macros.html">Custom Macros</a>
    <li><a href="{ROOT}extending/rules.html">Custom Rules</a>
  </ul>
  <h3>Contributing to Buck</h3>
  <ul>
    <li><a href="https://groups.google.com/group/buck-build">Discussion Group</a>
    <li><a href="https://github.com/facebook/buck/issues/new">Report a Bug</a>
    <li><a href="{ROOT}contributing/tour.html">Tour of the Codebase</a>
    <li><a href="{ROOT}contributing/development.html">Development Workflow</a>
    <li><a href="{ROOT}contributing/codestyle.html">Code Style</a>
    <li><a href="{ROOT}contributing/logging.html">Logging</a>
    <li><a href="{ROOT}contributing/immutables.html">Immutable Value Types</a>
    <li><a href="{ROOT}javadoc">API</a>
    <li><a href="https://github.com/facebook/buck">Browse the Source Code</a>
  </ul>
</ul>
{/template}

/**
 * @param? prettify true if https://code.google.com/p/google-code-prettify/
 *     should be used.
 */
{template .footer}

</article>

  <nav>
    {call buck.tableOfContents data="all" /}
  </nav>


</div></section>

<footer><div class='width'>
  &copy; Copyright Facebook, 2013 -
</div></footer>

{if hasData() and $prettify}
  <script src="{ROOT}google-code-prettify/prettify.js"></script>
  <script>prettyPrint()</script>
{/if}

</body>
</html>

{/template}


/**
 * Used to format an argument to a build rule.
 *
 * @param name Name of the argument.
 * @param? default What the default value should be. If null, the argument is
 *     required.
 * @param desc Prose description of the argument.
 */
{template .arg}
  <li class="{css arg}"><code>{$name}</code>

  {sp}
  {if isNonnull($default)}
    (defaults to <code>{$default}</code>)
  {else}
    (required)
  {/if}
  {sp}

  {$desc|noAutoescape}

{/template}


/**
 * @param overview HTML description of the rule.
 * @param status one of FROZEN, UNFROZEN, or DEPRECATED to indicate the
       current level of support for the rule.
 * @param args HTML documentation for each arg for the rule.
 *     Should be created using multiple applications of the {buck.arg}
 *     template.
 * @param? examples HTML documentation that shows examples of the build
 *     rule in action.
 * @param? furtherexp Further explanation; HTML shown after arguments and
        examples.
 */
{template .rule}
{switch $status}
  {case 'FROZEN'}
    // Nothing to show here.
  {case 'UNFROZEN'}
    <p><small>This is liable to change in the future.</small></p>
  {case 'DEPRECATED'}
    <p><small>This will be removed in the future.</small></p>
{/switch}
{$overview|noAutoescape}

<h2>Arguments</h2>
<ul class="{css arglist}">
  {$args|noAutoescape}
</ul>

{if $examples}
  <h2>Examples</h2>
  {$examples|noAutoescape}
{/if}
{if $furtherexp}
  {$furtherexp|noAutoescape}
{/if}
{/template}


/**
 * Used to format an argument to a build rule.
 *
 * @param? name Name of the argument.
 * @param? default What the default value should be. If null, the argument is
 *     required.
 * @param desc Prose description of the argument.
 */
{template .functionArg}
  <li class="{css arg}">
    {if $name}
      <code>{$name}</code>{sp}
    {/if}

  {if isNonnull($default)}
    (defaults to <code>{$default}</code>)
    {sp}
  {/if}

  {$desc|noAutoescape}
{/template}


/**
 * Used to format a parameter of a command.
 *
 * @param name Name of the parameter.
 * @param? alias The alias for this parameter.
 * @param desc Prose description of the parameter.
 */
{template .param}
  <li class="{css arg}"><code>--{$name}</code>
  {sp}
  {if $alias}
    <code>(-{$alias})</code>
  {/if}

  {sp}
  {$desc|noAutoescape}

{/template}


/**
 * @param overview HTML description of the command.
 * @param params HTML documentation for each param of the command.
 *     Should be created using multiple applications of the {buck.param}
 *     template.
 * @param? examples HTML documentation that shows examples of the build
 *     rule in action.
 */
{template .command}
{$overview|noAutoescape}

<h2>Parameters</h2>
<ul class="{css arglist}">
  {$params|noAutoescape}
</ul>

{if $examples}
  <h2>Examples</h2>
  {$examples|noAutoescape}
{/if}
{/template}


/**
 * @param overview HTML description of the function.
 * @param args HTML documentation for each arg for the function.
 *     Should be created using multiple applications of the {buck.functionArg}
 *     template.
 * @param? examples HTML documentation that shows examples of the function
 *     in action.
 */
{template .function}
  // For now, functions and build rules should be documented the same way.
  {call .rule data="all" /}
{/template}


/** @param name */
{template .ruleLink}
<a href="{ROOT}rule/{$name}.html"><code>{$name}</code></a>
{/template}


/***/
{template .android_binary}
{call .ruleLink}{param name : 'android_binary' /}{/call}
{/template}

/***/
{template .android_build_config}
{call .ruleLink}{param name : 'android_build_config' /}{/call}
{/template}

/***/
{template .android_library}
{call .ruleLink}{param name : 'android_library' /}{/call}
{/template}

/***/
{template .android_prebuilt_aar}
{call .ruleLink}{param name : 'android_prebuilt_aar' /}{/call}
{/template}

/***/
{template .android_resource}
{call .ruleLink}{param name : 'android_resource' /}{/call}
{/template}

/***/
{template .genrule}
{call .ruleLink}{param name : 'genrule' /}{/call}
{/template}

/***/
{template .java_library}
{call .ruleLink}{param name : 'java_library' /}{/call}
{/template}

/***/
{template .keystore}
{call .ruleLink}{param name : 'keystore' /}{/call}
{/template}

/***/
{template .ndk_library}
{call .ruleLink}{param name : 'ndk_library' /}{/call}
{/template}

/***/
{template .prebuilt_jar}
{call .ruleLink}{param name : 'prebuilt_jar' /}{/call}
{/template}

/***/
{template .project_config}
{call .ruleLink}{param name : 'project_config' /}{/call}
{/template}

/***/
{template .python_binary}
{call .ruleLink}{param name : 'python_binary' /}{/call}
{/template}

/***/
{template .python_library}
{call .ruleLink}{param name : 'python_library' /}{/call}
{/template}

/***/
{template .python_test}
{call .ruleLink}{param name : 'python_test' /}{/call}
{/template}

/***/
{template .fn_glob}
<a href="{ROOT}function/glob.html"><code>glob()</code></a>
{/template}

/***/
{template .string_parameter_macros}
<a href="{ROOT}function/string_parameter_macros.html">string parameter macros</a>
{/template}

/**
 * @param name
 */
{template .cmd_link}
<a href="{ROOT}command/{$name}.html"><code>buck {$name}</code></a>
{/template}

/***/
{template .cmd_build}
{call .cmd_link}{param name : 'build' /}{/call}
{/template}

/***/
{template .cmd_clean}
{call .cmd_link}{param name : 'clean' /}{/call}
{/template}

/***/
{template .cmd_install}
{call .cmd_link}{param name : 'install' /}{/call}
{/template}

/***/
{template .cmd_project}
{call .cmd_link}{param name : 'project' /}{/call}
{/template}

/***/
{template .cmd_quickstart}
{call .cmd_link}{param name : 'quickstart' /}{/call}
{/template}

/***/
{template .cmd_uninstall}
{call .cmd_link}{param name : 'uninstall' /}{/call}
{/template}

/***/
{template .concept_buckconfig}
<a href="{ROOT}concept/buckconfig.html"><code>.buckconfig</code></a>
{/template}

/***/
{template .visibility_arg}
{call buck.arg}
  {param name : 'visibility' /}
  {param default : '[]' /}
  {param desc}
  List of <a href="{ROOT}concept/build_target_pattern.html">build
  target patterns</a> that identify the build rules that can include
  this rule in its <code>deps</code>.
  {/param}
{/call}
{/template}

/***/
{template .tests_arg}
{call buck.arg}
  {param name : 'tests' /}
  {param default : '[]' /}
  {param desc}
  List of <a href="{ROOT}concept/build_target.html">build target</a> that
  identify the test rules that exercise this target.
  {/param}
{/call}
{/template}

/**
 *
 */
{template .platformWarning}
<p><strong>
Note: Buck works only on Mac OS X and Linux. Windows is not supported.
</strong></p>
{/template}


/**
 * @param? withAlias
 */
{template .installationInstructions}
{literal}<pre>
git clone https://github.com/facebook/buck.git
cd buck
ant{/literal}{\n}
{if $withAlias}
sudo ln -s ${lb}PWD{rb}/bin/buck /usr/bin/buck
{else}
./bin/buck --help
{/if}
</pre>
{/template}
