The Ninja build system
======================


Introduction
------------

Ninja is yet another build system.  It takes as input the
interdependencies of files (typically source code and output
executables) and orchestrates building them, _quickly_.

Ninja joins a sea of other build systems.  Its distinguishing goal is
to be fast.  It is born from
http://neugierig.org/software/chromium/notes/2011/02/ninja.html[my
work on the Chromium browser project], which has over 30,000 source
files and whose other build systems (including one built from custom
non-recursive Makefiles) would take ten seconds to start building
after changing one file.  Ninja is under a second.

Philosophical overview
~~~~~~~~~~~~~~~~~~~~~~

Where other build systems are high-level languages, Ninja aims to be
an assembler.

Build systems get slow when they need to make decisions.  When you are
in a edit-compile cycle you want it to be as fast as possible -- you
want the build system to do the minimum work necessary to figure out
what needs to be built immediately.

Ninja contains the barest functionality necessary to describe
arbitrary dependency graphs.  Its lack of syntax makes it impossible
to express complex decisions.

Instead, Ninja is intended to be used with a separate program
generating its input files.  The generator program (like the
`./configure` found in autotools projects) can analyze system
dependencies and make as many decisions as possible up front so that
incremental builds stay fast.  Going beyond autotools, even build-time
decisions like "which compiler flags should I use?"  or "should I
build a debug or release-mode binary?"  belong in the `.ninja` file
generator.

Design goals
~~~~~~~~~~~~

Here are the design goals of Ninja:

* very fast (i.e., instant) incremental builds, even for very large
  projects.

* very little policy about how code is built.  Different projects and
  higher-level build systems have different opinions about how code
  should be built; for example, should built objects live alongside
  the sources or should all build output go into a separate directory?
  Is there a "package" rule that builds a distributable package of
  the project?  Sidestep these decisions by trying to allow either to
  be implemented, rather than choosing, even if that results in
  more verbosity.

* get dependencies correct, and in particular situations that are
  difficult to get right with Makefiles (e.g. outputs need an implicit
  dependency on the command line used to generate them; to build C
  source code you need to use gcc's `-M` flags for header
  dependencies).

* when convenience and speed are in conflict, prefer speed.

Some explicit _non-goals_:

* convenient syntax for writing build files by hand.  _You should
  generate your ninja files using another program_.  This is how we
  can sidestep many policy decisions.

* built-in rules. _Out of the box, Ninja has no rules for
  e.g. compiling C code._

* build-time customization of the build. _Options belong in
  the program that generates the ninja files_.

* build-time decision-making ability such as conditionals or search
  paths. _Making decisions is slow._

To restate, Ninja is faster than other build systems because it is
painfully simple.  You must tell Ninja exactly what to do when you
create your project's `.ninja` files.

Comparison to Make
~~~~~~~~~~~~~~~~~~

Ninja is closest in spirit and functionality to Make, relying on
simple dependencies between file timestamps.

But fundamentally, make has a lot of _features_: suffix rules,
functions, built-in rules that e.g. search for RCS files when building
source.  Make's language was designed to be written by humans.  Many
projects find make alone adequate for their build problems.

In contrast, Ninja has almost no features; just those necessary to get
builds correct while punting most complexity to generation of the
ninja input files.  Ninja by itself is unlikely to be useful for most
projects.

Here are some of the features Ninja adds to Make.  (These sorts of
features can often be implemented using more complicated Makefiles,
but they are not part of make itself.)

* Ninja has special support for discovering extra dependencies at build
  time, making it easy to get <<ref_headers,header dependencies>>
  correct for C/C++ code.

* A build edge may have multiple outputs.

* Outputs implicitly depend on the command line that was used to generate
  them, which means that changing e.g. compilation flags will cause
  the outputs to rebuild.

* Output directories are always implicitly created before running the
  command that relies on them.

* Rules can provide shorter descriptions of the command being run, so
  you can print e.g. `CC foo.o` instead of a long command line while
  building.

* Builds are always run in parallel, based by default on the number of
  CPUs your system has.  Underspecified build dependencies will result
  in incorrect builds.

* Command output is always buffered.  This means commands running in
  parallel don't interleave their output, and when a command fails we
  can print its failure output next to the full command line that
  produced the failure.


Using Ninja for your project
----------------------------

Ninja currently works on Unix-like systems and Windows. It's seen the
most testing on Linux (and has the best performance there) but it runs
fine on Mac OS X and FreeBSD.

If your project is small, Ninja's speed impact is likely unnoticeable.
(However, even for small projects it sometimes turns out that Ninja's
limited syntax forces simpler build rules that result in faster
builds.)  Another way to say this is that if you're happy with the
edit-compile cycle time of your project already then Ninja won't help.

There are many other build systems that are more user-friendly or
featureful than Ninja itself.  For some recommendations: the Ninja
author found http://gittup.org/tup/[the tup build system] influential
in Ninja's design, and thinks https://github.com/apenwarr/redo[redo]'s
design is quite clever.

Ninja's benefit comes from using it in conjunction with a smarter
meta-build system.

https://gn.googlesource.com/gn/[gn]:: The meta-build system used to
generate build files for Google Chrome and related projects (v8,
node.js), as well as Google Fuchsia.  gn can generate Ninja files for
all platforms supported by Chrome.

https://cmake.org/[CMake]:: A widely used meta-build system that
can generate Ninja files on Linux as of CMake version 2.8.8.  Newer versions
of CMake support generating Ninja files on Windows and Mac OS X too.

https://github.com/ninja-build/ninja/wiki/List-of-generators-producing-ninja-build-files[others]:: Ninja ought to fit perfectly into other meta-build software
like https://premake.github.io/[premake].  If you do this work,
please let us know!

Running Ninja
~~~~~~~~~~~~~

Run `ninja`.  By default, it looks for a file named `build.ninja` in
the current directory and builds all out-of-date targets.  You can
specify which targets (files) to build as command line arguments.

There is also a special syntax `target^` for specifying a target
as the first output of some rule containing the source you put in
the command line, if one exists. For example, if you specify target as
`foo.c^` then `foo.o` will get built (assuming you have those targets
in your build files).

`ninja -h` prints help output.  Many of Ninja's flags intentionally
match those of Make; e.g `ninja -C build -j 20` changes into the
`build` directory and runs 20 build commands in parallel.  (Note that
Ninja defaults to running commands in parallel anyway, so typically
you don't need to pass `-j`.)


Environment variables
~~~~~~~~~~~~~~~~~~~~~

Ninja supports one environment variable to control its behavior:
`NINJA_STATUS`, the progress status printed before the rule being run.

Several placeholders are available:

`%s`:: The number of started edges.
`%t`:: The total number of edges that must be run to complete the build.
`%p`:: The percentage of started edges.
`%r`:: The number of currently running edges.
`%u`:: The number of remaining edges to start.
`%f`:: The number of finished edges.
`%o`:: Overall rate of finished edges per second
`%c`:: Current rate of finished edges per second (average over builds
specified by `-j` or its default)
`%e`:: Elapsed time in seconds.  _(Available since Ninja 1.2.)_
`%%`:: A plain `%` character.

The default progress status is `"[%f/%t] "` (note the trailing space
to separate from the build rule). Another example of possible progress status
could be `"[%u/%r/%f] "`.

Extra tools
~~~~~~~~~~~

The `-t` flag on the Ninja command line runs some tools that we have
found useful during Ninja's development.  The current tools are:

[horizontal]
`query`:: dump the inputs and outputs of a given target.

`browse`:: browse the dependency graph in a web browser.  Clicking a
file focuses the view on that file, showing inputs and outputs.  This
feature requires a Python installation. By default port 8000 is used
and a web browser will be opened. This can be changed as follows:
+
----
ninja -t browse --port=8000 --no-browser mytarget
----
+
`graph`:: output a file in the syntax used by `graphviz`, a automatic
graph layout tool.  Use it like:
+
----
ninja -t graph mytarget | dot -Tpng -ograph.png
----
+
In the Ninja source tree, `ninja graph.png`
generates an image for Ninja itself.  If no target is given generate a
graph for all root targets.

`targets`:: output a list of targets either by rule or by depth.  If used
like +ninja -t targets rule _name_+ it prints the list of targets
using the given rule to be built.  If no rule is given, it prints the source
files (the leaves of the graph).  If used like
+ninja -t targets depth _digit_+ it
prints the list of targets in a depth-first manner starting by the root
targets (the ones with no outputs). Indentation is used to mark dependencies.
If the depth is zero it prints all targets. If no arguments are provided
+ninja -t targets depth 1+ is assumed. In this mode targets may be listed
several times. If used like this +ninja -t targets all+ it
prints all the targets available without indentation and it is faster
than the _depth_ mode.

`commands`:: given a list of targets, print a list of commands which, if
executed in order, may be used to rebuild those targets, assuming that all
output files are out of date.

`clean`:: remove built files. By default it removes all built files
except for those created by the generator.  Adding the `-g` flag also
removes built files created by the generator (see <<ref_rule,the rule
reference for the +generator+ attribute>>).  Additional arguments are
targets, which removes the given targets and recursively all files
built for them.
+
If used like +ninja -t clean -r _rules_+ it removes all files built using
the given rules.
+
Files created but not referenced in the graph are not removed. This
tool takes in account the +-v+ and the +-n+ options (note that +-n+
implies +-v+).

`compdb`:: given a list of rules, each of which is expected to be a
C family language compiler rule whose first input is the name of the
source file, prints on standard output a compilation database in the
http://clang.llvm.org/docs/JSONCompilationDatabase.html[JSON format] expected
by the Clang tooling interface.
_Available since Ninja 1.2._

`deps`:: show all dependencies stored in the `.ninja_deps` file. When given a
target, show just the target's dependencies. _Available since Ninja 1.4._

`recompact`:: recompact the `.ninja_deps` file. _Available since Ninja 1.4._

`rules`:: output the list of all rules (eventually with their description
if they have one).  It can be used to know which rule name to pass to
+ninja -t targets rule _name_+ or +ninja -t compdb+.

Writing your own Ninja files
----------------------------

The remainder of this manual is only useful if you are constructing
Ninja files yourself: for example, if you're writing a meta-build
system or supporting a new language.

Conceptual overview
~~~~~~~~~~~~~~~~~~~

Ninja evaluates a graph of dependencies between files, and runs
whichever commands are necessary to make your build target up to date
as determined by file modification times.  If you are familiar with
Make, Ninja is very similar.

A build file (default name: `build.ninja`) provides a list of _rules_
-- short names for longer commands, like how to run the compiler --
along with a list of _build_ statements saying how to build files
using the rules -- which rule to apply to which inputs to produce
which outputs.

Conceptually, `build` statements describe the dependency graph of your
project, while `rule` statements describe how to generate the files
along a given edge of the graph.

Syntax example
~~~~~~~~~~~~~~

Here's a basic `.ninja` file that demonstrates most of the syntax.
It will be used as an example for the following sections.

---------------------------------
cflags = -Wall

rule cc
  command = gcc $cflags -c $in -o $out

build foo.o: cc foo.c
---------------------------------

Variables
~~~~~~~~~
Despite the non-goal of being convenient to write by hand, to keep
build files readable (debuggable), Ninja supports declaring shorter
reusable names for strings.  A declaration like the following

----------------
cflags = -g
----------------

can be used on the right side of an equals sign, dereferencing it with
a dollar sign, like this:

----------------
rule cc
  command = gcc $cflags -c $in -o $out
----------------

Variables can also be referenced using curly braces like `${in}`.

Variables might better be called "bindings", in that a given variable
cannot be changed, only shadowed.  There is more on how shadowing works
later in this document.

Rules
~~~~~

Rules declare a short name for a command line.  They begin with a line
consisting of the `rule` keyword and a name for the rule.  Then
follows an indented set of `variable = value` lines.

The basic example above declares a new rule named `cc`, along with the
command to run.  In the context of a rule, the `command` variable
defines the command to run, `$in` expands to the list of
input files (`foo.c`), and `$out` to the output files (`foo.o`) for the
command.  A full list of special variables is provided in
<<ref_rule,the reference>>.

Build statements
~~~~~~~~~~~~~~~~

Build statements declare a relationship between input and output
files.  They begin with the `build` keyword, and have the format
+build _outputs_: _rulename_ _inputs_+.  Such a declaration says that
all of the output files are derived from the input files.  When the
output files are missing or when the inputs change, Ninja will run the
rule to regenerate the outputs.

The basic example above describes how to build `foo.o`, using the `cc`
rule.

In the scope of a `build` block (including in the evaluation of its
associated `rule`), the variable `$in` is the list of inputs and the
variable `$out` is the list of outputs.

A build statement may be followed by an indented set of `key = value`
pairs, much like a rule.  These variables will shadow any variables
when evaluating the variables in the command.  For example:

----------------
cflags = -Wall -Werror
rule cc
  command = gcc $cflags -c $in -o $out

# If left unspecified, builds get the outer $cflags.
build foo.o: cc foo.c

# But you can shadow variables like cflags for a particular build.
build special.o: cc special.c
  cflags = -Wall

# The variable was only shadowed for the scope of special.o;
# Subsequent build lines get the outer (original) cflags.
build bar.o: cc bar.c

----------------

For more discussion of how scoping works, consult <<ref_scope,the
reference>>.

If you need more complicated information passed from the build
statement to the rule (for example, if the rule needs "the file
extension of the first input"), pass that through as an extra
variable, like how `cflags` is passed above.

If the top-level Ninja file is specified as an output of any build
statement and it is out of date, Ninja will rebuild and reload it
before building the targets requested by the user.

Generating Ninja files from code
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

`misc/ninja_syntax.py` in the Ninja distribution is a tiny Python
module to facilitate generating Ninja files.  It allows you to make
Python calls like `ninja.rule(name='foo', command='bar',
depfile='$out.d')` and it will generate the appropriate syntax.  Feel
free to just inline it into your project's build system if it's
useful.


More details
------------

The `phony` rule
~~~~~~~~~~~~~~~~

The special rule name `phony` can be used to create aliases for other
targets.  For example:

----------------
build foo: phony some/file/in/a/faraway/subdir/foo
----------------

This makes `ninja foo` build the longer path.  Semantically, the
`phony` rule is equivalent to a plain rule where the `command` does
nothing, but phony rules are handled specially in that they aren't
printed when run, logged (see below), nor do they contribute to the
command count printed as part of the build process.

`phony` can also be used to create dummy targets for files which
may not exist at build time.  If a phony build statement is written
without any dependencies, the target will be considered out of date if
it does not exist.  Without a phony build statement, Ninja will report
an error if the file does not exist and is required by the build.

To create a rule that never rebuilds, use a build rule without any input:
----------------
rule touch
  command = touch $out
build file_that_always_exists.dummy: touch
build dummy_target_to_follow_a_pattern: phony file_that_always_exists.dummy
----------------


Default target statements
~~~~~~~~~~~~~~~~~~~~~~~~~

By default, if no targets are specified on the command line, Ninja
will build every output that is not named as an input elsewhere.
You can override this behavior using a default target statement.
A default target statement causes Ninja to build only a given subset
of output files if none are specified on the command line.

Default target statements begin with the `default` keyword, and have
the format +default _targets_+.  A default target statement must appear
after the build statement that declares the target as an output file.
They are cumulative, so multiple statements may be used to extend
the list of default targets.  For example:

----------------
default foo bar
default baz
----------------

This causes Ninja to build the `foo`, `bar` and `baz` targets by
default.


[[ref_log]]
The Ninja log
~~~~~~~~~~~~~

For each built file, Ninja keeps a log of the command used to build
it.  Using this log Ninja can know when an existing output was built
with a different command line than the build files specify (i.e., the
command line changed) and knows to rebuild the file.

The log file is kept in the build root in a file called `.ninja_log`.
If you provide a variable named `builddir` in the outermost scope,
`.ninja_log` will be kept in that directory instead.


[[ref_versioning]]
Version compatibility
~~~~~~~~~~~~~~~~~~~~~

_Available since Ninja 1.2._

Ninja version labels follow the standard major.minor.patch format,
where the major version is increased on backwards-incompatible
syntax/behavioral changes and the minor version is increased on new
behaviors.  Your `build.ninja` may declare a variable named
`ninja_required_version` that asserts the minimum Ninja version
required to use the generated file.  For example,

-----
ninja_required_version = 1.1
-----

declares that the build file relies on some feature that was
introduced in Ninja 1.1 (perhaps the `pool` syntax), and that
Ninja 1.1 or greater must be used to build.  Unlike other Ninja
variables, this version requirement is checked immediately when
the variable is encountered in parsing, so it's best to put it
at the top of the build file.

Ninja always warns if the major versions of Ninja and the
`ninja_required_version` don't match; a major version change hasn't
come up yet so it's difficult to predict what behavior might be
required.

[[ref_headers]]
C/C++ header dependencies
~~~~~~~~~~~~~~~~~~~~~~~~~

To get C/C++ header dependencies (or any other build dependency that
works in a similar way) correct Ninja has some extra functionality.

The problem with headers is that the full list of files that a given
source file depends on can only be discovered by the compiler:
different preprocessor defines and include paths cause different files
to be used.  Some compilers can emit this information while building,
and Ninja can use that to get its dependencies perfect.

Consider: if the file has never been compiled, it must be built anyway,
generating the header dependencies as a side effect.  If any file is
later modified (even in a way that changes which headers it depends
on) the modification will cause a rebuild as well, keeping the
dependencies up to date.

When loading these special dependencies, Ninja implicitly adds extra
build edges such that it is not an error if the listed dependency is
missing.  This allows you to delete a header file and rebuild without
the build aborting due to a missing input.

depfile
^^^^^^^

`gcc` (and other compilers like `clang`) support emitting dependency
information in the syntax of a Makefile.  (Any command that can write
dependencies in this form can be used, not just `gcc`.)

To bring this information into Ninja requires cooperation.  On the
Ninja side, the `depfile` attribute on the `build` must point to a
path where this data is written.  (Ninja only supports the limited
subset of the Makefile syntax emitted by compilers.)  Then the command
must know to write dependencies into the `depfile` path.
Use it like in the following example:

----
rule cc
  depfile = $out.d
  command = gcc -MMD -MF $out.d [other gcc flags here]
----

The `-MMD` flag to `gcc` tells it to output header dependencies, and
the `-MF` flag tells it where to write them.

deps
^^^^

_(Available since Ninja 1.3.)_

It turns out that for large projects (and particularly on Windows,
where the file system is slow) loading these dependency files on
startup is slow.

Ninja 1.3 can instead process dependencies just after they're generated
and save a compacted form of the same information in a Ninja-internal
database.

Ninja supports this processing in two forms.

1. `deps = gcc` specifies that the tool outputs `gcc`-style dependencies
   in the form of Makefiles.  Adding this to the above example will
   cause Ninja to process the `depfile` immediately after the
   compilation finishes, then delete the `.d` file (which is only used
   as a temporary).

2. `deps = msvc` specifies that the tool outputs header dependencies
   in the form produced by Visual Studio's compiler's
   http://msdn.microsoft.com/en-us/library/hdkef6tk(v=vs.90).aspx[`/showIncludes`
   flag].  Briefly, this means the tool outputs specially-formatted lines
   to its stdout.  Ninja then filters these lines from the displayed
   output.  No `depfile` attribute is necessary, but the localized string
   in front of the the header file path. For instance
   `msvc_deps_prefix = Note: including file:`
   for a English Visual Studio (the default). Should be globally defined.
+
----
msvc_deps_prefix = Note: including file:
rule cc
  deps = msvc
  command = cl /showIncludes -c $in /Fo$out
----

If the include directory directives are using absolute paths, your depfile
may result in a mixture of relative and absolute paths. Paths used by other
build rules need to match exactly. Therefore, it is recommended to use
relative paths in these cases.

[[ref_pool]]
Pools
~~~~~

_Available since Ninja 1.1._

Pools allow you to allocate one or more rules or edges a finite number
of concurrent jobs which is more tightly restricted than the default
parallelism.

This can be useful, for example, to restrict a particular expensive rule
(like link steps for huge executables), or to restrict particular build
statements which you know perform poorly when run concurrently.

Each pool has a `depth` variable which is specified in the build file.
The pool is then referred to with the `pool` variable on either a rule
or a build statement.

No matter what pools you specify, ninja will never run more concurrent jobs
than the default parallelism, or the number of jobs specified on the command
line (with `-j`).

----------------
# No more than 4 links at a time.
pool link_pool
  depth = 4

# No more than 1 heavy object at a time.
pool heavy_object_pool
  depth = 1

rule link
  ...
  pool = link_pool

rule cc
  ...

# The link_pool is used here. Only 4 links will run concurrently.
build foo.exe: link input.obj

# A build statement can be exempted from its rule's pool by setting an
# empty pool. This effectively puts the build statement back into the default
# pool, which has infinite depth.
build other.exe: link input.obj
  pool =

# A build statement can specify a pool directly.
# Only one of these builds will run at a time.
build heavy_object1.obj: cc heavy_obj1.cc
  pool = heavy_object_pool
build heavy_object2.obj: cc heavy_obj2.cc
  pool = heavy_object_pool

----------------

The `console` pool
^^^^^^^^^^^^^^^^^^

_Available since Ninja 1.5._

There exists a pre-defined pool named `console` with a depth of 1. It has
the special property that any task in the pool has direct access to the
standard input, output and error streams provided to Ninja, which are
normally connected to the user's console (hence the name) but could be
redirected. This can be useful for interactive tasks or long-running tasks
which produce status updates on the console (such as test suites).

While a task in the `console` pool is running, Ninja's regular output (such
as progress status and output from concurrent tasks) is buffered until
it completes.

[[ref_ninja_file]]
Ninja file reference
--------------------

A file is a series of declarations.  A declaration can be one of:

1. A rule declaration, which begins with +rule _rulename_+, and
   then has a series of indented lines defining variables.

2. A build edge, which looks like +build _output1_ _output2_:
   _rulename_ _input1_ _input2_+. +
   Implicit dependencies may be tacked on the end with +|
   _dependency1_ _dependency2_+. +
   Order-only dependencies may be tacked on the end with +||
   _dependency1_ _dependency2_+.  (See <<ref_dependencies,the reference on
   dependency types>>.)
+
Implicit outputs _(available since Ninja 1.7)_ may be added before
the `:` with +| _output1_ _output2_+ and do not appear in `$out`.
(See <<ref_outputs,the reference on output types>>.)

3. Variable declarations, which look like +_variable_ = _value_+.

4. Default target statements, which look like +default _target1_ _target2_+.

5. References to more files, which look like +subninja _path_+ or
   +include _path_+.  The difference between these is explained below
   <<ref_scope,in the discussion about scoping>>.

6. A pool declaration, which looks like +pool _poolname_+. Pools are explained
   <<ref_pool, in the section on pools>>.

[[ref_lexer]]
Lexical syntax
~~~~~~~~~~~~~~

Ninja is mostly encoding agnostic, as long as the bytes Ninja cares
about (like slashes in paths) are ASCII.  This means e.g. UTF-8 or
ISO-8859-1 input files ought to work.

Comments begin with `#` and extend to the end of the line.

Newlines are significant.  Statements like `build foo bar` are a set
of space-separated tokens that end at the newline.  Newlines and
spaces within a token must be escaped.

There is only one escape character, `$`, and it has the following
behaviors:

`$` followed by a newline:: escape the newline (continue the current line
across a line break).

`$` followed by text:: a variable reference.

`${varname}`:: alternate syntax for `$varname`.

`$` followed by space:: a space.  (This is only necessary in lists of
paths, where a space would otherwise separate filenames.  See below.)

`$:` :: a colon.  (This is only necessary in `build` lines, where a colon
would otherwise terminate the list of outputs.)

`$$`:: a literal `$`.

A `build` or `default` statement is first parsed as a space-separated
list of filenames and then each name is expanded.  This means that
spaces within a variable will result in spaces in the expanded
filename.

----
spaced = foo bar
build $spaced/baz other$ file: ...
# The above build line has two outputs: "foo bar/baz" and "other file".
----

In a `name = value` statement, whitespace at the beginning of a value
is always stripped.  Whitespace at the beginning of a line after a
line continuation is also stripped.

----
two_words_with_one_space = foo $
    bar
one_word_with_no_space = foo$
    bar
----

Other whitespace is only significant if it's at the beginning of a
line.  If a line is indented more than the previous one, it's
considered part of its parent's scope; if it is indented less than the
previous one, it closes the previous scope.

[[ref_toplevel]]
Top-level variables
~~~~~~~~~~~~~~~~~~~

Two variables are significant when declared in the outermost file scope.

`builddir`:: a directory for some Ninja output files.  See <<ref_log,the
  discussion of the build log>>.  (You can also store other build output
  in this directory.)

`ninja_required_version`:: the minimum version of Ninja required to process
  the build correctly.  See <<ref_versioning,the discussion of versioning>>.


[[ref_rule]]
Rule variables
~~~~~~~~~~~~~~

A `rule` block contains a list of `key = value` declarations that
affect the processing of the rule.  Here is a full list of special
keys.

`command` (_required_):: the command line to run.  Each `rule` may
  have only one `command` declaration. See <<ref_rule_command,the next
  section>> for more details on quoting and executing multiple commands.

`depfile`:: path to an optional `Makefile` that contains extra
  _implicit dependencies_ (see <<ref_dependencies,the reference on
  dependency types>>).  This is explicitly to support C/C++ header
  dependencies; see <<ref_headers,the full discussion>>.

`deps`:: _(Available since Ninja 1.3.)_ if present, must be one of
  `gcc` or `msvc` to specify special dependency processing.  See
   <<ref_headers,the full discussion>>.  The generated database is
   stored as `.ninja_deps` in the `builddir`, see <<ref_toplevel,the
   discussion of `builddir`>>.

`msvc_deps_prefix`:: _(Available since Ninja 1.5.)_ defines the string
  which should be stripped from msvc's /showIncludes output. Only
  needed when `deps = msvc` and no English Visual Studio version is used.

`description`:: a short description of the command, used to pretty-print
  the command as it's running.  The `-v` flag controls whether to print
  the full command or its description; if a command fails, the full command
  line will always be printed before the command's output.

`dyndep`:: _(Available since Ninja 1.10.)_ Used only on build statements.
  If present, must name one of the build statement inputs.  Dynamically
  discovered dependency information will be loaded from the file.
  See the <<ref_dyndep,dynamic dependencies>> section for details.

`generator`:: if present, specifies that this rule is used to
  re-invoke the generator program.  Files built using `generator`
  rules are treated specially in two ways: firstly, they will not be
  rebuilt if the command line changes; and secondly, they are not
  cleaned by default.

`in`:: the space-separated list of files provided as inputs to the build line
  referencing this `rule`, shell-quoted if it appears in commands.  (`$in` is
  provided solely for convenience; if you need some subset or variant of this
  list of files, just construct a new variable with that list and use
  that instead.)

`in_newline`:: the same as `$in` except that multiple inputs are
  separated by newlines rather than spaces.  (For use with
  `$rspfile_content`; this works around a bug in the MSVC linker where
  it uses a fixed-size buffer for processing input.)

`out`:: the space-separated list of files provided as outputs to the build line
  referencing this `rule`, shell-quoted if it appears in commands.

`restat`:: if present, causes Ninja to re-stat the command's outputs
  after execution of the command.  Each output whose modification time
  the command did not change will be treated as though it had never
  needed to be built.  This may cause the output's reverse
  dependencies to be removed from the list of pending build actions.

`rspfile`, `rspfile_content`:: if present (both), Ninja will use a
  response file for the given command, i.e. write the selected string
  (`rspfile_content`) to the given file (`rspfile`) before calling the
  command and delete the file after successful execution of the
  command.
+
This is particularly useful on Windows OS, where the maximal length of
a command line is limited and response files must be used instead.
+
Use it like in the following example:
+
----
rule link
  command = link.exe /OUT$out [usual link flags here] @$out.rsp
  rspfile = $out.rsp
  rspfile_content = $in

build myapp.exe: link a.obj b.obj [possibly many other .obj files]
----

[[ref_rule_command]]
Interpretation of the `command` variable
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Fundamentally, command lines behave differently on Unixes and Windows.

On Unixes, commands are arrays of arguments.  The Ninja `command`
variable is passed directly to `sh -c`, which is then responsible for
interpreting that string into an argv array.  Therefore the quoting
rules are those of the shell, and you can use all the normal shell
operators, like `&&` to chain multiple commands, or `VAR=value cmd` to
set environment variables.

On Windows, commands are strings, so Ninja passes the `command` string
directly to `CreateProcess`.  (In the common case of simply executing
a compiler this means there is less overhead.)  Consequently the
quoting rules are deterimined by the called program, which on Windows
are usually provided by the C library.  If you need shell
interpretation of the command (such as the use of `&&` to chain
multiple commands), make the command execute the Windows shell by
prefixing the command with `cmd /c`. Ninja may error with "invalid parameter"
which usually indicates that the command line length has been exceeded.

[[ref_outputs]]
Build outputs
~~~~~~~~~~~~~

There are two types of build outputs which are subtly different.

1. _Explicit outputs_, as listed in a build line.  These are
   available as the `$out` variable in the rule.
+
This is the standard form of output to be used for e.g. the
object file of a compile command.

2. _Implicit outputs_, as listed in a build line with the syntax +|
   _out1_ _out2_+ + before the `:` of a build line _(available since
   Ninja 1.7)_.  The semantics are identical to explicit outputs,
  the only difference is that implicit outputs don't show up in the
  `$out` variable.
+
This is for expressing outputs that don't show up on the
command line of the command.

[[ref_dependencies]]
Build dependencies
~~~~~~~~~~~~~~~~~~

There are three types of build dependencies which are subtly different.

1. _Explicit dependencies_, as listed in a build line.  These are
   available as the `$in` variable in the rule.  Changes in these files
   cause the output to be rebuilt; if these file are missing and
   Ninja doesn't know how to build them, the build is aborted.
+
This is the standard form of dependency to be used e.g. for the
source file of a compile command.

2. _Implicit dependencies_, either as picked up from
   a `depfile` attribute on a rule or from the syntax +| _dep1_
   _dep2_+ on the end of a build line.  The semantics are identical to
   explicit dependencies, the only difference is that implicit dependencies
   don't show up in the `$in` variable.
+
This is for expressing dependencies that don't show up on the
command line of the command; for example, for a rule that runs a
script, the script itself should be an implicit dependency, as
changes to the script should cause the output to rebuild.
+
Note that dependencies as loaded through depfiles have slightly different
semantics, as described in the <<ref_rule,rule reference>>.

3. _Order-only dependencies_, expressed with the syntax +|| _dep1_
   _dep2_+ on the end of a build line.  When these are out of date, the
   output is not rebuilt until they are built, but changes in order-only
   dependencies alone do not cause the output to be rebuilt.
+
Order-only dependencies can be useful for bootstrapping dependencies
that are only discovered during build time: for example, to generate a
header file before starting a subsequent compilation step.  (Once the
header is used in compilation, a generated dependency file will then
express the implicit dependency.)

File paths are compared as is, which means that an absolute path and a
relative path, pointing to the same file, are considered different by Ninja.

Variable expansion
~~~~~~~~~~~~~~~~~~

Variables are expanded in paths (in a `build` or `default` statement)
and on the right side of a `name = value` statement.

When a `name = value` statement is evaluated, its right-hand side is
expanded immediately (according to the below scoping rules), and
from then on `$name` expands to the static string as the result of the
expansion.  It is never the case that you'll need to "double-escape" a
value to prevent it from getting expanded twice.

All variables are expanded immediately as they're encountered in parsing,
with one important exception: variables in `rule` blocks are expanded
when the rule is _used_, not when it is declared.  In the following
example, the `demo` rule prints "this is a demo of bar".

----
rule demo
  command = echo "this is a demo of $foo"

build out: demo
  foo = bar
----

[[ref_scope]]
Evaluation and scoping
~~~~~~~~~~~~~~~~~~~~~~

Top-level variable declarations are scoped to the file they occur in.

Rule declarations are also scoped to the file they occur in.
_(Available since Ninja 1.6)_

The `subninja` keyword, used to include another `.ninja` file,
introduces a new scope.  The included `subninja` file may use the
variables and rules from the parent file, and shadow their values for the file's
scope, but it won't affect values of the variables in the parent.

To include another `.ninja` file in the current scope, much like a C
`#include` statement, use `include` instead of `subninja`.

Variable declarations indented in a `build` block are scoped to the
`build` block.  The full lookup order for a variable expanded in a
`build` block (or the `rule` is uses) is:

1. Special built-in variables (`$in`, `$out`).

2. Build-level variables from the `build` block.

3. Rule-level variables from the `rule` block (i.e. `$command`).
   (Note from the above discussion on expansion that these are
   expanded "late", and may make use of in-scope bindings like `$in`.)

4. File-level variables from the file that the `build` line was in.

5. Variables from the file that included that file using the
   `subninja` keyword.

[[ref_dyndep]]
Dynamic Dependencies
--------------------

_Available since Ninja 1.10._

Some use cases require implicit dependency information to be dynamically
discovered from source file content _during the build_ in order to build
correctly on the first run (e.g. Fortran module dependencies).  This is
unlike <<ref_headers,header dependencies>> which are only needed on the
second run and later to rebuild correctly.  A build statement may have a
`dyndep` binding naming one of its inputs to specify that dynamic
dependency information must be loaded from the file.  For example:

----
build out: ... || foo
  dyndep = foo
build foo: ...
----

This specifies that file `foo` is a dyndep file.  Since it is an input,
the build statement for `out` can never be executed before `foo` is built.
As soon as `foo` is finished Ninja will read it to load dynamically
discovered dependency information for `out`.  This may include additional
implicit inputs and/or outputs.  Ninja will update the build graph
accordingly and the build will proceed as if the information was known
originally.

Dyndep file reference
~~~~~~~~~~~~~~~~~~~~~

Files specified by `dyndep` bindings use the same <<ref_lexer,lexical syntax>>
as <<ref_ninja_file,ninja build files>> and have the following layout.

1. A version number in the form `<major>[.<minor>][<suffix>]`:
+
----
ninja_dyndep_version = 1
----
+
Currently the version number must always be `1` or `1.0` but may have
an arbitrary suffix.

2. One or more build statements of the form:
+
----
build out | imp-outs... : dyndep | imp-ins...
----
+
Every statement must specify exactly one explicit output and must use
the rule name `dyndep`.  The `| imp-outs...` and `| imp-ins...` portions
are optional.

3. An optional `restat` <<ref_rule,variable binding>> on each build statement.

The build statements in a dyndep file must have a one-to-one correspondence
to build statements in the <<ref_ninja_file,ninja build file>> that name the
dyndep file in a `dyndep` binding.  No dyndep build statement may be omitted
and no extra build statements may be specified.

Dyndep Examples
~~~~~~~~~~~~~~~

Fortran Modules
^^^^^^^^^^^^^^^

Consider a Fortran source file `foo.f90` that provides a module
`foo.mod` (an implicit output of compilation) and another source file
`bar.f90` that uses the module (an implicit input of compilation).  This
implicit dependency must be discovered before we compile either source
in order to ensure that `bar.f90` never compiles before `foo.f90`, and
that `bar.f90` recompiles when `foo.mod` changes.  We can achieve this
as follows:

----
rule f95
  command = f95 -o $out -c $in
rule fscan
  command = fscan -o $out $in

build foobar.dd: fscan foo.f90 bar.f90

build foo.o: f95 foo.f90 || foobar.dd
  dyndep = foobar.dd
build bar.o: f95 bar.f90 || foobar.dd
  dyndep = foobar.dd
----

In this example the order-only dependencies ensure that `foobar.dd` is
generated before either source compiles.  The hypothetical `fscan` tool
scans the source files, assumes each will be compiled to a `.o` of the
same name, and writes `foobar.dd` with content such as:

----
ninja_dyndep_version = 1
build foo.o | foo.mod: dyndep
build bar.o: dyndep |  foo.mod
----

Ninja will load this file to add `foo.mod` as an implicit output of
`foo.o` and implicit input of `bar.o`.  This ensures that the Fortran
sources are always compiled in the proper order and recompiled when
needed.

Tarball Extraction
^^^^^^^^^^^^^^^^^^

Consider a tarball `foo.tar` that we want to extract.  The extraction time
can be recorded with a `foo.tar.stamp` file so that extraction repeats if
the tarball changes, but we also would like to re-extract if any of the
outputs is missing.  However, the list of outputs depends on the content
of the tarball and cannot be spelled out explicitly in the ninja build file.
We can achieve this as follows:

----
rule untar
  command = tar xf $in && touch $out
rule scantar
  command = scantar --stamp=$stamp --dd=$out $in
build foo.tar.dd: scantar foo.tar
  stamp = foo.tar.stamp
build foo.tar.stamp: untar foo.tar || foo.tar.dd
  dyndep = foo.tar.dd
----

In this example the order-only dependency ensures that `foo.tar.dd` is
built before the tarball extracts.  The hypothetical `scantar` tool
will read the tarball (e.g. via `tar tf`) and write `foo.tar.dd` with
content such as:

----
ninja_dyndep_version = 1
build foo.tar.stamp | file1.txt file2.txt : dyndep
  restat = 1
----

Ninja will load this file to add `file1.txt` and `file2.txt` as implicit
outputs of `foo.tar.stamp`, and to mark the build statement for `restat`.
On future builds, if any implicit output is missing the tarball will be
extracted again.  The `restat` binding tells Ninja to tolerate the fact
that the implicit outputs may not have modification times newer than
the tarball itself (avoiding re-extraction on every build).
