1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
### Adjusting build flags
CFLAGS=-O3 ./configure.py
### Testing
#### Installing gtest
* On older Ubuntus it'll install as libraries into `/usr/lib`:
apt-get install libgtest
* On newer Ubuntus it's only distributed as source
apt-get install libgtest-dev
./configure --with-gtest=/usr/src/gtest
* Otherwise you need to download it, unpack it, and pass --with-gtest
as appropriate.
#### Test-driven development
Set your build command to
./ninja ninja_test && ./ninja_test --gtest_filter=MyTest.Name
now you can repeatedly run that while developing until the tests pass.
Remember to build "all" before committing to verify the other source
still works!
### Testing performance impact of changes
If you have a Chrome build handy, it's a good test case.
Otherwise, https://github.com/martine/ninja/downloads has a copy of
the Chrome build files (and depfiles). You can untar that, then run
path/to/my/ninja chrome
and compare that against a baseline Ninja.
There's a script at `misc/measure.py` that repeatedly runs a command like
the above (to address variance) and summarizes its runtime. E.g.
path/to/misc/measure.py path/to/my/ninja chrome
For changing the depfile parser, you can also build `parser_perftest`
and run that directly on some representative input files.
## Coding guidelines
Generally it's the [Google C++ coding style][], but in brief:
* Function name are camelcase.
* Member methods are camelcase, expect for trivial getters which are
underscore separated.
* Local variables are underscore separated.
* Member variables are underscore separated and suffixed by an extra underscore.
* Two spaces indentation.
* Opening braces is at the end of line.
* Lines are 80 columns maximum.
* All source files should have the Google Inc. license header.
[Google C++ coding style]: http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml
## Documentation
### Style guidelines
* Use `///` for doxygen.
* Use `\a` to refer to arguments.
* It's not necessary to document each argument, especially when they're
relatively self-evident (e.g. in `CanonicalizePath(string* path, string* err)`,
the arguments are hopefully obvious)
### Building the manual
sudo apt-get install asciidoc --no-install-recommends
./ninja manual
## Building on Windows
While developing, it's helpful to copy `ninja.exe` to another name like
`n.exe`; otherwise, rebuilds will be unable to write `ninja.exe` because
it's locked while in use.
### Via Visual Studio
* Install Visual Studio (Express is fine), [Python for Windows][],
and (if making changes) googletest (see above instructions)
* In a Visual Studio command prompt: `python bootstrap.py`
[Python for Windows]: http://www.python.org/getit/windows/
### Via mingw on Linux (not well supported)
* `sudo apt-get install gcc-mingw32 wine`
* `export CC=i586-mingw32msvc-cc CXX=i586-mingw32msvc-c++ AR=i586-mingw32msvc-ar`
* `./configure.py --platform=mingw --host=linux`
* Build `ninja.exe` using a Linux ninja binary: `/path/to/linux/ninja`
* Run: `./ninja.exe` (implicitly runs through wine(!))
### Via mingw on Windows (not well supported)
* Install mingw, msys, and python
* In the mingw shell, put Python in your path, and: python bootstrap.py
* To reconfigure, run `python configure.py`
* Remember to strip the resulting executable if size matters to you
## Clang
To use clang, set `CXX`:
CXX=clang++ ./configure.py
|