Skip to content

Commit

Permalink
v1.5.3
Browse files Browse the repository at this point in the history
  • Loading branch information
nico committed Nov 24, 2014
2 parents 85e13c1 + b532cab commit 3309498
Show file tree
Hide file tree
Showing 54 changed files with 1,634 additions and 833 deletions.
5 changes: 1 addition & 4 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,4 @@ language: cpp
compiler:
- gcc
- clang
before_install:
- sudo apt-get update -qq
- sudo apt-get install libgtest-dev
script: ./bootstrap.py && ./configure.py --with-gtest=/usr/src/gtest && ./ninja ninja_test && ./ninja_test --gtest_filter=-SubprocessTest.SetWithLots
script: ./configure.py --bootstrap && ./ninja ninja_test && ./ninja_test --gtest_filter=-SubprocessTest.SetWithLots && ./misc/ninja_syntax_test.py
35 changes: 9 additions & 26 deletions HACKING.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,6 @@ The primary build target of interest is `ninja`, but when hacking on
Ninja your changes should be testable so it's more useful to build
and run `ninja_test` when developing.

(`./bootstrap.py` creates a bootstrap `ninja` and runs the above
process; it's only necessary to run if you don't have a copy of
`ninja` to build with.)

### Adjusting build flags

Build in "debug" mode while developing (disables optimizations and builds
Expand Down Expand Up @@ -50,26 +46,6 @@ patch.

## Testing

### Installing gtest

The `ninja_test` binary, containing all the tests, depends on the
googletest (gtest) library.

* 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.py --with-gtest=/usr/src/gtest

* Otherwise you need to download it, unpack it, and pass
`--with-gtest` to `configure.py`. Get it from [its downloads
page](http://code.google.com/p/googletest/downloads/list); [this
direct download link might work
too](http://googletest.googlecode.com/files/gtest-1.6.0.zip).

### Test-driven development

Set your build command to
Expand Down Expand Up @@ -146,14 +122,15 @@ it's locked while in use.

* 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`
* In a Visual Studio command prompt: `python configure.py --bootstrap`

[Python for Windows]: http://www.python.org/getit/windows/

### 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`
* In the mingw shell, put Python in your path, and
`python configure.py --bootstrap`
* To reconfigure, run `python configure.py`
* Remember to strip the resulting executable if size matters to you

Expand All @@ -167,6 +144,12 @@ Setup on Ubuntu Precise:
* `sudo apt-get install gcc-mingw-w64-i686 g++-mingw-w64-i686 wine`
* `export CC=i686-w64-mingw32-gcc CXX=i686-w64-mingw32-g++ AR=i686-w64-mingw32-ar`

Setup on Arch:
* Uncomment the `[multilib]` section of `/etc/pacman.conf` and `sudo pacman -Sy`.
* `sudo pacman -S mingw-w64-gcc wine`
* `export CC=x86_64-w64-mingw32-cc CXX=x86_64-w64-mingw32-c++ AR=x86_64-w64-mingw32-ar`
* `export CFLAGS=-I/usr/x86_64-w64-mingw32/include`

Then run:
* `./configure.py --platform=mingw --host=linux`
* Build `ninja.exe` using a Linux ninja binary: `/path/to/linux/ninja`
Expand Down
14 changes: 9 additions & 5 deletions README
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,16 @@ See the manual -- http://martine.github.com/ninja/manual.html or
doc/manual.asciidoc included in the distribution -- for background
and more details.

To build, run ./bootstrap.py. It first blindly compiles all non-test
To build, run ./configure.py --bootstrap. It first compiles all non-test
source files together, then re-builds Ninja using itself. You should
end up with a 'ninja' binary in the source root. Run './ninja -h' for
help.
end up with a 'ninja' binary in the source root.

There is no installation step. The only file of interest to a user
is the resulting ninja binary.
Run './configure.py --help' for more configuration options.
Run './ninja -h' for Ninja help.

Installation is not necessary because the only required file is is the
resulting ninja binary. However, to enable features like Bash
completion and Emacs and Vim editing modes, some files in misc/ must be
copied to appropriate locations.

If you're interested in making changes to Ninja, read HACKING.md first.
151 changes: 4 additions & 147 deletions bootstrap.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,152 +15,9 @@

from __future__ import print_function

from optparse import OptionParser
import sys
import os
import glob
import errno
import shlex
import shutil
import subprocess
import platform_helper

os.chdir(os.path.dirname(os.path.abspath(__file__)))

parser = OptionParser()

parser.add_option('--verbose', action='store_true',
help='enable verbose build',)
parser.add_option('--x64', action='store_true',
help='force 64-bit build (Windows)',)
parser.add_option('--platform',
help='target platform (' +
'/'.join(platform_helper.platforms()) + ')',
choices=platform_helper.platforms())
parser.add_option('--force-pselect', action='store_true',
help='ppoll() is used by default where available, '
'but some platforms might need to use pselect instead',)
(options, conf_args) = parser.parse_args()


platform = platform_helper.Platform(options.platform)
conf_args.append("--platform=" + platform.platform())

def run(*args, **kwargs):
returncode = subprocess.call(*args, **kwargs)
if returncode != 0:
sys.exit(returncode)

# Compute system-specific CFLAGS/LDFLAGS as used in both in the below
# g++ call as well as in the later configure.py.
cflags = os.environ.get('CFLAGS', '').split()
ldflags = os.environ.get('LDFLAGS', '').split()
if platform.is_freebsd() or platform.is_openbsd() or platform.is_bitrig():
cflags.append('-I/usr/local/include')
ldflags.append('-L/usr/local/lib')

print('Building ninja manually...')

try:
os.mkdir('build')
except OSError:
e = sys.exc_info()[1]
if e.errno != errno.EEXIST:
raise

sources = []
for src in glob.glob('src/*.cc'):
if src.endswith('test.cc') or src.endswith('.in.cc'):
continue
if src.endswith('bench.cc'):
continue

filename = os.path.basename(src)
if filename == 'browse.cc': # Depends on generated header.
continue

if platform.is_windows():
if src.endswith('-posix.cc'):
continue
else:
if src.endswith('-win32.cc'):
continue

sources.append(src)

if platform.is_windows():
sources.append('src/getopt.c')

if platform.is_msvc():
cl = 'cl'
vcdir = os.environ.get('VCINSTALLDIR')
if vcdir:
if options.x64:
cl = os.path.join(vcdir, 'bin', 'x86_amd64', 'cl.exe')
if not os.path.exists(cl):
cl = os.path.join(vcdir, 'bin', 'amd64', 'cl.exe')
else:
cl = os.path.join(vcdir, 'bin', 'cl.exe')
args = [cl, '/nologo', '/EHsc', '/DNOMINMAX']
else:
args = shlex.split(os.environ.get('CXX', 'g++'))
cflags.extend(['-Wno-deprecated',
'-DNINJA_PYTHON="' + sys.executable + '"',
'-DNINJA_BOOTSTRAP'])
if platform.is_windows():
cflags.append('-D_WIN32_WINNT=0x0501')
if options.x64:
cflags.append('-m64')
if (platform.is_linux() or platform.is_openbsd() or platform.is_bitrig()) and \
not options.force_pselect:
cflags.append('-DUSE_PPOLL')
if options.force_pselect:
conf_args.append("--force-pselect")
args.extend(cflags)
args.extend(ldflags)
binary = 'ninja.bootstrap'
if platform.is_windows():
binary = 'ninja.bootstrap.exe'
args.extend(sources)
if platform.is_msvc():
args.extend(['/link', '/out:' + binary])
else:
args.extend(['-o', binary])

if options.verbose:
print(' '.join(args))

try:
run(args)
except:
print('Failure running:', args)
raise

verbose = []
if options.verbose:
verbose = ['-v']

if platform.is_windows():
print('Building ninja using itself...')
run([sys.executable, 'configure.py'] + conf_args)
run(['./' + binary] + verbose)

# Copy the new executable over the bootstrap one.
shutil.copyfile('ninja.exe', binary)

# Clean up.
for obj in glob.glob('*.obj'):
os.unlink(obj)

print("""
Done!
import sys

Note: to work around Windows file locking, where you can't rebuild an
in-use binary, to run ninja after making any changes to build ninja
itself you should run ninja.bootstrap instead.""")
else:
print('Building ninja using itself...')
run([sys.executable, 'configure.py'] + conf_args)
run(['./' + binary] + verbose)
os.unlink(binary)
print('Done!')
print('DEPRECATED: this script will be deleted.')
print('use "configure.py --bootstrap" instead.')
subprocess.check_call([sys.executable, 'configure.py', '--bootstrap'])
Loading

0 comments on commit 3309498

Please sign in to comment.