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
|
Adjusting build flags:
CFLAGS=-O3 ./configure
and rebuild.
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
"ninja chrome". I often do something like:
(for i in `seq 5`; do time -p ninja chrome) 2>&1 | grep real > old
(for i in `seq 5`; do time -p ninja-new chrome) 2>&1 | grep real > new
and then compare those two lists of timings either by eye or with R.
Coding guidelines:
- 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.
- Also follow this style:
http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml
Documentation 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)
Generating the manual:
sudo apt-get install asciidoc --no-install-recommends
./ninja manual
Windows development on Linux (this is kind of hacky right now):
- sudo apt-get install gcc-mingw32 wine
- export CC=i586-mingw32msvc-cc CXX=i586-mingw32msvc-c++ AR=i586-mingw32msvc-ar
- ./configure.py --platform=mingw
- Build gtest:
- unpack it into your source dir
- ./configure
- to work around missing _TlsAlloc I had to hack the libtool script to
append -lmingw32 -lkernel32 at the *end* of the link line
- Build ninja: /path/to/linux/ninja ninja
- Run: ./ninja (implicitly runs through wine(!))
Windows development on Windows:
- install mingw, msys, and python
- in the mingw shell, put Python in your path, and: sh bootstrap.sh
- to reconfigure, run 'python configure.py'
- remember to strip the resulting executable if size matters to you
- you'll need to rename ninja.exe into my-ninja.exe during development,
otherwise ninja won't be able to overwrite itself when building
Using clang:
- Enable colors manually:
CXX='/path/to/llvm/Release+Asserts/bin/clang++ -fcolor-diagnostics' ./configure.py
|