Ninja
Main Page
Namespaces
Classes
Files
File List
File Members
deps_log.h
Go to the documentation of this file.
1
// Copyright 2012 Google Inc. All Rights Reserved.
2
//
3
// Licensed under the Apache License, Version 2.0 (the "License");
4
// you may not use this file except in compliance with the License.
5
// You may obtain a copy of the License at
6
//
7
// http://www.apache.org/licenses/LICENSE-2.0
8
//
9
// Unless required by applicable law or agreed to in writing, software
10
// distributed under the License is distributed on an "AS IS" BASIS,
11
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
// See the License for the specific language governing permissions and
13
// limitations under the License.
14
15
#ifndef NINJA_DEPS_LOG_H_
16
#define NINJA_DEPS_LOG_H_
17
18
#include <string>
19
#include <vector>
20
using namespace
std;
21
22
#include <stdio.h>
23
24
#include "
timestamp.h
"
25
26
struct
Node
;
27
struct
State
;
28
29
/// As build commands run they can output extra dependency information
30
/// (e.g. header dependencies for C source) dynamically. DepsLog collects
31
/// that information at build time and uses it for subsequent builds.
32
///
33
/// The on-disk format is based on two primary design constraints:
34
/// - it must be written to as a stream (during the build, which may be
35
/// interrupted);
36
/// - it can be read all at once on startup. (Alternative designs, where
37
/// it contains indexing information, were considered and discarded as
38
/// too complicated to implement; if the file is small than reading it
39
/// fully on startup is acceptable.)
40
/// Here are some stats from the Windows Chrome dependency files, to
41
/// help guide the design space. The total text in the files sums to
42
/// 90mb so some compression is warranted to keep load-time fast.
43
/// There's about 10k files worth of dependencies that reference about
44
/// 40k total paths totalling 2mb of unique strings.
45
///
46
/// Based on these stats, here's the current design.
47
/// The file is structured as version header followed by a sequence of records.
48
/// Each record is either a path string or a dependency list.
49
/// Numbering the path strings in file order gives them dense integer ids.
50
/// A dependency list maps an output id to a list of input ids.
51
///
52
/// Concretely, a record is:
53
/// two bytes record length, high bit indicates record type
54
/// (implies max record length 32k)
55
/// path records contain just the string name of the path
56
/// dependency records are an array of 4-byte integers
57
/// [output path id, output path mtime, input path id, input path id...]
58
/// (The mtime is compared against the on-disk output path mtime
59
/// to verify the stored data is up-to-date.)
60
/// If two records reference the same output the latter one in the file
61
/// wins, allowing updates to just be appended to the file. A separate
62
/// repacking step can run occasionally to remove dead records.
63
struct
DepsLog
{
64
DepsLog
() : needs_recompaction_(false), file_(NULL) {}
65
~
DepsLog
();
66
67
// Writing (build-time) interface.
68
bool
OpenForWrite(
const
string
& path,
string
* err);
69
bool
RecordDeps(
Node
* node,
TimeStamp
mtime,
const
vector<Node*>& nodes);
70
bool
RecordDeps(
Node
* node,
TimeStamp
mtime,
int
node_count,
Node
** nodes);
71
void
Close();
72
73
// Reading (startup-time) interface.
74
struct
Deps
{
75
Deps
(
int
mtime,
int
node_count)
76
: mtime(mtime), node_count(node_count), nodes(new
Node
*[node_count]) {}
77
~Deps
() {
delete
[] nodes; }
78
int
mtime
;
79
int
node_count
;
80
Node
**
nodes
;
81
};
82
bool
Load(
const
string
& path,
State
* state,
string
* err);
83
Deps
* GetDeps(
Node
* node);
84
85
/// Rewrite the known log entries, throwing away old data.
86
bool
Recompact(
const
string
& path,
string
* err);
87
88
/// Used for tests.
89
const
vector<Node*>&
nodes
()
const
{
return
nodes_; }
90
const
vector<Deps*>&
deps
()
const
{
return
deps_; }
91
92
private
:
93
// Updates the in-memory representation. Takes ownership of |deps|.
94
// Returns true if a prior deps record was deleted.
95
bool
UpdateDeps(
int
out_id, Deps* deps);
96
// Write a node name record, assigning it an id.
97
bool
RecordId(
Node
* node);
98
99
bool
needs_recompaction_
;
100
FILE*
file_
;
101
102
/// Maps id -> Node.
103
vector<Node*>
nodes_
;
104
/// Maps id -> deps of that id.
105
vector<Deps*>
deps_
;
106
107
friend
struct
DepsLogTest;
108
};
109
110
#endif // NINJA_DEPS_LOG_H_
Generated on Thu Jul 18 2013 20:51:41 for Ninja by
1.8.4