Documentation
# Fac file format

$docnav

To configure this build system, you create one or more files ending
with `.fac`.  These files specify the rules to build your project,
and must be added to your git repository.  For most moderately complex
projects, you will have just one `.fac` file in git, which will
itself specify specify rules needed to create one or more additional
`.fac` files, which will contain the rules for doing the actual
build.  Each `.fac` file consists of:

1. Comments beginning with `"# "` (a pound sign followed by a space).

2. Rules beginning with `"| "` (a pipe character followed by a
   space).  The remainder of the line is the actual command to perform
   the build.  Following this line (possibly separated by blank lines
   and comments) are one or more of the following directives.  The
   order of these directives has no effect, so long as the follow the
   `"| "` line to which they apply.

2. Optional rules beginning with `"? "` are identical to rules
   beginning with a pipe, with the sole difference being that optional
   rules are only built if they are needed to build another target, or
   if they are explicitly requested, e.g. by invoking `fac
   optional-output-filename`.  Optional rules enable you to specify a
   large number of rules and only have what is needed built.  Optional
   rules should always specify at least one output file, or they will
   never be built.
   <p>
   Optional rules can be helpful for rules (often autogenerated) that
   might be slow or require dependencies that not all users will
   have.  They can be convenient for scripts that define a whole slew
   of rules in a facfile, and which don't want to determine which of
   these are needed for the actual build.  Or for something like
   documentation, which only some users will want to actually build.
   </p>

3. Output specifications beginning with `"> "` followed by the name of
   the file that is output.  There is no escaping performed, and only
   newlines and null characters are disallowed in the file name.
   There is little need to specify the output for rules, since fac
   can determine this automatically.  The only reason to specify
   output is so that on the very first build a user can request that
   we build only the specified rule.

4. Input specifications beginning with `"< "` followed by the name of
   the file that is required.  You only need specify inputs when they
   are generated files.  Even then, you need only specify the inputs
   if you wish to have the build succeed on the first attempt.

5. Dependency output specifications beginning with `"M "` followed by
   the name of the deps file that is generated by the command.  This
   is designed for compilers which have the ability to track
   dependencies and output a `Makefile` fragment documenting those
   dependencies.  This is implemented for two reasons.  Firstly, by
   relying on the compiler for dependency tracking, fac can run more
   quickly than if it tracks file accesses itself.  Secondly, it makes
   fac more useful on platforms (currently Windows and Mac OS) where
   it is unable to track dependencies.  *This feature is only
   available in the version of fac implemented in rust.*

6. There are two ways to specify "cache" files.  A cache file is a
   file that may be either read or written by a given command, but
   doesn't affect the output and not itself an output.  One nice
   example is the ".pyc" files sometimes generated when you run a
   python program.  One python command may produce a .pyc file, and
   another may read it (if they both use the same module), but that
   does not mean that there is a dependency between those two
   commands.  You can specify a cache suffix (such as `.pyc`) using a
   `"c "` line, or you can specify a cache prefix (such as
   `~/.ccache`) using a capitalized `"C "` line.  The latter can be
   helpful if you find that your software is being rebuilt needlessly
   due to some cache file being modified.