{namespace buck.faq}


/**
 * @param id attribute for this blob of HTML so users can link to an individual FAQ. We should make
 *     an effort to keep these identifiers stable to avoid breaking links. Therefore, when choosing
 *     an id, try to make it generic enough so that it is forward-compatible.
 * @param question Question.
 * @param shortAnswer Try to keep this to a one-liner.
 * @param? longAnswer This portion of the answer can include more detail.
 */
{template .faq}
<div class="{css faq}" id="{$id|id}">
  <div class="{css faq_q}">Q: {$question}</div>
  <div class="{css faq_a}">
    A: {$shortAnswer|noAutoescape}
    {if $longAnswer}
    <p>{$longAnswer|noAutoescape}
    {/if}
  <p></div>
</div>
{/template}


/***/
{template .soyweb}
  {call buck.page}
    {param title: 'FAQ' /}
    {param content}

{call .faq}
  {param id: 'why-is-it-called-buck' /}
  {param question}
  Why is it called Buck?
  {/param}
  {param shortAnswer}
  The word "buck" is similar to the word "build" and is quick to type.
  It also has awesome mascot potential.
  {/param}
{/call}

{call .faq}
  {param id: 'windows-support' /}
  {param question}
  Why doesn't Buck support Windows?
  {/param}
  {param shortAnswer}
  There are a number of engineering tasks that need to be addressed before Buck will run on Windows.
  {/param}
  {param longAnswer}
  <ul>
    <li>Buck uses symlinks under the hood in many places. We need to map that concept to the Windows
        equivalent throughout the codebase.
    <li>Buck hardcodes the use of OS X/Linux file and path separators all over the place. This may
        be a poor software design choice, but it makes the code more readable in many circumstances,
        particularly in unit tests.
    <li>Documentation becomes more work to maintain. For example, a nifty trick from the OS X/Linux
        command line, such as:
        <pre>buck targets --type java_test | xargs buck test</pre>
        does not work on Windows, so that must be documented separately.
    <li>The <code>./bin/buck</code> script is written in Bash, so to support Windows, the equivalent
        would have to be maintained as a Windows Batch Script. Keeping both scripts in sync would be
        non-trivial. Alternatively, the run script could be written in a platform-independent
        language, such as Ruby, but that would require users to install an additional tool.
    <li>It increases the surface area of what needs to be tested.
  </ul>
  Despite all of the work it will require, we do hope to support Windows in the future.
  {/param}
{/call}

{call .faq}
  {param id: 'why-is-buck-built-with-ant' /}
  {param question}
  Why is Buck built with Ant instead of Buck?
  {/param}
  {param shortAnswer}
  Self-hosting systems can be more difficult to maintain and debug.
  {/param}
  {param longAnswer}
  If Buck built itself using Buck, then every time a change was made to Buck's source,
  the commit would have to include a new Buck binary that included that change. It would be easy to
  forget to include the binary, difficult to verify that it was the correct binary, and wasteful to
  bloat the Git history of the repository with binaries that could be rebuilt from source.
  Building Buck using Ant ensures we are always building from source, which is simpler to verify.
  <p>
  Also, because Ant is a more mature build system than Buck, it has support for features that we
  have not had time to include in Buck yet, such as generating Javadoc, static analysis
  via <a href="http://pmd.sourceforge.net/">PMD</a>, Python unit tests, etc. 
  <p>
  That said, as a sanity check, Buck is capable of building itself. Once you build Buck using Ant,
  you can re-build Buck using Buck by running <code>./bin/buck build buck</code>.  
  {/param}
{/call}

    {/param}
  {/call}
{/template}
