Rewrite the bootstrap script in Python

This allows trouble-free builds on platforms with non-standard Python
executable names. As a bonus, it passes the arguments received on to
configure.py, so you don't have to reconfigure to build in a
non-standard manner.
This commit is contained in:
Elliott Hird 2011-12-15 14:52:22 +00:00
parent 121f36d59f
commit 075847031b
5 changed files with 76 additions and 57 deletions

View File

@ -1,5 +1,5 @@
Adjusting build flags:
CFLAGS=-O3 ./configure
CFLAGS=-O3 ./configure.py
and rebuild.
Test-driven development:
@ -56,7 +56,7 @@ Windows development on Linux (this is kind of hacky right now):
Windows development on Windows:
- install mingw, msys, and python
- in the mingw shell, put Python in your path, and: sh bootstrap.sh
- 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
- you'll need to rename ninja.exe into my-ninja.exe during development,

2
README
View File

@ -5,7 +5,7 @@ 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.sh. It first blindly compiles all non-test
To build, run ./bootstrap.py. It first blindly 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.

72
bootstrap.py Executable file
View File

@ -0,0 +1,72 @@
#!/usr/bin/env python
# Copyright 2011 Google Inc. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import re
import sys
import os
import glob
import errno
import subprocess
def run(*args, **kwargs):
try:
subprocess.check_call(*args, **kwargs)
except subprocess.CalledProcessError, e:
sys.exit(e.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', '')
ldflags = os.environ.get('LDFLAGS', '')
if sys.platform.startswith('freebsd'):
cflags += ' -I/usr/local/include'
ldflags += ' -L/usr/local/lib'
print 'Building ninja manually...'
try:
os.mkdir('build')
except OSError, e:
if e.errno != errno.EEXIST:
raise
with open('src/browse.py') as browse_py:
with open('build/browse_py.h', 'w') as browse_py_h:
run(['./src/inline.sh', 'kBrowsePy'],
stdin=browse_py, stdout=browse_py_h)
pattern = r'test\.cc$|\.in\.cc$'
if sys.platform.startswith('win32'):
pattern += r'|/browse\.cc$|/subprocess\.cc$'
else:
pattern += r'|-win32\.cc$'
sources = [src for src in glob.glob('src/*.cc') if not re.search(pattern, src)]
args = [os.environ.get('CXX', 'g++'), '-Wno-deprecated',
'-DNINJA_PYTHON="' + sys.executable + '"']
args.extend(cflags.split())
args.extend(ldflags.split())
args.extend(['-o', 'ninja.bootstrap'])
args.extend(sources)
run(args)
print 'Building ninja using itself...'
run([sys.executable, 'configure.py'] + sys.argv[1:])
run(['./ninja.bootstrap'])
os.unlink('ninja.bootstrap')
print 'Done!'

View File

@ -1,53 +0,0 @@
#!/bin/sh
# Copyright 2011 Google Inc. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
set -e
SYSTEMNAME=`uname -s`
# Compute system-specific CFLAGS/LDFLAGS as used in both in the below
# g++ call as well as in the later configure.py.
if [ "${SYSTEMNAME}" = "Linux" ]; then
export CFLAGS="${CFLAGS}"
export LDFLAGS="${LDFLAGS}"
elif [ "${SYSTEMNAME}" = "FreeBSD" ]; then
export CFLAGS="${CFLAGS} -I/usr/local/include"
export LDFLAGS="${LDFLAGS} -L/usr/local/lib"
fi
echo "Building ninja manually..."
mkdir -p build
./src/inline.sh kBrowsePy < src/browse.py > build/browse_py.h
pattern='test\.cc$\|\.in\.cc$'
case "$SYSTEMNAME" in
MINGW32*)
pattern="$pattern"'\|/browse\.cc$\|/subprocess\.cc$'
;;
*)
pattern="$pattern"'\|-win32\.cc$'
;;
esac
srcs=$(ls src/*.cc | grep -v "$pattern")
${CXX:-g++} -Wno-deprecated ${CFLAGS} ${LDFLAGS} -o ninja.bootstrap $srcs
echo "Building ninja using itself..."
python ./configure.py
./ninja.bootstrap
rm ninja.bootstrap
echo "Done!"

View File

@ -1,4 +1,4 @@
#!/usr/bin/python
#!/usr/bin/env python
#
# Copyright 2001 Google Inc. All Rights Reserved.
#