2 # Copyright 2011 Google Inc. All Rights Reserved.
4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at
8 # http://www.apache.org/licenses/LICENSE-2.0
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
16 from optparse import OptionParser
24 os.chdir(os.path.dirname(os.path.abspath(__file__)))
26 parser = OptionParser()
27 parser.add_option('--verbose', action='store_true',
28 help='enable verbose build',)
29 parser.add_option('--x64', action='store_true',
30 help='force 64-bit build (Windows)',)
31 (options, conf_args) = parser.parse_args()
33 def run(*args, **kwargs):
34 returncode = subprocess.call(*args, **kwargs)
38 # Compute system-specific CFLAGS/LDFLAGS as used in both in the below
39 # g++ call as well as in the later configure.py.
40 cflags = os.environ.get('CFLAGS', '').split()
41 ldflags = os.environ.get('LDFLAGS', '').split()
42 if sys.platform.startswith('freebsd'):
43 cflags.append('-I/usr/local/include')
44 ldflags.append('-L/usr/local/lib')
46 print 'Building ninja manually...'
51 if e.errno != errno.EEXIST:
55 for src in glob.glob('src/*.cc'):
56 if src.endswith('test.cc') or src.endswith('.in.cc'):
58 if src.endswith('bench.cc'):
61 filename = os.path.basename(src)
62 if filename == 'browse.cc': # Depends on generated header.
65 if sys.platform.startswith('win32'):
66 if src.endswith('-posix.cc'):
69 if src.endswith('-win32.cc'):
76 if sys.platform.startswith('win32'):
77 sources.append('src/getopt.c')
79 vcdir = os.environ.get('VCINSTALLDIR')
82 cl = [os.path.join(vcdir, 'bin', 'amd64', 'cl.exe')]
84 cl = [os.path.join(vcdir, 'bin', 'cl.exe')]
85 args = cl + ['/nologo', '/EHsc', '/DNOMINMAX']
87 args = shlex.split(os.environ.get('CXX', 'g++'))
88 cflags.extend(['-Wno-deprecated',
89 '-DNINJA_PYTHON="' + sys.executable + '"',
91 if sys.platform.startswith('win32'):
92 cflags.append('-D_WIN32_WINNT=0x0501')
97 binary = 'ninja.bootstrap'
98 if sys.platform.startswith('win32'):
99 binary = 'ninja.bootstrap.exe'
102 args.extend(['/link', '/out:' + binary])
104 args.extend(['-o', binary])
115 if sys.platform.startswith('win32'):
116 # Build ninja-msvc-helper using ninja without an msvc-helper.
117 print 'Building ninja-msvc-helper...'
118 run([sys.executable, 'configure.py', '--with-msvc-helper='] + conf_args)
119 run(['./' + binary] + verbose + ['ninja-msvc-helper'])
121 # Rename the helper to the same name + .bootstrap.
122 helper_binary = 'ninja-msvc-helper.bootstrap.exe'
124 os.unlink(helper_binary)
127 os.rename('ninja-msvc-helper.exe', helper_binary)
129 # Build ninja using the newly-built msvc-helper.
130 print 'Building ninja using itself...'
131 run([sys.executable, 'configure.py',
132 '--with-msvc-helper=%s' % helper_binary] + conf_args)
133 run(['./' + binary] + verbose)
136 for obj in glob.glob('*.obj'):
142 Note: to work around Windows file locking, where you can't rebuild an
143 in-use binary, to run ninja after making any changes to build ninja itself
144 you should run ninja.bootstrap instead. Your build is also configured to
145 use ninja-msvc-helper.bootstrap.exe instead of the ninja-msvc-helper.exe
146 that it builds; see the --help output of configure.py."""
148 print 'Building ninja using itself...'
149 run([sys.executable, 'configure.py'] + conf_args)
150 run(['./' + binary] + verbose)