|
Ninja
|
As build commands run they can output extra dependency information (e.g. More...
#include <deps_log.h>
Classes | |
| struct | Deps |
Public Member Functions | |
| void | Close () |
| const std::vector< Deps * > & | deps () const |
| DepsLog () | |
| Deps * | GetDeps (Node *node) |
| Node * | GetFirstReverseDepsNode (Node *node) |
| LoadStatus | Load (const std::string &path, State *state, std::string *err) |
| const std::vector< Node * > & | nodes () const |
| Used for tests. More... | |
| bool | OpenForWrite (const std::string &path, std::string *err) |
| bool | Recompact (const std::string &path, std::string *err) |
| Rewrite the known log entries, throwing away old data. More... | |
| bool | RecordDeps (Node *node, TimeStamp mtime, const std::vector< Node * > &nodes) |
| bool | RecordDeps (Node *node, TimeStamp mtime, int node_count, Node *const *nodes) |
| ~DepsLog () | |
Static Public Member Functions | |
| static bool | IsDepsEntryLiveFor (const Node *node) |
| Returns if the deps entry for a node is still reachable from the manifest. More... | |
Private Member Functions | |
| bool | OpenForWriteIfNeeded () |
| Should be called before using file_. More... | |
| bool | RecordId (Node *node) |
| bool | UpdateDeps (int out_id, Deps *deps) |
Private Attributes | |
| std::vector< Deps * > | deps_ |
| Maps id -> deps of that id. More... | |
| FILE * | file_ |
| std::string | file_path_ |
| bool | needs_recompaction_ |
| std::vector< Node * > | nodes_ |
| Maps id -> Node. More... | |
Friends | |
| struct | DepsLogTest |
As build commands run they can output extra dependency information (e.g.
header dependencies for C source) dynamically. DepsLog collects that information at build time and uses it for subsequent builds.
The on-disk format is based on two primary design constraints:
Based on these stats, here's the current design. The file is structured as version header followed by a sequence of records. Each record is either a path string or a dependency list. Numbering the path strings in file order gives them dense integer ids. A dependency list maps an output id to a list of input ids.
Concretely, a record is: four bytes record length, high bit indicates record type (but max record sizes are capped at 512kB) path records contain the string name of the path, followed by up to 3 padding bytes to align on 4 byte boundaries, followed by the one's complement of the expected index of the record (to detect concurrent writes of multiple ninja processes to the log). dependency records are an array of 4-byte integers [output path id, output path mtime (lower 4 bytes), output path mtime (upper 4 bytes), input path id, input path id...] (The mtime is compared against the on-disk output path mtime to verify the stored data is up-to-date.) If two records reference the same output the latter one in the file wins, allowing updates to just be appended to the file. A separate repacking step can run occasionally to remove dead records.
Definition at line 68 of file deps_log.h.
|
inline |
Definition at line 69 of file deps_log.h.
| DepsLog::~DepsLog | ( | ) |
Definition at line 47 of file deps_log.cc.
| void DepsLog::Close | ( | ) |
Definition at line 147 of file deps_log.cc.
Referenced by Recompact(), TEST_F(), and MissingDependencyScannerTest::~MissingDependencyScannerTest().
|
inline |
Definition at line 105 of file deps_log.h.
References deps_.
| DepsLog::Deps * DepsLog::GetDeps | ( | Node * | node | ) |
Definition at line 305 of file deps_log.cc.
References Node::id().
Referenced by MissingDependencyScanner::ProcessNode().
Definition at line 313 of file deps_log.cc.
References DepsLog::Deps::node_count, and DepsLog::Deps::nodes.
|
static |
Returns if the deps entry for a node is still reachable from the manifest.
The deps log can contain deps entries for files that were built in the past but are no longer part of the manifest. This function returns if this is the case for a given node. This function is slow, don't call it from code that runs on every build.
Definition at line 379 of file deps_log.cc.
References Edge::GetBinding(), and Node::in_edge().
| LoadStatus DepsLog::Load | ( | const std::string & | path, |
| State * | state, | ||
| std::string * | err | ||
| ) |
Definition at line 154 of file deps_log.cc.
References State::GetNode(), Node::id(), kCurrentVersion, kFileSignature, kFileSignatureSize, kMaxRecordSize, LOAD_ERROR, LOAD_NOT_FOUND, LOAD_SUCCESS, METRIC_RECORD, DepsLog::Deps::nodes, platformAwareUnlink(), Node::set_id(), and Truncate().
Referenced by BuildTest::RebuildTarget(), and TEST_F().
|
inline |
| bool DepsLog::OpenForWrite | ( | const std::string & | path, |
| std::string * | err | ||
| ) |
Definition at line 51 of file deps_log.cc.
Referenced by MissingDependencyScannerTest::MissingDependencyScannerTest(), BuildTest::RebuildTarget(), Recompact(), and TEST_F().
|
private |
Should be called before using file_.
When false is returned, errno will be set.
Definition at line 434 of file deps_log.cc.
References kCurrentVersion, kFileSignature, kMaxRecordSize, and SetCloseOnExec().
| bool DepsLog::Recompact | ( | const std::string & | path, |
| std::string * | err | ||
| ) |
Rewrite the known log entries, throwing away old data.
Definition at line 326 of file deps_log.cc.
References Close(), deps_, METRIC_RECORD, DepsLog::Deps::mtime, DepsLog::Deps::node_count, DepsLog::Deps::nodes, nodes_, OpenForWrite(), platformAwareUnlink(), and RecordDeps().
Referenced by Builder::FinishCommand(), Recompact(), and MissingDependencyScannerTest::RecordDepsLogDep().
Definition at line 68 of file deps_log.cc.
References Node::id(), kMaxRecordSize, DepsLog::Deps::mtime, DepsLog::Deps::node_count, and DepsLog::Deps::nodes.
|
private |
Definition at line 400 of file deps_log.cc.
References kMaxRecordSize, Node::path(), and Node::set_id().
|
private |
Definition at line 389 of file deps_log.cc.
|
friend |
Definition at line 127 of file deps_log.h.
|
private |
Maps id -> deps of that id.
Definition at line 125 of file deps_log.h.
Referenced by deps(), and Recompact().
|
private |
Definition at line 119 of file deps_log.h.
|
private |
Definition at line 120 of file deps_log.h.
|
private |
Definition at line 118 of file deps_log.h.
|
private |